替换反编译DLL中的函数
Replacing a function in a decompiled DLL
我已经反编译了一个dll,我想用调用我创建的自定义函数来代替对dll中函数的调用(具有相同的签名)。
我已经设法找到在汇编中调用函数的位置。有人能解释一下我现在需要做什么吗?
我的自定义函数可以位于一个单独的dll或它需要被包含在同一个dll?
如何用新的函数调用替换函数调用?
谢谢
修补可执行模块可能更容易。将新代码添加到文本段的末尾,并将添加的代码跳转到旧函数的开头。这样,您就不必处理DLL的反编译版本可能导致的问题。
例如,下面是要替换的现有函数的开头:
000D0880 push ebp
000D0881 mov ebp,esp
000D0883 sub esp,0E0h
000D0889 push ebx
000D088A push esi
000D088B push edi
000D088C lea edi,[ebp-0E0h]
000D0892 mov ecx,38h
000D0897 mov eax,0CCCCCCCCh
要重定向调用,只需在D0880添加一个JMP指令。我们在跳转之后添加NOP指令,只是为了在调试会话期间使反汇编的输出更清晰。这不是必须的,但它确实有用。
000D0880 jmp NewFunction
000D0885 nop
000D0886 nop
000D0887 nop
000D0888 nop
000D0889 push ebx
000D088A push esi
000D088B push edi
现在您将新代码附加到文本段的末尾,并根据加载段的偏移量计算地址。这使得调试和管理更容易,因为您事先确切地知道您的函数实际驻留在文本段中的哪个位置。
也可以从另一个进程内可执行模块调用函数。因为你已经知道了原始函数和下一个函数的偏移量,你可以根据模块的加载地址计算出它们的确切位置。
typedef void (*EXTPROC)(int a, int b);
// Windows loads the dll at 0xC0000
HMODULE hMod = LoadLibrary("some.dll");
// The function is at offset 0x10880 (from start of text segment)
EXTPROC proc = CalculateAddress(hMod, 0x00010880);
// Call proc at 0xd0880
proc(0, 1);
函数CalculateAddress
获取DLL的基址,计算函数的实际地址并返回指向它的指针。结果与前面的示例相同——0xD0880。既然有了地址,就可以通过函数指针调用它了。您可以应用相同的技术来调用您正在添加的新函数,因为您也知道该函数的偏移量。
如果您想要做更多的工作,您甚至可以更新导出表,使用指向这些偏移量的新条目,并使用GetProcAddress
来检索地址,而不必自己计算它。这给打补丁的过程增加了一点复杂性,因为你必须更新DLL中的额外部分。
调用存在于不同DLL中的函数有点复杂,因为您需要对原始函数进行运行时补丁以使其调用外部函数的地址。为此,我建议参考Rich提出的建议,并按照本文所述创建一个代理DLL。
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- C++ DLL 引用C++.exe中的函数和类
- 如何使用导出的函数交叉编译 DLL
- 如何在窗口中使用注入的 dll 中的参数调用函数
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 加载由 MATLAB Coder 生成的带有函数的 DLL,该函数调用外部函数
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 从DLL导出函数,LoadLibrary()需要用TEXT转换的字符串才能编译而不会出错
- 从 C#-DLL 调用函数的 C++ 失败
- 如何在 DLL 内的成员函数中使用互斥/关键节
- 调用 "project" 函数和调用 DLL 函数之间的区别
- 函数指针分配在创建 DLL 后导致错误
- 从动态加载的 dll 内部调用C++函数
- 函数声明中的 WINAPI 标识符C++ DLL 入口点函数中的标识符
- LNK2019某些类函数,但不在其他类函数(DLL 中的模板类)上
- 从库导入函数./ DLL 文件
- 从 ntdll 调用 Nt 函数.dll在 Win32 环境中,C++
- 如何使用ctypes将python列表传递给C函数(dll)