C++ 如何从DLL二进制文件中删除函数

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文件。 有什么工具或方法可以做到这一点 更新 我需要删除一

我有一个没有源代码的已编译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文件。

有什么工具或方法可以做到这一点

更新

我需要删除一些函数,因为有几个要求:

  • 新的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大小必须减小->因为较小的大小会降低认证成本。