通过导出表隐性加载DLL?导出表?加载DLL?还隐性?是的。如果觉得不可思议,可以先看《PE文件和COFF文件格式分析——导出表》中关于“导出地址表”的详细介绍。(转载请指明出于breaksoftware的csdn博客)

这儿再废话几句,导出地址表,可能保存两种信息:

1 保存的函数入口的RVA

2 保存的是指向函数真正实现的所在的DLL名和函数名字符串组合(NTDLL.RtlAddVectoredExceptionHandler)

一般情况下,我们遇到的是1这种情况。这种场景没什么好说的。我也想不到这个有什么好利用的,那么2又如何可以被利用呢?

Exe调用一个DLL中的方法,有两种方法:

1 在Exe导入表中加入DLL中函数信息,例如我们程序中调用GetProcAddress这类的API就是因为我们程序默认的导入表中包含了Kernel32.dll导出函数GetProcAddress信息。

2 在逻辑中通过LoadLibrary动态载入一个DLL,然后通过GetProcAddress获取函数地址。这样我们在Exe的导入表中是看不到这个DLL的信息的。

那么我是怎么设计”通过导出表隐性加载DLL“方案的呢?

我设计了三个文件:DllBase.dll是我们要隐性加载的DLL;DllTop.dll是我们将要修改的DLL文件,MainExe.exe直接加载这个DLL,从而实现隐性加载DllBase.dll并调用它的导出函数。

DllBase导出两个函数

LIBRARY  "DllBase"
EXPORTSRet1Ret2

这两个函数的实现更简单

int Ret1() {return 1;
}int Ret2() {return 2;
}

DllTop导出三个函数

LIBRARY  "DllTop"
EXPORTSRet0Occupying001Occupying002

其实现是

int Ret0(){return 0;
};void Occupying001(){return;
}void Occupying002(){return;
}

注意Occupying001和Occupying002这两个函数,他们的返回类型是void。

注意上图和代码,可以发现DllTop.dll和DllBase.dll不存在任何关系。

现在我们要对DllTop.dll文件动手术,我会分别将Occupying001和Occupying002的导出地址指向DllBase.dll中的Ret1和Ret2。我保留TopDll.dll的一个副本为DllTop_Real.dll。具体的修改请看下图

修改后,我们将其命名为TopDll_Modify.dll。

新修改的DLL文件,我们用View Denpendencies查看下

可以看到修改后的DLL并没有使DllBase.dll出现在导入表中,我们还是好好的隐藏着。

为了做出结果比较,我将在MainExe中分别对DllTop_Real.dll和DllTop_Modify.dll进行加载并调用其函数。

typedef int (WINAPI *PRetN)();void TopDll( LPCSTR lpFileName ){PRetN pRet0 = NULL;PRetN pRet1 = NULL;PRetN pRet2 = NULL;HMODULE hDllTop = NULL;hDllTop = LoadLibraryA( lpFileName );if ( NULL != hDllTop ) {pRet0 = (PRetN)GetProcAddress( hDllTop, "Ret0" );if ( NULL != pRet0 ) {printf("DllTop Ret0:%d\n", pRet0());}pRet1 = (PRetN)GetProcAddress( hDllTop, "Occupying001" );if ( NULL != pRet1 ) {printf("DllTop Occupying001:%d\n", pRet1());}pRet2 = (PRetN)GetProcAddress( hDllTop, "Occupying002" );if ( NULL != pRet2 ) {printf("DllTop Occupying002:%d\n", pRet2());}FreeLibrary( hDllTop);hDllTop = NULL;}
}void BaseDll( LPCSTR lpFileName ) {PRetN pRet0 = NULL;PRetN pRet1 = NULL;PRetN pRet2 = NULL;HMODULE hDllBase = NULL;hDllBase = LoadLibraryA( lpFileName );if ( NULL != hDllBase ) {pRet1 = (PRetN)GetProcAddress( hDllBase, "Ret1" );if ( NULL != pRet1 ) {printf("DllBase Ret1:%d\n", pRet1());}pRet2 = (PRetN)GetProcAddress( hDllBase, "Ret2" );if ( NULL != pRet2 ) {printf("DllBase Ret2:%d\n", pRet2());}FreeLibrary( hDllBase);hDllBase = NULL;}
}int _tmain(int argc, _TCHAR* argv[])
{TopDll( "DllTop_Real.dll" );TopDll( "DllTop_Modify.dll" );BaseDll( "DllBase.dll" );system("pause");return 0;
}

其运行结果是


        看!我们调用DllTop_Real.dll中函数时,由于Occupying001和Occupying002都是无返回值的,所以返回的结果是乱乱的数据。 我们调用DllTop_Modify.dll中函数时,Occupying001和Occupying002分别返回了1和2,这两个结果是DllBase.dll中Ret1和Ret2的执行结果!这样我们就是实现了通过导出表隐性加载DLL的方法。是不是很有意思?附上工程地址

