当前位置: 首页 > 编程日记 > 正文

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

通过导出表隐性加载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

相关文章:

系统启动时,spring配置文件解析失败,报”cvc-elt.1: 找不到元素 'beans' 的声明“异常...

现象:spring加载配置文件applicationContext.xml出错,抛出nested exception is og.xml.sax.SAXParseException; lineNumber: 12; columnNumber: 47; cvc-elt.1: 找不到元素 beans 的声明r的异常信息。 造成该异常原因有两种:第一,配置文件头部配置的xsd版…

DllMain中不当操作导致死锁问题的分析--死锁介绍

最近在网上看到一些关于在DllMain中不当操作导致死锁的问题,也没找到比较确切的解答,这极大吸引了我研究这个问题的兴趣。我花了一点时间研究了下,正好也趁机研究了下进程对DllMain的调用规律。因为整个研究篇幅比较长,我觉得还是…

XGBoost缺失值引发的问题及其深度分析 | CSDN博文精选

作者 | 兆军(美团配送事业部算法平台团队技术专家)来源 | 美团技术团队(*点击阅读原文,查看美团技术团队更多文章)背景XGBoost模型作为机器学习中的一大“杀器”,被广泛应用于数据科学竞赛和工业领域&#…

什么是CPI指数和GDP

即消费者物价指数(Consumer Price Index),英文缩写为CPI,是反映与居民生活有关的产品及劳务价格统计出来的物价变动指标,通常作为观察通货膨胀水平的重要指标。如果消费者物价指数升幅过大,表明通胀已经成为经济不稳定因素&#x…

The Ultimate Guide To iPhone Resolutions

2019独角兽企业重金招聘Python工程师标准>>> ios 屏幕尺寸 像素 等说明 转载于:https://my.oschina.net/starmier/blog/467271

DllMain中不当操作导致死锁问题的分析--进程对DllMain函数的调用规律的研究和分析

不知道大家是否思考过一个过程:系统试图运行我们写的程序,它是怎么知道程序起始位置的?很多同学想到,我们在编写程序时有个函数,类似Main这样的名字。是的!这就是系统给我们提供的控制程序最开始的地方&…

力挺Python!同是程序员,为啥同事年前就实现了财务自由?

人红是非多,最近Python就遇到了这样的问题。与技术社区上一片「形势大好」对比鲜明的是,国内技术圈却一直存在对Python,「力挺」和「吃瓜」两派阵营,针锋相对,那么,Python到底有没有用,真相究竟…

C# 判断远程文件是否存在

#region 判断远程文件是否存在/// <summary>/// 判断远程文件是否存在/// </summary>/// <param name"fileUrl"></param>/// <returns></returns>public static bool RemoteFileExists(string fileUrl){HttpWebRequest re null…

DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子

有了前面两节的基础&#xff0c;我们现在切入正题&#xff1a;研究下DllMain为什么会因为不当操作导致死锁的问题。首先我们看一段比较经典的“DllMain中死锁”代码。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; //主线程中 HMODULE h LoadLibraryA(strD…

性能超FPN!北大、阿里等提多层特征金字塔网络

作者 | Qijie Zhao等编译 | 李杰出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;特征金字塔网络具有处理不同物体尺度变化的能力&#xff0c;因此被广泛应用到one-stage目标检测网络&#xff08;如DSSD&#xff0c;RetinaNet&#xff0c;RefineDet&#xff09;和two-…

什么是WIFI

WIFI全称Wireless Fidelity&#xff0c;又称802.11b标准&#xff0c;它的最大优点就是传输速度较高&#xff0c;可以达到11Mbps&#xff0c;另外它的有效距离也很长&#xff0c;同时也与已有的各种802.11DSSS设备兼容。 WIFI是由AP(Access Point)和无线网卡组成的无线网络。…

Android入门——电话拨号器和4种点击事件

关于HelloWorld为,电话拨号程序还AndroidA入门demo,从这个样例我们要理清楚做安卓项目的思路。大体分为三步&#xff1a; 1.理解需求&#xff0c;理清思路 2.设计UI 3.代码实现 电话拨号器 1. 理解需求&#xff1a; *一个文本框——用来接收电话号码 *一个button——用来触发事…

DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子2

本文介绍使用Windbg去验证《DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子》中的结论&#xff0c;调试对象是文中刚开始那个例子。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 1 g 让程序运行起来 2 ctrlbreak 中断程序 3 ~ 查看…

从入门到深入:移动平台模型裁剪与优化的技术探索与工程实践

可以看到&#xff0c;通过机器学习技术&#xff0c;软件或服务的功能和体验得到了质的提升。比如&#xff0c;我们甚至可以通过启发式引擎智能地预测并调节云计算分布式系统的节点压力&#xff0c;以此改善服务的弹性和稳定性&#xff0c;这是多么美妙。而对移动平台来说&#…

我在不炎熱也不抑鬱的秋天,依然不抽煙

写过几次电影的观后感,挺过瘾.最近看到my little airport的那张新唱片,再也没有办法保持沉默了 为什么人家的唱片名都起的和小说一样,难得是为了证明听歌的人们都不喜欢动笔吗? 于是,我建了个类别,叫 我也会听歌.很明显,这里面会塞一些和歌相关的东西 这是第一篇

ubuntu安装redis的方法以及PHP安装redis扩展、CI框架sess使用redis的方法

为什么80%的码农都做不了架构师&#xff1f;>>> 再一次被网上那些教程误导后决定自己写一个。真心被那些奇怪的教程误导了好几次&#xff0c;之前研究其它东西的时候也是。蛋疼啊。 安装redis 直接用apt-get命令即可 sudo apt-get install redis-server 安装的时候…

