xinxi 发表于 2016-7-5 23:07:40

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

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

程序原理:两次不同基址情况下的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”这类动作代码,找到后,便确定是一个需要重定位的地址,记录它在文件中的偏移。有的时候查找到的重定位地址中包含上面的动作代码,

这样就会对重定位地址判断出错,所以才借用了一个反汇编引擎重复确认一下。



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



页: [1]
查看完整版本: 关于脱壳后重定位修复 自己写了个半成品工具