标签: dll-injection

如何强烈命名非托管C++ DLL?

我正在使用一个C#应用程序,它使用EasyHook库进行DLL注入.EasyHook要求使用它的任何应用程序都有很强的名称.为了强烈命名应用程序,我需要确保我使用的所有库都具有强名称.

这对我的所有托管库都很容易,但我还有一个非托管的c ++库,我需要强烈命名.经过一些搜索,我似乎无法找到一种方法来签署我的非托管DLL,即使使用源代码也是如此.可以这样做,如果是这样,我还需要做什么?

感谢您的任何建议或帮助!

c# strongname unmanaged dll-injection

5
推荐指数
1
解决办法
2869
查看次数

使用非托管C++ .dll从C#.exe调用函数

所以,我有一个用C#编写的可执行文件,我没有它的源代码,但是我用IDA对它进行了反汇编,它给了我很多面向对象的程序集.

我做了注入一个.dll到另一个.exe文件.exe文件,我已经注入这个新的C++ DLL到C#.exe文件,没有问题,DllMain是因为所谓的等等...

但是当我将这个DLL注入到用C++创建的普通.exe文件中时,我可以使用其内存地址调用.exe中的函数,我可以在IDA上使用它.

问题是,面向对象的程序集在其功能上没有地址,即使函数名称被反汇编也是如此.

那么,有什么办法可以用我在C#.exe文件上注入的DLL来调用这个函数吗?

如果可能的话,有没有办法可以使用C#.exe文件中声明的命名空间及其所有函数和变量,甚至是私有的?

示例反汇编代码:

.namespace MyCSharpApp
{
.class public auto ansi Test extends [mscorlib]System.Object
{
  .field public value class [Microsoft.Xna.Framework]Microsoft.Xna.Framework.Vector2 pos

  .field public int32 foo
....
Run Code Online (Sandbox Code Playgroud)

c# c++ hook dll-injection

5
推荐指数
1
解决办法
1998
查看次数

简单的DLL注入无法使用AppInit_DLLs.DllMain()没有被调用

我写过最简单的注射dll.以下是完整的代码:

#include "stdafx.h"
#include <stdio.h>

BOOL APIENTRY DllMain(HANDLE hModule, 
                      DWORD  ul_reason_for_call, 
                      LPVOID lpReserved)
{
    FILE * File = fopen("D:\\test.txt", "w");
    if(File != NULL)
    {
        fclose(File);
    }
    return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

超级简单吧?好吧,我甚至无法让这个工作.此代码编译为dll,我已在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs]下的注册表中放置此dll的路径.我还应该提到LoadAppInit_DLLs注册表值设置为1.从这样做我希望看到文件"D:\ test.txt"出现在我启动其他应用程序(如notepad.exe)时,但事实并非如此.我不明白.还有另一个.dll,这是非常古老的,并且在visual studio '97中编写(我正在尝试替换),当我将AppInit_DLLs设置为指向它并启动任意应用程序时,该工作正常.我可以告诉它在启动其他应用程序时会加载.

我不知道这里发生了什么,但这不应该工作吗?它不能变得更简单.我正在使用VS 2010,据我所知,我已经创建了一个非常平面的Jane .dll所以我不认为任何项目设置应该是不合适的,但我不完全确定.我在这里错过了什么?


设置信息

  • 操作系统:Windows 7 64位
  • 操作系统版本:6.1.7601 Service Pack 1 Build 7601
  • IDE:Visual Studio 2010
  • IDE版本:10.0.40219.1 SP1Rel

dll dll-injection

4
推荐指数
1
解决办法
7128
查看次数

DLL注入的最佳实践?

假设我想将DLL注入到每250毫秒编辑一次地址A的进程中.我需要使用DllMain,对吧?问题是我不允许在DllMain内等待.所以我必须创建一个线程?或者这不绕过限制?我该怎么做呢?

此外,使用DLL注入使用EXE编辑应用程序的内存有什么好处?

另外,CreateThread中的堆栈大小应该是多少?如果它太小或太大怎么办?我怎么知道我需要多少钱?

c++ dll reverse-engineering memory-editing dll-injection

4
推荐指数
1
解决办法
1435
查看次数

Firefox pr_write 钩子。dll注入,windows钩子

问题是包含 PR_Write() 的 DLL 不是 npsr4.dll,而是 nss3.dll 和 hooks 无法从不存在的库中找到 GetProcAddress()。

我正在尝试创建 Firefox 钩子,它从 PR_Write() Firefox 方法(它位于 nspr4.dll 中)收集数据。我在谷歌上搜索了很多并尝试了很多方法来做到这一点,但不幸的是,当我注入钩子时,Firefox 崩溃了。

  • 首先,我尝试不使用DLL,使用这种方法http://redkiing.wordpress.com/2012/04/30/firefox-formgrabber-iii-code-injection/(文章开头的来源)Firefox crashed at CreateRemoteProcess()*

  • 我读到 CreateRemoteProcess() 由于安全问题在 Win7 上不起作用。我决定使用这种方法:http : //syprog.blogspot.com/2012/05/createremotethread-bypass-windows.html但它甚至没有加载我的 DLL。(来源在文章开头)

  • 然后我决定用 SetWindowsHookEx() 注入 DLL。DLL 工作,我使用测试 MessageBox 来检查(但我不确定我是否正确指定了 SetWindowsHookEx() 的最后一个参数)。

  • 我找到了带有 Firefox 示例的 Chrom 库(我不能发布超过 2 个链接,但谷歌:“chrom-lib”)。我将代码应用于我的 DLL,但是当我注入它时,Firefox 崩溃了。

我不太了解 ASM、堆栈和内存管理,也不知道出了什么问题以及如何解决。我只知道我应该使用 asm jump hook,但是怎么用呢?我需要一个现成的代码:/

也许有一种方法可以获取 pr_write() 地址,然后获取其调用堆栈(函数参数)并使用它们来调用我自己的函数?或者,也许我应该尝试使用“API Hooking with MS Detours”(同样,我无法发布链接:<)

我该怎么办?

编辑我发现我的电脑上没有 npsr4.dll。那么火狐如何在没有这个库的情况下构建 HTTP 请求呢?

当前 DLL 代码(基于 Chrom 的 VirtualProtect() 用法)

#define …
Run Code Online (Sandbox Code Playgroud)

c++ firefox hook dll-injection

4
推荐指数
1
解决办法
5848
查看次数

优雅的方法,在进程开始之前为进程注入一个dll

我正在制作一个修改目标进程行为的'mod'dll.我成功地注入了我的dll并挂了一些目标函数.

但是当我需要在主模块启动之前挂钩一些API(更清楚地,在入口点之前)时,需要做更多的工作.我需要使用CREATE_SUSPENDED属性手动启动目标程序,注入,然后恢复.但是一些应用程序从它自己的启动程序开始,有些应用程序通常从x64进程开始......这样的各种环境使其很难实现自动化.

似乎是最好的方法是为所有进程注入挂钩dll并处理CreateProcess.但有时它需要UAC,x64开发.

任何意见,将不胜感激.

windows winapi operating-system dll-injection

4
推荐指数
1
解决办法
4893
查看次数

如何在dll注入中调用特定函数?

以下代码将注入dll并将调用DllMain.我如何从DLL中调用特定函数,而不仅仅是DllMain?

    DWORD pid;
    HANDLE hd;
    LPVOID gp, rs, proc;

    gp = (LPVOID)GetProcAddress(GetModuleHandle(L"Kernel32.dll"), "LoadLibraryA");
    pid = 6096;

    hd = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);    


    rs = (LPVOID)VirtualAllocEx(hd, 0, sizeof(DLL_NAME), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

    if (!WriteProcessMemory(hd, (LPVOID)rs, DLL_NAME, strlen(DLL_NAME), 0))
    {
        printf("WriteProcessMemory %d", GetLastError());
    }

    if (!CreateRemoteThread(hd, 0, 0, (LPTHREAD_START_ROUTINE)gp, rs, 0, 0))
    {
        printf("CreateRemoteThread %d", GetLastError());
    }
Run Code Online (Sandbox Code Playgroud)

windows dll winapi code-injection dll-injection

4
推荐指数
1
解决办法
1004
查看次数

卸载注入的DLL

我有一个DLL我注入其他进程使用SetWindowsHookEx.在DLL内部,我通过调用增加模块的引用计数器,GetModuleHandleEx这样我可以控制何时卸载模块.

此时,这两个API调用的模块引用计数"应为"2.当调用进程关闭时,它会调用UnhookWindowsHookEx,将引用计数减少到1. DLL有一个等待一些东西的线程,其中一个是调用进程的句柄SetWindowsHookEx.当进程消失时,DLL会进行一些清理,终止所有线程,清理内存和句柄然后调用FreeLibraryAndExitThread.这会减少计数器并卸载DLL.

这是我的问题.有一些进程,尤其是没有UI的进程,DLL永远不会被卸载.我很自信我清理了一切.而且我知道我的线程都没有运行.

首先,如果您有任何疑难解答提示以帮助发现原因,那将会有所帮助.否则,我正在考虑使用一些API NtQueryInformationProcess来获取模块地址并确认模块句柄计数实际上为零,然后调用CreateRemoteThread注入一个调用来LdrUnloadDll从进程内卸载模块地址.你对这种方法有什么看法?有没有人有任何示例代码?我很难找到如何获得模块句柄计数.

c++ dll-injection setwindowshookex unhookwindowshookex

4
推荐指数
2
解决办法
2789
查看次数

非静态字段、方法或属性需要对象引用

using System;
using System.Diagnostics;
using System.Reflection.Emit;
using System.Threading;
using EasyExploits;

namespace ConsoleApp1
{
    class Program
    {
        EasyExploits.Module module = new EasyExploits.Module();

        static void Main(string[] args)
        {
            Module.LaunchExploit();
            Console.ForegroundColor = ConsoleColor.Green;
            Label:
            Console.WriteLine("Please Type 'Inject'");
            string proccess1 = Console.ReadLine();
            if (proccess1 == "Inject")
            {
                Console.WriteLine("");
                Console.WriteLine("Injected!");
                goto Begin;
            }
            else
            {
                goto Label;
            }
            Begin:
            Console.WriteLine("");
            Console.WriteLine("Enter a script and press enter to execute it.");
            string answer = Console.ReadLine();
            Module.ExecuteScript(answer);
            goto Begin





        }
    }
}

Run Code Online (Sandbox Code Playgroud)

因此,我尝试寻找解决这个问题的方法,但找不到解决方案,所以我来到了堆栈溢出。无论如何,我的控制台应用程序应该在将脚本粘贴到输入时注入 EasyExploits.DLL 并执行 Lua 脚本。但是,我收到错误消息“非静态字段、方法或属性‘Module.LaunchExploit()’需要对象引用” …

c# console-application dll-injection

4
推荐指数
1
解决办法
2万
查看次数

C# - 动态加载 DLL - System.Reflection.ReflectionTypeLoadException:无法加载一种或多种请求的类型

在 C# 中,当尝试获取类型时,使用下面的代码从文件夹加载 DLL,获取下面的堆栈跟踪。

var assembly = Assembly.LoadFile(assemblyInfo.FullName); // assembly loads perfectly using the absolute path.
var types = assembly.GetTypes(); // this line throws the below stacktrace.
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
   at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
   at System.Reflection.Assembly.GetTypes()
Run Code Online (Sandbox Code Playgroud)

我还检查了现有的解决方案:错误消息“无法加载一种或多种请求的类型”。检索 LoaderExceptions 属性以获取更多信息。,在 C# 中运行时加载 DLL(不起作用)

c# dll dllimport dll-injection dynamic-dll-import

3
推荐指数
1
解决办法
1万
查看次数