吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 7012|回复: 16

[原创逆向图文] 菜鸟简单对程序添加DLL弹窗原理分析

  [复制链接]
哎呦呦 发表于 2015-8-3 22:35 | 显示全部楼层 |阅读模式

文章可能会写的很差 请各位大牛不要笑!! 求大牛带我这个菜鸟装B带我飞

实验对象:NOTEPAD.EXE

  1. <span style="background-color: white;"><font face="微软雅黑" size="3" color="#000000">DLL代码

  2. </font></span>
复制代码
  1. <span style="background-color: white;"><font face="微软雅黑" size="3" color="#000000">#include "stdafx.h"
  2. #include "windows.h"
  3. void in ();
  4. void out ();
  5. void in ()
  6. {
  7.    MessageBox(0,"进程调用","进程调用",MB_OK);

  8. }

  9. void out ()
  10. {
  11.          MessageBox(0,"进程卸载","进程卸载",MB_OK);

  12. }

  13. extern "C" __declspec(dllexport)  void fun()
  14. {
  15.          MessageBox(0,"","",MB_OK);

  16. }


  17. BOOL APIENTRY DllMain( HANDLE hModule,
  18.                        DWORD  ul_reason_for_call,
  19.                        LPVOID lpReserved
  20.                                          )
  21. {
  22.         switch (ul_reason_for_call)
  23.         {
  24.         case  DLL_PROCESS_ATTACH: //进程调用

  25.                 in();
  26.                 break;
  27.         case        DLL_PROCESS_DETACH://进程卸载

  28.                 out();
  29.                 break;
  30.         case         DLL_THREAD_ATTACH://线程调用
  31.                 break;
  32.         case         DLL_THREAD_DETACH://线程卸载
  33.                 break;
  34.                
  35.         }
  36.     return TRUE;
  37. }
  38. </font></span>
复制代码


编译好dll之后,使用lordPE添加导入表,方法,打开lordpe中的pe编辑器,选择文件,然后点击目录,点击输入表后面的“...”,在弹出的对话框中按右键,add import。在dll和api中填写dll的名字和导出的函数名。按加号添加后,保存即可。


a1.jpg
2.png
通过上面的简单操作添加一个信息框就完成了,!
----------------------------------------------------------------------------------------------------

为什么这样操作后软件就会在打开我们的信息框呢这才是我们的重点!
关键点就在导入表(输入表)(_IMAGE_IMPORT_DESCRIPTOR)
  1. <span style="background-color: white;"><font face="微软雅黑" size="3" color="#000000">typedef struct _IMAGE_IMPORT_DESCRIPTOR {

  2.     union {

  3.         DWORD   Characteristics;            

  4.         DWORD   OriginalFirstThunk;      //INT表 RVA

  5.     } DUMMYUNIONNAME;      

  6.     DWORD   TimeDateStamp;   //时间戳(用来判断IAT)                                                   

  7.     DWORD   ForwarderChain;                 

  8.     DWORD   Name;    //DLL名字        

  9.     DWORD   FirstThunk;      //IAT表    RVA

  10. } IMAGE_IMPORT_DESCRIPTOR;
  11. </font></span>
复制代码


程序可能会有多个_IMAGE_IMPORT_DESCRIPTOR这样的结构体  


lordpe打开NOTEPAD.EXE打开看看导入表在文件中的样子


3.jpg

上面选中的二进制就是导入表  通过上面的结构我们可以知道导入表的结构体的大小是20个字节 上面选中的二进制有200个字节 那我们就知道了程序有10个_IMAGE_IMPORT_DESCRIPTOR这样的结构体 最后以全0值结构结束


结构体里面有个   DWORD   Name;  RVA  //DLL名字   代表的要加载的DLL名字

程序有10这样的结构体代码程序要加载10个DLL 所以通过增加这样的这样的结构体 就能达到程序运行前就能加载我们的DLL 但原来的位置肯定是不够我们要添加结构的 所以我们要新建一个区段(或者找一段空闲区域) 移动导入表到新建的区段来实现增加结构体  并且把原来输入表的RVA 改成 移动后RVA(大家用lordPE添加导入表 导入表位置变了的原因就在这里)
当然只是这样简单的移动导入并增加结构体还是不可以的 因为_IMAGE_IMPORT_DESCRIPTOR结构里面还有两个很重要的东西


DWORD   OriginalFirstThunk;      RVA ——》指向IAT表


DWORD   FirstThunk;     RVA ——》指向IAT表
增加完结构体后 我们还要在 新建的区段里增加两张表 分表是 IAT表  和 IAT表 他们都指向一个表(_IMAGE_IMPORT_BY_NAME结构体)//只是在程序加载前  程序加载后IAT并不指向这个表