浅谈数据库设计技巧

说到数据库&#xff0c;我认为不能不先谈数据结构。1996年&#xff0c;在我初入大学学习计算机编程时&#xff0c;当时的老师就告诉我们说&#xff1a;计算机程序&#xff1d;数据结构&#xff0b;算法。尽管现在的程序开发已由面向过程为主逐步过渡到面向对象为主&#xff0c;…

避免神经网络过拟合的5种技术(附链接) | CSDN博文精选

作者 | Abhinav Sagar翻译 | 陈超校对 | 王琦来源 | 数据派THU(ID:DatapiTHU)(*点击阅读原文&#xff0c;查看作者更多精彩文章&#xff09;本文介绍了5种在训练神经网络中避免过拟合的技术。 最近一年我一直致力于深度学习领域。这段时间里&#xff0c;我使用过很多神经网络&a…

DllMain中不当操作导致死锁问题的分析--加载卸载DLL与DllMain死锁的关系

前几篇文章一直没有在源码级证明&#xff1a;DllMain在收到DLL_PROCESS_ATTACH和DLL_PROCESS_DETACH时会进入临界区。这个论证非常重要&#xff0c;因为它是使其他线程不能进入临界区从而导致死锁的关键。我构造了在DLL被映射到进程地址空间的场景&#xff0c;请看死锁时加载DL…

LinearLayout增加divider分割线

2019独角兽企业重金招聘Python工程师标准>>> 在android3.0及后面的版本在LinearLayout里增加了个分割线 android:divider"drawable/shape"<!--分割线图片--> android:showDividers"middle|beginning|end" <!--分割线位置--> 分割线…

JAVA游戏编程之二----j2me MIDlet 手机游戏入门开发--贪吃蛇

作者&#xff1a;雷神 QQ:38929568 QQ群&#xff1a;28048051JAVA游戏编程&#xff08;满&#xff09; 28047782&#xff08;将满&#xff09; 与前一款扫雷比较&#xff0c;这个游戏多了一个 类&#xff0c;用来显示动画&#xff0c;也是蛇要吃的物品类&#xff0c; 也有了代码…

DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁

之前的几篇文章已经讲解了在DllMain中创建并等待线程导致的死锁的原因。是否还记得&#xff0c;我们分析了半天汇编才知道在线程中的死锁位置。如果对于缺乏调试经验的同学来说&#xff0c;可能发现这个位置有点麻烦。那么本文就介绍几个例子&#xff0c;它们会在线程明显的位置…

如何从菜鸡变成收割机,大厂面试的算法,你懂了吗?

是什么&#xff1f;让大厂面试显得逼格很高&#xff0c;是算法和数据结构吗&#xff1f;是的&#xff01;&#xff01;&#xff01;Google工程师曾总结过&#xff0c;大厂之所以爱考察算法和数据结构是因为&#xff1a;算法能力能够准确辨别一个程序员的技术功底是否扎实&#…

Ejabberd源码解析前奏--配置

一、基本配置 配置文件将在你第一次启动ejabberd时加载&#xff0c;从该文件中获得的内容将被解析并存储到内部的ejabberd数据库中&#xff0c;以后的配置将从数据库加载&#xff0c;并且任何配置文件里的命令都会被添加到数据库里。 需要注意的是&#xff1a;ejabberd从不编辑…

DllMain中不当操作导致死锁问题的分析——DllMain中要谨慎写代码(完结篇)

之前几篇文章主要介绍和分析了为什么会在DllMain做出一些不当操作导致死锁的原因。本文将总结以前文章的结论&#xff0c;并介绍些DllMain中还有哪些操作会导致死锁等问题。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; DllMain的相关特性 首先列出…

滴滴叶杰平:年运送乘客百亿次,AI如何“服务”出行领域?| BDTC 2019

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;“如果把北京一天滴滴的轨迹数据放在一起&#xff0c;要覆盖北京所有道路差不多四百次&#xff0c;数据非常大、非常完整。”超5.5亿用户&#xff0c;年运送乘客100亿人次&#xff0c;除了中国地区&#xff0c;滴滴也在…

分析部署无线局域网的关键要素

在部署无线局域网时需要考虑的关键问题包括&#xff1a;确定单个接入点的RF覆盖&#xff0c;保证足够的支持所有用户的容量&#xff0c;以及考虑RF信号损耗因素。  单个AP的覆盖   网络设计师必须通过研究AP的服务范围来决定单个AP的覆盖。数据速率是一种距离函数&#xff…

Delphi调用java开发的WebService,传入参数出错

http://www.cnblogs.com/zhangzhifeng/p/3397053.html 调用没有参数的服务正常,当调用有参数的服务出现以下错误java.util.concurrent.ExecutionException: java.lang.NullPointerException 另外加了RIO.HTTPWebNode.UseUTF8InHeader : True;InvRegistry.RegisterInvokeOptions…

B站收藏6.1w+!这门课拯救你薄弱的计算机基础

作者 | Rocky0429来源 | Python空间大家好&#xff0c;我是 Rocky0429&#xff0c;一个对计算机基础一无所知的蒟蒻...作为一个所谓的计算机科班出身的人来说&#xff0c;特别难为情的是自己的计算机基础很差&#xff0c;比如计算机网络当年一度差点挂掉&#xff0c;多亏当时…

一种不会导致资源泄露的“终止”线程的方法

在项目工程中&#xff0c;我们可能会使用第三方开发的模块。该模块提供一个接口用于完成非常复杂和耗时的工作。我们一般不会将该API放在UI线程中执行&#xff0c;而是启动一个线程&#xff0c;用工作线程去执行这个耗时的操作。&#xff08;转载请指明出于breaksoftware的csdn…