浅唱小男人 发表于 2015-8-4 21:55

关于脱壳后重定位修复 自己写了个半成品工具

xp下不需要重定位,但是Vista之后加入了aslr保护,加大了黑客预测堆栈位置的难度,使得以前exe程序一直不重视的重定位,现在也需要修复。
虽然可以关闭重定位之后再脱壳就没有下面的一些问题了,但一个完美主义心里还是很不爽的。

程序原理:两次不同基址情况下的dump文件,通过对比确定需要重定位的数据,然后添加重定位区块,修复PE文件重定位区块指向,最后将重定位的数据写入重定位区块。


使用的程序为HImiy第一课作业:
脱壳后区段如下:

重定位数据如下:

修复后信息如下:


发现修复后的重定位信息多了很多,并且程序也不能运行

确认重定位信息的思路是:直接寻址的数据都需要重定位,然后采用收集的重定位汇编语句+反汇编引擎双向确认
需要重定位的汇编语句如下,可能不全:

BYTE actionCode[] = {
        /*------------EAX------------------------------*/
        { 0x2B, 0x05 },//sub eax,dword ptr ds:
        { 0x29, 0x05 },//sub dword ptr ds:,eax
        { 0x2A, 0x05 },//sub al,byte ptr ds:
        { 0x28, 0x05 },//sub byte ptr ds:,al
        { 0x03, 0x05 },//add eax,dword ptr ds:
        { 0x01, 0x05 },//add dword ptr ds:,eax
        { 0x02, 0x05 },//add al,byte ptr ds:
        { 0x00, 0x05 },//add byte ptr ds:,al
        { 0x39, 0x05 },// cmp dword ptr ds:,eax
        { 0x38, 0x05 },//cmp byte ptr ds:,al
        { 0x3B, 0x05 },//cmp eax,dword ptr ds:
        { 0x3A, 0x05 },//cmp al,byte ptr ds:
        /*-----------------EDI------------------------*/
        { 0x8B, 0x3D },//mov edi, dword ptr ds : ;
        { 0x89, 0x3D },//mov dword ptr ds : , edi
        { 0x03, 0x3D },//add edi, dword ptr ds : ;
        { 0x01, 0x3D },//add dword ptr ds : , edi
        { 0x2B, 0x3D },//sub edi, dword ptr ds : ;
        { 0x29, 0x3D },//sub dword ptr ds : , edi
        { 0x39, 0x3D },//cmp dword ptr ds : , edi
        { 0x3B, 0x3D },//cmp edi, dword ptr ds :
        /*--------------------EBX-------------------------*/
        { 0x8B, 0x1D },//002D1248    8B1D 20243000   mov ebx, dword ptr ds : ;
        { 0x89, 0x1D },//002F3A62    891D 70563100   mov dword ptr ds : , ebx
        { 0x03, 0x1D },//00177FA8    031D 20243000   add ebx, dword ptr ds :
        { 0x01, 0x1D },//00177FA8    011D 20243000   add dword ptr ds : , ebx
        { 0x2B, 0x1D },//002D1248    2B1D 20243000   sub ebx, dword ptr ds : ;
        { 0x29, 0x1D },//00177FA8    291D 20243000   sub dword ptr ds : , ebx
        { 0x39, 0x1D },//002D15B3    391D 08F03000   cmp dword ptr ds : , ebx
        { 0x3B, 0x1D },//00177FA8    3B1D 08F03000   cmp ebx, dword ptr ds :
        /*----------------------ECX-------------------------*/
        { 0x8B, 0x0D },//002D1248    8B0D 20243000   mov ecx,dword ptr ds:          ;
        { 0x89, 0x0D },//002F3A62    890D 00F03000   mov dword ptr ds:,ecx
        { 0x03, 0x0D },//00177FA8    030D 20243000   add ecx,dword ptr ds:
        { 0x01, 0x0D },//00177FA8    010D 20243000   add dword ptr ds:,ecx
        { 0x2B, 0x0D },//002D1248    2B0D 20243000   sub ecx,dword ptr ds:
        { 0x29, 0x0D },//00177FA8    290D 20243000   sub dword ptr ds:,ecx
        { 0x39, 0x0D },//002D15B3    390D 08F03000   cmp dword ptr ds:,ecx
        { 0x3B, 0x0D },//00177FA8    3B0D 08F03000   cmp ecx,dword ptr ds:
        /*---------------------EDX-------------------------*/
        { 0x8B, 0x15 },//002D1248    8B15 20243000   mov edx,dword ptr ds:          ;
        { 0x89, 0x15 },//002F3A62    8915 00F03000   mov dword ptr ds:,edx
        { 0x03, 0x15 },//00177FA8    0315 20243000   add edx,dword ptr ds:
        { 0x01, 0x15 },//00177FA8    0115 20243000   add dword ptr ds:,edx
        { 0x2B, 0x15 },//002D1248    2B15 20243000   sub edx,dword ptr ds:
        { 0x29, 0x15 },//00177FA8    2915 20243000   sub dword ptr ds:,edx
        { 0x39, 0x15 },//002D15B3    3915 08F03000   cmp dword ptr ds:,edx
        { 0x3B, 0x15 },//00177FA8    3B15 08F03000   cmp edx,dword ptr ds:
        /*---------------------ESI-------------------------*/
        { 0x8B, 0x35 },//002D1248    8B35 20243000   mov esi,dword ptr ds:          ;
        { 0x89, 0x35 },//002F3A62    8935 00F03000   mov dword ptr ds:,esi
        { 0x03, 0x35 },//00177FA8    0335 20243000   add esi,dword ptr ds:
        { 0x01, 0x35 },//00177FA8    0135 20243000   add dword ptr ds:,esi
        { 0x2B, 0x35 },//002D1248    2B35 20243000   sub esi,dword ptr ds:
        { 0x29, 0x35 },//00177FA8    2935 20243000   sub dword ptr ds:,esi
        { 0x39, 0x35 },//002D15B3    3935 08F03000   cmp dword ptr ds:,esi
        { 0x3B, 0x35 },//00177FA8    3B35 08F03000   cmp esi,dword ptr ds:
        /*-----------------------赋值立即数--------------------------------*/
        { 0xC7, 0x05 },//003016B1    C705 B0453100 9C7C3000   mov dword ptr ds : , 00307C9C
        { 0xC6, 0x35 },//00177FAE    C605 B0453100 30   mov byte ptr ds : , 0x30
        { 0x83, 0x25 },//003016FE    8325 D41A3100 00   and dword ptr ds : , 0x0
        { 0x83, 0x0D },//00177FAE    830D D41A3100 00   or dword ptr ds : , 0x0
        { 0x83, 0x35 },//00177FAE    8335 D41A3100 00   xor dword ptr ds : , 0x0
        { 0x80, 0x25 },//00177FB4    8025 D41A3100 00   and byte ptr ds : , 0x0
        { 0x80, 0x0D },//00177FAE    800D D41A3100 00   or byte ptr ds : , 0x0
        { 0x80, 0x35 },//00177FAE    8035 D41A3100 00   xor byte ptr ds : , 0x0
        /*------------------------------直接乘除加减----------------------------*/
        { 0xF7, 0x25 },//00177FB4    F725 B0073100   mul dword ptr ds :
        { 0xF7, 0x2D },//00177FB4    F72D B0073100   imul dword ptr ds :
        { 0xFF, 0x0D },//00177FB4    FF0D B0073100   dec dword ptr ds :
        { 0xFF, 0x05 },//00177FB4    FF05 B0073100   inc dword ptr ds :
        { 0xF7, 0x35 },//00177FB4    F735 B0073100   div dword ptr ds :
        { 0xF7, 0x3D },//00177FB4    F73D B0073100   idiv dword ptr ds :
        /*----------------------------跳转和压栈出栈----------------------------*/
        { 0xFF, 0x15 },//002D1077    FF15 28203000   call dword ptr ds : ;
        { 0xFF, 0x25 },//002D1744 - FF25 70243000   jmp dword ptr ds :
        { 0xFF, 0x35 },//002F35E5    FF35 2C3F3100   push dword ptr ds :
        { 0x8F, 0x05 }//002F35E5    8F05 2C3F3100   pop dword ptr ds :
};


