-
-
[求助]请教DLL加壳思路
-
发表于: 2019-10-24 23:52 6074
-
最近想写一个DLL加壳器,我请教一下思路,因为DLL和EXE 不太一样,一般EXE都能占到预设的内存地址,而DLL一般不行。目前的思路是这样,分为两个部分,一个是加壳器程序,一个是stub(stub.dll)。【被加壳dll--->shelled.dll】
一、加壳器程序部分
1. 加壳器读入shelled.dll,然后将该DLL的相关PE内容保存在stub导出的一个结构体中,以便在stub程序执行时用来修复该dll重定位和导入表信息。
2. 加载stub进入内存,这里可以使用loadlirary(不执行的方式)或者直接文件读入内存的方式,从而获取stub程序的指针。
3. 在shelled.dll中添加一个节,然后将stub复制进该节中(这里需要修复shelled.dll的节表 sizeofimage等信息)
3.1 将shelled.dll的重定位表指向stub.dll的重定位表,让该DLL在加载的时候,由系统帮助修复stub.dll的重定位表。(这里stub的重定位表要先进行修改,因为原来的重定位表示根据stub的初始基址算的,现在添加到了shelled.dll的尾部。计算方式是:need_repaire->address - stub->imagebase + add_section->rva +shelled->imagebase)
4. 修改OEP至stub中(新增节的rva+stub的原始OEP)
5. 将整个文件保存
二、 stub程序部分
1. 通过teb的方式获取getprocaddress和loadlibrary的函数地址
2.自己编写一个
strcmp
函数
3. 通过GetModuleHandle函数获取当前被加壳dll的基地址(new_dll_imagebase)
4.根据这个dll的基地址和之前保存在stub导出的结构体中的该被加壳dll的PE的相关信息,对被加壳的dll的重定位和导入表进行修复
5.跳转到shelled.dll原始的oep(new_dll_imagebase + oep)
目前的思路是这样的,请各位大佬指点,哪里存在错误,或者是否有更好的解决方案,希望不吝赐教。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
看原图
赞赏
雪币:
留言: