C++ 如何从DLL二进制文件中删除函数
我有一个没有源代码的已编译dll文件(dll二进制)。我必须从这个dll中删除一些函数。Dll是用C++编写的。p> 例如,我有Math.dll,它包含3个函数:C++ 如何从DLL二进制文件中删除函数,c++,dll,binary,decompiling,disassembly,C++,Dll,Binary,Decompiling,Disassembly,我有一个没有源代码的已编译dll文件(dll二进制)。我必须从这个dll中删除一些函数。Dll是用C++编写的。p> 例如,我有Math.dll,它包含3个函数: int Func1(int x); int Func2(int x, int y); double Func3(double x, double y); 我需要使用一个函数获取新的dll文件: int Func1(int x); 我只有Math.dll—一个二进制dll文件。 有什么工具或方法可以做到这一点 更新 我需要删除一
int Func1(int x);
int Func2(int x, int y);
double Func3(double x, double y);
我需要使用一个函数获取新的dll文件:
int Func1(int x);
我只有Math.dll—一个二进制dll文件。
有什么工具或方法可以做到这一点
更新
我需要删除一些函数,因为有几个要求:
- 新的dll只包含我的应用程序需要的函数
- 必须减小新的dll大小
- 要删除的函数也可能由DLL内部使用。由于您没有源代码,因此必须反汇编整个DLL来检查这一点
一旦分析了反汇编,删除未使用的部件、组装其余部件并将其放入DLL中应该是一个相当简单的过程。但老实说,在任何合理的情况下,这都不会有帮助。“新的dll大小必须减少”在本世纪不是一个可信的说法。尺寸只对深层嵌入式系统重要,而这些系统不运行Windows 朋友们,这是一个适合我的解决方案 解决方案
第一步。在中创建新的DLL项目,例如在Visual Studio中
第二步。反汇编DLL二进制文件(工具OllyDbg、IDA Pro)
第三步。在新DLL项目中,创建与原始函数同名的新函数。将函数汇编程序代码(从步骤2)作为内联汇编指令复制到新函数
第四步。对新DLL必须包含的每个函数重复步骤3
第五步。构建动态链接库 示例 第二步。Asm代码
?Func1@@YAHH@Z proc near ;GetSquaredNumber
arg_0= dword ptr 8
push ebp
mov ebp, esp
mov eax, [ebp+arg_0]
imul eax, eax
pop ebp
retn
?Func1@@YAHH@Z endp
第三步。新的DLL C++代码< /P>
__declspec(dllexport) int Func1(int x) // GetSquaredNumber
{
int y_res = 0;
__asm
{
mov eax, [x]
push ebp
mov ebp, esp
imul eax, eax
pop ebp
mov [y_res], eax
}
return y_res;
}
第五步。建设项目结果:新的dll只包含我的应用程序需要的函数,新的dll大小减小。为什么必须删除这些函数?好的,您可以更改标头,使其不再从客户端代码中可见。但是按照您要求的方式更改二进制文件是不可能的。我已经更新了我的问题。使用asm和低级编程是可能的,但我正在寻找更简单的“高级”解决方案。常见的过程是从源代码重建DLL。DLL是一个常规的可执行文件,因此它包含头、代码、数据和重定位,从中间删除一部分将不起作用。您可能会将其与库文件混淆。我认为您无法删除DLL中的函数。你能做的就是导入你需要的函数。没有库文件。我只有二进制的.dll文件。这有一些原因:1)新的dll只包含我的应用程序需要的函数->因为我必须证明dll中没有恶意软件。2) 新的dll大小必须减小->因为较小的大小会降低认证成本。