2014-12-31 51 views
0

我有一个没有源代码的编译后的dll文件(dll二进制文件)。我必须从这个DLL删除一些功能。 Dll是用C++编写的。如何从DLL二进制文件中删除函数

例如,我有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文件。

任何工具或任何方法来做到这一点?

更新

我需要删除的,因为几个要求一些功能:

  • 新的DLL只包含功能我的应用程序需要
  • 新的DLL大小必须降低
+0

为什么你必须删除这些功能?那么,您可以更改标题,以免从客户端代码中看到它们。但以你要求的方式改变二进制文件是不可能的。 –

+0

我已更新我的问题。可以使用asm和低级编程,但我正在寻找更简单和“高级”解决方案。 –

+0

常见的过程是从源代码重建DLL。 DLL是一个常规的可执行文件,因此它包含标题,代码,数据和重定位,并且从中间删除一部分将不起作用。您可能会将其与* library *文件混淆。 – usr2564301

回答

2

朋友们,这里的解决方案适合我。

解决方案
第1步。创建新的DLL项目,例如,在Visual Studio中
步骤2.反汇编DLL二进制文件(工具OllyDbg,IDA Pro)
第3步。在新的DLL项目中创建与原函数同名的新函数。复印功能汇编代码(来自步骤2),以新的功能内联汇编指令
步骤4.重复步骤3对每个功能新的DLL必须包含
步骤5.生成DLL

步骤2. ASM代码

[email protected]@[email protected] proc near ;GetSquaredNumber 

arg_0= dword ptr 8 

push ebp 
mov  ebp, esp 
mov  eax, [ebp+arg_0] 
imul eax, eax 
pop  ebp 
retn 
[email protected]@[email protected] endp 

步骤3.新的DLL C++代码

__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; 
} 

第5步。建立项目!
结果:新的DLL包含我的应用程序需要的功能和新的DLL大小减少。

1

您要想要删除的功能也可能是b e由DLL在内部使用。由于你没有源代码,你将不得不反汇编整个DLL来检查它。

一旦你进行了分析反汇编,它应该是一个相当简单的过程,以删除未使用的部分,汇编其余部分,并将其放入DLL中。但是,诚实地说,没有合理的情况可以帮助。 “新的dll大小必须减少”在本世纪不是一个可信的陈述。大小只对深层嵌入式系统很重要,而那些不运行Windows。

+0

有一些原因:1)新的dll包含我的应用程序需要的功能 - >因为我必须证明dll中没有恶意软件。 2)新的DLL大小必须减少 - >因为体积小可以降低认证成本。 –

相关问题