原创:星绽紫辉 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)