(动作代码之后便是需要重定位地址)
    通过比较找到不同的位置后,向前查找有没有类似于“2B05”这类动作代码,找到后,便确定是一个需要重定位的地址,记录它在文件中的偏移。有的时候查找到的重定位地址中包含上面的动作代码,
这样就会对重定位地址判断出错,所以才借用了一个反汇编引擎重复确认一下。


   详细的东西还是看代码吧,代码有点渣,不过都有注释。





附件为自己写的程序代码,其中Disasm.cppDisasm.h   Dsasm_Functions.cpp 为反汇编引擎代码(从网上找的)

关于重定位的知识,请朋友们不吝赐教,也好让我完成这个工具。
file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\767809501\QQ\WinTemp\RichOle\UURH84)5G0A393F97MZ7}}1.png

蚯蚓翔龙 发表于 2015-8-4 22:33

这样不是很通用的吧,而且看起来好麻烦。。。Dll脱壳后的重定位能否成功修复过{:1_908:}

浅唱小男人 发表于 2015-8-4 23:21

蚯蚓翔龙 发表于 2015-8-4 22:33
这样不是很通用的吧,而且看起来好麻烦。。。Dll脱壳后的重定位能否成功修复过

就是为了通用性才做的这个工具,这个工具的原理也是根据网上流传的大牛作品Relox dll修复工具而来的。
主要是我发现除了代码段需要重定位,重定位表里面还有data,rdata段里的数据,不知道这两个段中的什么需要重定位

720830 发表于 2015-8-5 07:52

都是大神的舞台

zhaohanbo 发表于 2015-8-5 12:18

我说我一点都没看懂~~~在这个论坛里是不是很弱智{:1_937:}

一抹芬芳 发表于 2015-8-6 13:40

此贴必火,先占位支持了,谢谢分享

Hmily 发表于 2015-8-7 19:17

移动一下,期待楼主完善,现在处理重定位的工具比较少,搞个完善的大有前途。
页: [1]
查看完整版本: 关于脱壳后重定位修复 自己写了个半成品工具