最后我们看下3个DLL在内存中存在的情况

1

2

3

PE文件和COFF文件格式分析——导出表的应用——通过导出表隐性加载DLL相关推荐

  1. PE文件和COFF文件格式分析——导出表的应用——一种摘掉Inline钩子(Unhook)的方法

    在日常应用中,某些程序往往会被第三方程序下钩子(hook).如果被下钩子的进程是我们的进程,并且第三方钩子严重影响了我们的逻辑和流程,我们就需要把这些钩子摘掉(Unhook).本件讲述一种在32位系统 ...

  2. PE文件和COFF文件格式分析——导出表的应用——一种插件模型

    可能在很多人想想中,只有DLL才有导出表,而Exe不应该有导出表.而在<PE文件和COFF文件格式分析--导出表>中,我却避开了这个话题.我就是想在本文中讨论下载Exe中存在导出表的场景. ...

  3. PE文件和COFF文件格式分析——导出表

    在之前的<PE可选文件头>相关博文中我们介绍了可选文件头中很多重要的属性,而其中一个非常重要的属性是(转载请指明来源于breaksoftware的CSDN博客) IMAGE_DATA_DI ...

  4. PE文件和COFF文件格式分析——RVA和RA相互计算

    之前几节一直是理论性质的东西非常多.本文将会讲到利用之前的知识得出一个一个非常有用的一个应用.(转载请指明来源于breaksoftware的csdn博客) 首先我们说下磁盘上A.exe文件和正在内存中 ...

  5. PE文件和COFF文件格式分析——节信息

    在<PE文件和COFF文件格式分析--签名.COFF文件头和可选文件头3>中,我们看到一些区块的信息都有偏移指向.而我们本文讨论的节信息是没有任何偏移指向的,所以它是紧跟在可选文件头后面的 ...

  6. PE文件和COFF文件格式分析--概述

    刚工作的时候,我听说某某大牛在做病毒分析时,只是用notepad打开病毒文件,就能大致猜到病毒的工作原理.当时我是佩服的很啊,同时我也在心中埋下了一个种子:我也得有这天.随着后来的工作进行,一些任务的 ...

  7. PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头1

    本文将讨论PE文件中非常重要的一部分信息.(转载请指明来源于breakSoftware的CSDN博客) 首先说一下VC中对应的数据结构."签名.COFF文件头和可选文件头"这三部分 ...

  8. PE文件和COFF文件格式分析--MS-DOS 2.0兼容Exe文件段

    MS 2.0节是PE文件格式中第一个"节".其大致结构如下:(转载请指明来源于breaksoftware的csdn博客) 在VC\PlatformSDK\Include\WinNT ...

  9. PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头3

    <PE2>中介绍了一些可选文件头中重要的属性,为了全面起见,本文将会讲解那些不是那么重要的属性.虽然不重要,但是还是可以发现很多好玩的情况.首先看一下32位的可选文件头详细定义.(转载请指 ...

最新文章

  1. Java Properties 类
  2. web.xml初始化spring容器
  3. java双引号的转义字符_JAVA中转义字符
  4. java英文版怎么汉化_请问,java中,将下面的英文名字变为中文 该怎样输出?
  5. mysql交互式查询_客户机程序5―MYSQL交互式查询程序[图]_MySQL
  6. win10 当前操作环境不支持支付宝控件 完美解决办法
  7. The GenerateResource task failed unexpectedly. a generic error occured in GDI+
  8. MapReduce 的架构
  9. JVM学习(1)——通过实例总结Java虚拟机的运行机制
  10. 2021-08-3126. 删除有序数组中的重复项 数组
  11. SQL如何删除重复数据
  12. 10月17日 Spring Cloud 周三
  13. [PAT] PAT注意点
  14. 【NOI2001】炮兵阵地 题解
  15. 隐私公链背景的FAIRY SWAP,让DEX更进一步
  16. html5 tooltip,HTML5 教程之CSS 提示工具(Tooltip)
  17. 唯样商城:英飞凌 —— 一文弄懂IGBT驱动
  18. Android显示Gif图片
  19. 2021年电工(技师)最新解析及电工(技师)复审考试
  20. 虚拟机架设传奇3服务器,WIN8安装虚拟机玩传奇3教程-转

热门文章

  1. 三维点云课程第一章:应用
  2. darknet53网络结构及配置文件对比
  3. Linux那些事儿 之 戏说USB(16)配置
  4. java aio_java中的AIO
  5. 基于数据融合的城市点云自动标注
  6. 高精地图:为自动驾驶汽车提供动力的新时代地图
  7. PCL点云特征描述与提取(4)
  8. Ubuntu 14.04 64bit上curl-7.37源码包中的sample 源码示例研究
  9. L1-044 稳赢 (暴力法)
  10. mybatis简化实现思路