他们的结构都是相同的 _IMAGE_THUNK_DATA32
  1. <span style="background-color: white;"><font face="微软雅黑" size="3" color="#000000">typedef struct _IMAGE_THUNK_DATA32 {
  2.     union {
  3.         PBYTE  ForwarderString;
  4.         PDWORD Function;
  5.         DWORD Ordinal;
  6.         PIMAGE_IMPORT_BY_NAME  AddressOfData;指向的是一个 <span style="line-height: 1.5; background-color: rgb(255, 255, 255);">_IMAGE_IMPORT_BY_NAME 的结构体</span></font></span>
复制代码


_IMAGE_IMPORT_BY_NAME
  1. <span style="background-color: white;"><font face="微软雅黑" size="3" color="#000000">typedef struct _IMAGE_IMPORT_BY_NAME {
  2.     WORD    Hint;//一般编译器都吧它设置为0 没什么用
  3.     BYTE    Name[1];//存放的是函数名字的第一个字符
  4. } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;</font></span>
复制代码


程序加载前这两张表保存的数据都是一样 除了系统提供的程序 因为系统的程序都绑定了导入表 IAT里面放的都是绝对地址(这里就不对绑定做过多的分析了)一般的程序都是不绑定的 所以一般的程序在程序没有加载前存放的值都是一样的

_IMAGE_THUNK_DATA32 这样的结构体也是可以有多个的 都是以0结束


_IMAGE_THUNK_DATA32 的结构体看的很复杂  因为结构体里面又包含了一个_IMAGE_IMPORT_BY_NAME 这样的结构体  其实吧它当成一个DWORD来看就可以了! 然后获取里面的值


对值进行判断 如果值的最高位(第32位是0)剩下的31就表示是一个RVA RVA指向的就是_IMAGE_IMPORT_BY_NAME这样的一个结构体


_IMAGE_IMPORT_BY_NAME结构体里面的BYTE Name[1]就是函数的名字的第一个字符 所以BYTE Name就是函数名字的地址


通过上面的分析我们应该知道 不只是新建IAT表和INT表 就可以 还同时要新建一个_IMAGE_IMPORT_BY_NAME的结构 并把函数的名字的首地址放进BYTE Name里
并且同时把INT表的值改成指向_IMAGE_IMPORT_BY_NAME结构体的RVA 和 IAT表的值改成指向_IMAGE_IMPORT_BY_NAME结构体的RVA 都完成后 我们还要把 INT 和IAT 的
RVA  都分别放在 我们新建的_IMAGE_IMPORT_DESCRIPTOR结构体里面  这样我们添加一个导入表就基本完成了


因为系统在加载我们的DLL的时候会检查我们的DLL导出表里的INT IAT表是不是有函数名 如果没有那就表示这个DLL没有被加载的意义
这样就能解释我们为什么在用lordpe中dd import为什么要填写一个导出的函数名 和为什么我们在编写DLL的时候要导出一个函数!!!!!


文章写的很乱全当复习了!! 如果有什么错误和不足之处,还请各位批评指出! BY:2015/8/3


mydll.rar (8.73 KB, 下载次数: 3)


评分

参与人数 23HB +40 THX +16 收起 理由
sjtkxy + 1 + 1
花盗睡鼠 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
虚心学习 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
24567 + 1
Soul1999 + 1
zxjzzh + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
创客者V2.0 + 1
消逝的过去 + 1
冷亦飞 + 1
微熊猫 + 2
liugu0hai + 1 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
lies + 1
hnymsh + 1
mengzhisuoliu1 + 1
诺安 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
逍遥枷锁 + 4 + 1 评分=感恩!简单却充满爱!感谢您的作品!
冷瞳 + 1 + 1 【新福利】详见http://www.xuepojie.com/thread-11
天份太低 + 2 + 1 评分=感恩!简单却充满爱!感谢您的作品!
潜心修炼 + 2 + 1 评分=感恩!简单却充满爱!感谢您的作品!
xdr + 3 + 1 评分=感恩!简单却充满爱!感谢您的作品!
wdujs600 + 1 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
Shark恒 + 10 + 1 在原基础上增加了自己理解,赞一个!
Honey丶Crack + 6 + 1 评分=感恩!简单却充满爱!感谢您的作品!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Mxhacks 发表于 2015-8-3 22:43 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
 楼主| 哎呦呦 发表于 2015-8-3 22:47 | 显示全部楼层

Mxhacks 发表于 2015-8-3 22:43
某早就发了!复制也还弄个原创

人家发的是添加的方法 我说的是为什么要这样 能一样吗 有本事去你复制一个給我看看
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
FraMeQ 发表于 2015-8-3 22:56 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
xdr 发表于 2015-8-4 06:52 | 显示全部楼层

看不懂,我太菜了
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
x5龙龙 发表于 2015-8-4 15:35 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
 楼主| 哎呦呦 发表于 2015-8-4 23:25 | 显示全部楼层

x5龙龙 发表于 2015-8-4 15:35
有的DLL防止调用有没有办法搞定?

不是很明白你的意思 是不是对DLL检查啊  如果是对DLL检查 可以变通嘛 看程序本身有什么DLL 把DLL加到程序原有的DLL里面去
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
诺安 发表于 2015-10-5 18:38 | 显示全部楼层

看起来很厉害的样子,因为我是新手
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
pooh 发表于 2019-4-28 20:59 | 显示全部楼层

看不懂新手入過 ...
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
别管我了行 发表于 2022-3-22 03:37 | 显示全部楼层

提示: 作者被禁止或删除 内容自动屏蔽
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表