精华内容
下载资源
问答
  • C#中引入Redis时需要引用四个DLL ServiceStack.Common.dll ServiceStack.Interfaces.dll ServiceStack.Redis.dll ServiceStack.Text.dll
  • C#中引入Redis时需要引用四个DLL ServiceStack.Common.dll ServiceStack.Interfaces.dll ServiceStack.Redis.dll ServiceStack.Text.dll
  • 在unity工程中引入proto代码生成的dll方式使用protobuf的小demo。可以直接下包运行。
  • C# 大漠插件(无需注册引入dll)/C# 大漠插件(无需注册引入dll)C# 大漠插件(无需注册引入dll)C# 大漠插件(无需注册引入dll)
  • 修改PE文件引入表实现加载DLL

    千次阅读 2019-04-08 09:10:41
    文章目录内容简介DLL结构DLL的编译链接(VS命令行中)DLL的加载使用的DLL源代码PE文件关键结构MZ头NT映像头可选头部引入表IDT、INT、IAT关系代码实现思路关键数据结构节表IDT项验证结果 内容简介 编写Func.dll,并...

    内容简介

    1. 编写Func.dll,并编写一个EXE程序,该程序能够加载Func.dll,并调用Func.dll中的导出函数,在加载Func.dll的时候,会弹出计算器calc.exe。
    2. 使用PEview查看notepad.exe的结构,使用UltraEdit尝试手动修改notepad.exe并查看修改后程序能够运行;手动修改后,实现打开notepad.exe时加载Func.dll,从而弹出计算器(calc.exe)。
    3. 编程实现hack.exe上述过程,使得运行hack.exe不仅能够对notepad.exe进行修改,也能对一般的可执行文件进行修改,使得被修改后的可执行文件打开时加载Func.dll并弹出calc.exe。
      在这里插入图片描述

    DLL结构

      dll编写需要引用头文件<objbase.h>或者<windows.h>。一个dll需要包含一个类似exe中的main()函数一样的DllMain(),函数原型如下:

        BOOL WINAPI DllMain (
          _In_ HINSTANCE hinstDLL,    // handle to DLL module
          _In_ DWORD     fdwReason,   // reason for calling function
          _In_ LPVOID    lpvReserved   // reserved
        );
    

    ※ fdwReason是传入参数,该参数如下表3-1的四种值:
    在这里插入图片描述
    ※ 返回值:当系统使用DLL_PROCESS_ATTACH值调用DllMain函数时,如果成功则返回TRUE,如果初始化失败则返回FALSE。如果由于进程使用LoadLibrary函数而调用DllMain时返回值为FALSE,则LoadLibrary返回NULL。

    DLL的编译链接(VS命令行中)

    对于DLL的源代码文件Func.cpp:

    编译,得到Func.obj文件: cl /c Func.cpp
    链接,得到Func.dll文件: link /dll Func.obj
    查看dll导出函数: dumpbin -exports Func.dll

    DLL的加载

      对于dll文件,编写程序加载它,需要先使用LoadLibrary,如前所述,当返回值hinst非NULL时,说明加载dll成功。接着可以调用dll中的函数,需要使用GetProcAddress()函数获得导出函数的地址,返回值相当于一个函数指针,可以通过它进行函数调用。

    HINSTANCE hinst=::LoadLibrary("Func.dll");
    pfFuncInDll = (DLLWITHLIB)GetProcAddress(hinst, "FuncInDll");
    
    

    使用的DLL源代码

    #include <objbase.h>
    extern "C" __declspec(dllexport) void FuncInDll(void)//定义输出函数,序号将为0001
    {
       printf("%s","hello!\n");	//并没有调用该函数
    }
    BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved)
    {
        HANDLE g_hModule;
        switch(dwReason)
        {
    	case DLL_PROCESS_ATTACH:   /*加载DLL时会进入到这里*/
     	 /*可以在这里弹出计算器,创建新进程*/
           g_hModule = (HINSTANCE)hModule;
           break;
    
    	case DLL_PROCESS_DETACH:
    	/*可以在这里把计算器进程终止掉*/
           g_hModule=NULL;
           break;
        }
        return true;
    }
    
    

    PE文件关键结构

    MZ头

      MZ头开始的两个字节从低地址到高地址值为0x4D5A,在偏移0x3C处的4字节,是NT映像头的偏移值。在图3-2中,可以看到,notepad.exe的NT映像头的开始偏移是0xE0。
    在这里插入图片描述

    NT映像头

      NT映像头的起始4字节为50450000,表示这是一个PE文件。接着的0x14字节是NT文件头,这里面的重要数据结构如下表3-2所示:
    在这里插入图片描述

    可选头部

      Optional Header(可选头部中有很多重要信息),与本实验有关的是从可选头部偏移0x60处开始的,IMAGE_DATA_DIRECTORY(数据目录项),往往有16个这样数据目录项,每个目录项的形式如下所示:

    typedef struct _IMAGE_DATA_DIRECTORY {
        DWORD   VirtualAddress;//所在的起始RVA地址
        DWORD   Size;//实际占用的大小
    } IMAGE_DATA_DIRECTORY
    
    

      数据目录项中,第1个是关于引出表的,第2个是关于引入表的,实验中,需要修改的是关于引入表的部分。在下图3-3中,IMPORT table项的RVA指向的是IMPORT Directory Table,Size指的是IMPORT Directory Table的大小。实际上,下图中,还能看到BOUND IMPORT Table项不是全0,Binding Imports会让链接器使用绑定的信息,而不是调用GetProcAddress(),可以把该项置0。
    在这里插入图片描述

    引入表

      引入表由一个个引入条目项构成,每个项20个字节,引入表的结尾最后一项是一个20个字节的全0项。引入表的每个条目项的结构如下表3-3所示:
    在这里插入图片描述
      在文件中查看PE文件,INT表和IAT表中的内容是一样的,加载到内存之后,IAT表指向的是实际的内存中的地址。在文件中,INT表和IAT表的每项是4字节,是一个指针,指向一个Hint/Name Table,该表的结构如下表3-4所示。特别的,INT表和IAT表中每个dll的最后一项是4字节的0。
    在这里插入图片描述

    IDT、INT、IAT关系

      在文件中,三者之间的关系如下图3-4所示,INT和IAT指向的位置是相同的。而在内存中,二者指向的位置不同。
    在这里插入图片描述

    代码实现思路

    1. 从MZ头中0x3C处找到NT头开始位置,从NT头中获取节数目和可选头的大小(便于后面读取节表)。
    2. 读取可选头,获取引入表位置。
    3. 读取节表,获取所有节的起始RVA和在文件中偏移,这样可以对于每个节,计算二者之间的转换偏移delta,关注数据节.data/data的所在位置。
    4. 检查原引入表所在位置之后有没有足够的空余,如果有,不用修改引入表位置;否则在引入表之后搜索足够大的全0空间;如果引入表之后没有足够大的全0空间,转到数据节中寻找,如果数据节中也没有足够大的空间,报错。
    5. 找到足够大空间后,复制原引入表到该位置,并构造一个新的引入项,引入项的第1个成员,指向INT表的第一个项,INT表中的该项指向Hint/Name Table结构,该结构在实验中为01 00 Func.dll;INT表的第2个项是4字节的全0。第4个成员指向DLL的名字,这里是Func.dll。第5个成员指向IAT表,IAT表中的第1项指向的是上面的那个Hint/Name Table结构,第2项是4字节全0。
    6. 修改可选头中的引入表位置,并将大小加上20字节,保存运行。

    关键数据结构

    节表

    在这里插入图片描述

    IDT项

    在这里插入图片描述

    验证结果

      编译生成的hack.exe,用32位的notepad.exe进行测试。文件位置如下图4-1所示,在同一个目录下,notepad.exe是目标可执行文件,hack.cpp是代码,hack.exe是完成实验用的可执行程序:
    在这里插入图片描述
      在运行hack.exe前,notepad.exe的二进制结构可以用PEview打开查看,其有三个节,分别为.text节、.data节和.rsrc节,IDT表现在在.text节中,有bound IDT表,如下图4-2所示:
    在这里插入图片描述
      执行命令 hack.exe notepad.exe,效果如下图4-3所示,显示找到了一个空闲区域,位置在文件偏移为0x7DF4处,这里的RVA为0x91F4,IAT指针在RVA为0x92FC处,执行成功。
    在这里插入图片描述
      双击打开notepad.exe,效果如下图4-4所示,的确弹出了计算器calc.exe,关闭notepad.exe后,calc.exe随之关闭,说明编写的Func.dll正确地被加载了。
    在这里插入图片描述
      用PEview打开被修改了的notepad.exe,可以看到结构和之前不太一样,如图4-5所示,IDT表被放到了.data节中。
    在这里插入图片描述
      hack.exe具体更改的地方有可选头中的第2个目录项,改变前后的notepad.exe该项内容如下图4-6(a)和图4-6(b)所示,从原来的9项加1个空项,大小为200,改为220,位置从RVA=0x7604,改到了RVA=0x91F4:
    在这里插入图片描述
      新增的IDT项如下图4-7所示,新增的DLL名字叫Func.dll,INT表的RVA为0x92D0,IAT表的RVA为0x92FC,实际上它们的位置是相邻的:
    在这里插入图片描述
      在文件中,它们都放在相邻的一块区域中,文件中的内容如图4-8所示。新加的IDT项是紫色框出的,它后面接着20字节的0填充表示IDT结尾。INT pointer指向的是红色框框的INT表,对于自己编写的DLL,只有一个导出函数FuncInDll,所以后面紧跟的是4字节0,INT表第1项指向青色的Hint/Name Table结构,里面放着前2字节0x0001,后面接着DLL中的函数名,表示自己写的Func.dll的导出函数序号为1的函数是FuncInDll。蓝色的IAT pointer指向0x92FC,蓝色框框是IAT表,也只有1项,在文件中,它指向的位置和INT表中第1项指向的位置是相同的。IDT项的第4个成员Name RVA指向的RVA=0x92FF放着的是DLL的名字Func.dll。
    在这里插入图片描述
      用PEview查看INT表和IAT表中的变化,分别为图4-9(a)和图4-9(b)所示,图中最左边的是.text节的RVA。之所以显示的是0x8AD0而不是0x92D0,是因为把IDT表放在了.data节中,而INT表和IAT表在.text节中。.text节中RVA比文件偏移大0xC00,.data节中RVA比文件偏移大0x1400,0x8AD0-0xC00+0x1400=0x92D0。
    在这里插入图片描述

    参考网址

    [1]PE文件格式. https://docs.microsoft.com/en-us/windows/desktop/debug/pe-format
    [2]DLL入口点. https://docs.microsoft.com/en-us/windows/desktop/dlls/dynamic-link-library-entry-point-function
    [3]DLL编写教程. http://www.blogjava.net/wxb_nudt/archive/2007/09/11/144371.html
    [4] 流水账笔记:PE文件格式(导入表注入—手动). https://blog.csdn.net/liuhw4598/article/details/78245822

    源代码地址

    github:https://github.com/DXWEIE/software-security/tree/master/PE and dll

    PS

      之所以这么改,没有改可选头中IAT表大小什么的,是因为可选头中的IAT这一项其实是可以删掉的,对程序运行没什么影响…

    展开全文
  • C#中DLL引入顺序问题

    千次阅读 2008-03-20 20:47:00
    假设一个WinForm的解决方案中...其中A为窗体,B,C为类库,现在要求在B中引入C的dll,在A中引入B的dll,C. 在A中引入的B,C必须都从B中引入,比如说C这个dll,就必须从B中引入,否则程序移植到其它项目后就是无法启动。 
        假设一个WinForm的解决方案中有三个项目A,B,C.其中A为窗体,B,C为类库,现在要求在B中引入C的dll,在A中引入B的dll,C. 在A中引入的B,C必须都从B中引入,比如说C这个dll,就必须从B中引入,否则程序移植到其它项目后就是无法启动。
    
     
    展开全文
  • VS项目中引入dll的方法

    万次阅读 2017-02-05 12:36:58
    VS2012项目中引入dll的方法

    引入dll的方法:

    方法1:配置属性->调试->环境:输入path=包含dll文件的文件夹路径

    方法2:

    1)将dll文件拷贝到生成的.exe所在的文件夹中

    2)项目右键,添加引用,选择dll文件。

    我用的第二种。

    展开全文
  • Thinkphp 引入dll类步奏

    2017-07-13 17:44:53
    extension=...extension=你要引入dll名称 2.php/ext 把要用的dll文件放入你当前php版本的ext文件夹 3.在php文件中 $com= new \COM('word.application');//括号内是接口 echo $com; ...

    1. php.ini  
    
    extension=php_com_dotnet.dll  注释打开
    
    extension=你要引入的dll名称
    
    
    
    2.php/ext
    
    把要用的dll文件放入你当前php版本的ext文件夹
    
    
    
    3.在php文件中
    
    
    
     $com= new \COM('word.application');//括号内是接口
      echo $com;
         
    
    
    
    


    展开全文
  • 引入UnityEngine.dll中的巨坑

    千次阅读 2019-03-01 18:19:51
    此目录下只引用UnityEngine.dll就可以访问MonoBehaviour 其他路径:C:\Program Files\Unity\Editor\Data\Managed\UnityEngine 此路径是在已创建工程中寻找到我的路径,如只引用当前目录下的UnityEngine.dll...
  • qt引入VS2010编译的dll

    千次阅读 2015-05-14 20:40:16
    在qt中引入dll文件的时候,如果这个dll是qt编译的,直接把dll和lib文件拷到目录下,然后用#pragma comment(lib,"./xx.lib") 引入这个dll就可以用里面的函数了。 但是,这次我用vs2010编译了一个dll,用相同的办法...
  • VS中引入控件的dll

    2018-08-26 10:26:08
    浏览添加控件的dll 淘宝小店:给个关注
  • VC++ 配置: 引入外部DLL

    2016-08-01 14:45:05
    C/C++ 常规 附加包含目录: include 链接器 常规 附加库目录: lib 链接器 输入 附加依赖项: xxx.lib PS: ...以下顺序: 应用程序所在目录→当前目录→Windows SYSTEM目录→Windows目录...
  • 在java项目中引入dll文件

    千次阅读 2013-08-01 16:01:41
    1、项目——>右击——>import:   2、Next   3、选择dll文件所在的文件夹目录   4、选择要引入dll文件——>Finish——>引入成功!
  • 引入 opencv_java.dll文件项目中显示!

    千次阅读 2020-09-02 17:03:17
    首先因为dll文件和jar文件不同所以不同用jar文件的形式进行引入 最好在工程下创建一个文件夹libdll把所需要的dll文件放入文件夹 然后通过 这样就可以调用dll文件了
  • VS2012项目中引入dll的方法

    万次阅读 2014-08-10 22:00:23
    引入dll的fan 方法1:配置属性->调试->环境:输入path=包含dll文件的文件夹路径 方法2:将dll文件拷贝到生成的.exe所在的文件夹中
  • eclipse引入.dll动态链接库

    千次阅读 2017-10-17 10:39:53
  • K3 二次开发 常引入Dll文件

    千次阅读 2012-02-27 11:41:33
    1.K3ClassEvents.dll 对应 K3ClassEvents 2.Kfo10.dll 对应 Kingdee Foundation Objects 1.0 ...4.在VB中引入ADODB类型 解决方式如下: 在菜单project--refrences里,选中microsoft activex
  • 这个DLL其实是Oracle为C#专门提供的,在它的官方也可以下载到(不过找起来很麻烦)。 这里我就把这个方案和dll分享给大家。 点击这里下载 DEMO示例 using Oracle.ManagedDataAccess.Client; //引入命名空间 ...
  • vs2017引入dll动态库(c#)

    千次阅读 2018-11-07 21:21:42
    在做unity的读取excel中,拿IExcelDataReader类读取的过程中,需要加入三个库Excel.dll 和ICSharpCode.SharpZipLib.dll和System.Data.dll  其中ICSharpCode.SharpZipLib.dll和System.Data.dll 会自动添加链接,...
  • DLL引入表重定位 .reloc

    千次阅读 2009-03-27 18:48:00
    所能表示的最大偏移仅仅为0x1ffff,远远是不够用的,所以.reloc段通常是由多个偏移索引的子项组成的,每个子项只能负责0x1000范围内的偏移量,每个子项以0x1000来分段对齐,比如,要指出RVA为0x43569865处的数据重...
  • ![图片说明](https://img-ask.csdn.net/upload/201804/16/1523865896_560969.png)我C#里命名空间就是SysRunSet,但是在这里却调用不了这个命名空间,求助大佬
  • C#通过DllImport引入dll中的C++非托管类

    千次阅读 2018-04-21 14:17:38
    从以上语句我们可以理解出三点:1.C++编写的非托管dll可以通过DllImport引入到C#中;2.引入到C#中的只能是C++方法(或者说函数),而不能是数据(或者说变量);3.引入到C#中后只能声明为静态函数;msdn关于...
  • 把第三方DLL的源代码引入到项目中

    千次阅读 2013-09-21 16:18:04
    最近在维护一个项目的时候有这样一个问题,项目Solution A引用了第三方的DLL文件,而我现在需要使用DLL类库的一些工具类,但是又没有相关的文档,所以我就需要Debug到DLL中进行调试查看代码的逻辑。开始的时候我想...
  • 引入sqlite依赖dll出现以上错误:mono.data.sqlite.dll和system.data.dll 解决方法: 导入的dll和unity内部编译器的target版本应该有差异,网上分享的都是各自版本的dll,不一定适用,到unity目录下 \Editor(xxx...
  • RT ![图片说明](https://img-ask.csdn.net/upload/201704/05/1491360386_448005.png) 反编译看的云里雾里的 想调试跟着走走 可以么 求帮助 多谢

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 67,990
精华内容 27,196
关键字:

dll按需引入