星绽紫辉(rawdata)的Blog

快乐地学习,快乐地工作!

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  16 Posts :: 0 Stories :: 37 Comments :: 0 Trackbacks

常用链接

留言簿(5)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

                    
          原创:星绽紫辉 http://www.cppblog.com/rawdata   2009-3-6

 
         权作笔记。

         如果要将某个dll注入PE文件(不需要装载dll和运行PE),只需要拷贝原来的Import表,然后复制该表到文件对齐间隙区,然后在后面写入自定义的dll结构。一般新加的结构为0x14长,这个结构对应的值都是RVA,通过RVA计算出RAW,该RAW对应的便是dll名字,序数,偏移地址等信息(可以先从dll的export表中读取所以导出函数信息再写入PE文件,export表的结构比Import表更简单)。


         通过RVA计算RAW,简单计算方法:如果RVA被分成5块,文件也肯定被分成5块,只要保证块块之间一一对应,偏移相同就可以很容易在RVA和RAW之间相互转换。



         总结:
         需要修改的地方:
         1.Import表的表头信息:位置,大小必须重新修订
         2.将新的Import表放入空白区(间隙处)

         需要注意的地方:
         △ 理论上任意跨区的空白区都可以,但是如果该区的属性为只读,且不为初始化数据,就会执行失败。原因:PE加载后会自动修改该区的数据。比较好的做法是:不去寻找间隙,而是增加一个区段,然后设置该区段属性为读写和初始化数据,然后将新的Import表写到该区。

         △不需要修改IAT表

         结果:dll在PE运行时自动加载。 (rawdata)
posted on 2009-03-06 10:29 星绽紫辉 阅读(1975) 评论(2)  编辑 收藏 引用

Feedback

# re: 浅谈静态dll注入PE 2011-04-22 00:33 coco
其实这种方法有个很严重的bug,可能很多时候不会表现出来,甚至在不同的机器上会有不同的效果。
问题在于,注入的DLL的肯定不会有其他程序来调用你的导出函数了,所以你在dllmain里需要执行的内容会比较多,但是dllmain是个很危险的东西,因为注入的dll加载的时候不能保证你所需要的模块已经全部加载,所以很容易会出现感觉DLLmain没有执行。  回复  更多评论
  

# re: 浅谈静态dll注入PE[未登录] 2015-01-06 11:44 none
@coco
DLLMain中执行代码,未加载其他功能dll不是问题,在你的代码执行前会被级联载入.但是tdata全局锁会有问题,当你使用完成端口等有可能涉及到I/O的全局锁.会造成死锁.其他问题,还真没发现.  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理