xp下不需要重定位,但是Vista之后加入了aslr保护,加大了黑客预测堆栈位置的难度,使得以前exe程序一直不重视的重定位,现在也需要修复。
虽然可以关闭重定位之后再脱壳就没有下面的一些问题了,但一个完美主义心里还是很不爽的。
程序原理:两次不同基址情况下的dump文件,通过对比确定需要重定位的数据,然后添加重定位区块,修复PE文件重定位区块指向,最后将重定位的数据写入重定位区块。
使用的程序为HImiy第一课作业:
脱壳后区段如下:
重定位数据如下:
修复后信息如下:
发现修复后的重定位信息多了很多,并且程序也不能运行
确认重定位信息的思路是:直接寻址的数据都需要重定位,然后采用收集的重定位汇编语句+反汇编引擎双向确认
需要重定位的汇编语句如下,可能不全:
[Asm] 纯文本查看 复制代码 [/align]
[align=left]BYTE actionCode[][2] = {
/*------------EAX------------------------------*/
{ 0x2B, 0x05 },//sub eax,dword ptr ds:[0x3107B0]
{ 0x29, 0x05 },//sub dword ptr ds:[0x3107B0],eax
{ 0x2A, 0x05 },//sub al,byte ptr ds:[0x3107B0]
{ 0x28, 0x05 },//sub byte ptr ds:[0x3107B0],al
{ 0x03, 0x05 },//add eax,dword ptr ds:[0x3107B0]
{ 0x01, 0x05 },//add dword ptr ds:[0x3107B0],eax
{ 0x02, 0x05 },//add al,byte ptr ds:[0x3107B0]
{ 0x00, 0x05 },//add byte ptr ds:[0x3107B0],al
{ 0x39, 0x05 },// cmp dword ptr ds:[0x3107B0],eax
{ 0x38, 0x05 },//cmp byte ptr ds:[0x3107B0],al
{ 0x3B, 0x05 },//cmp eax,dword ptr ds:[0x3107B0]
{ 0x3A, 0x05 },//cmp al,byte ptr ds:[0x3107B0]
/*-----------------EDI------------------------*/
{ 0x8B, 0x3D },//mov edi, dword ptr ds : [0x302420];
{ 0x89, 0x3D },//mov dword ptr ds : [0x302420], edi
{ 0x03, 0x3D },//add edi, dword ptr ds : [0x302420];
{ 0x01, 0x3D },//add dword ptr ds : [0x302420], edi
{ 0x2B, 0x3D },//sub edi, dword ptr ds : [0x302420];
{ 0x29, 0x3D },//sub dword ptr ds : [0x302420], edi
{ 0x39, 0x3D },//cmp dword ptr ds : [0x30F008], edi
{ 0x3B, 0x3D },//cmp edi, dword ptr ds : [0x30F008]
/*--------------------EBX-------------------------*/
{ 0x8B, 0x1D },//002D1248 8B1D 20243000 mov ebx, dword ptr ds : [0x302420];
{ 0x89, 0x1D },//002F3A62 891D 70563100 mov dword ptr ds : [0x315670], ebx
{ 0x03, 0x1D },//00177FA8 031D 20243000 add ebx, dword ptr ds : [0x302420]
{ 0x01, 0x1D },//00177FA8 011D 20243000 add dword ptr ds : [0x302420], ebx
{ 0x2B, 0x1D },//002D1248 2B1D 20243000 sub ebx, dword ptr ds : [0x302420];
{ 0x29, 0x1D },//00177FA8 291D 20243000 sub dword ptr ds : [0x302420], ebx
{ 0x39, 0x1D },//002D15B3 391D 08F03000 cmp dword ptr ds : [0x30F008], ebx
{ 0x3B, 0x1D },//00177FA8 3B1D 08F03000 cmp ebx, dword ptr ds : [0x30F008]
/*----------------------ECX-------------------------*/
{ 0x8B, 0x0D },//002D1248 8B0D 20243000 mov ecx,dword ptr ds:[0x302420] ;
{ 0x89, 0x0D },//002F3A62 890D 00F03000 mov dword ptr ds:[0x30F000],ecx
{ 0x03, 0x0D },//00177FA8 030D 20243000 add ecx,dword ptr ds:[0x302420]
{ 0x01, 0x0D },//00177FA8 010D 20243000 add dword ptr ds:[0x302420],ecx
{ 0x2B, 0x0D },//002D1248 2B0D 20243000 sub ecx,dword ptr ds:[0x302420]
{ 0x29, 0x0D },//00177FA8 290D 20243000 sub dword ptr ds:[0x302420],ecx
{ 0x39, 0x0D },//002D15B3 390D 08F03000 cmp dword ptr ds:[0x30F008],ecx
{ 0x3B, 0x0D },//00177FA8 3B0D 08F03000 cmp ecx,dword ptr ds:[0x30F008]
/*---------------------EDX-------------------------*/
{ 0x8B, 0x15 },//002D1248 8B15 20243000 mov edx,dword ptr ds:[0x302420] ;
{ 0x89, 0x15 },//002F3A62 8915 00F03000 mov dword ptr ds:[0x30F000],edx
{ 0x03, 0x15 },//00177FA8 0315 20243000 add edx,dword ptr ds:[0x302420]
{ 0x01, 0x15 },//00177FA8 0115 20243000 add dword ptr ds:[0x302420],edx
{ 0x2B, 0x15 },//002D1248 2B15 20243000 sub edx,dword ptr ds:[0x302420]
{ 0x29, 0x15 },//00177FA8 2915 20243000 sub dword ptr ds:[0x302420],edx
{ 0x39, 0x15 },//002D15B3 3915 08F03000 cmp dword ptr ds:[0x30F008],edx
{ 0x3B, 0x15 },//00177FA8 3B15 08F03000 cmp edx,dword ptr ds:[0x30F008]
/*---------------------ESI-------------------------*/
{ 0x8B, 0x35 },//002D1248 8B35 20243000 mov esi,dword ptr ds:[0x302420] ;
{ 0x89, 0x35 },//002F3A62 8935 00F03000 mov dword ptr ds:[0x30F000],esi
{ 0x03, 0x35 },//00177FA8 0335 20243000 add esi,dword ptr ds:[0x302420]
{ 0x01, 0x35 },//00177FA8 0135 20243000 add dword ptr ds:[0x302420],esi
{ 0x2B, 0x35 },//002D1248 2B35 20243000 sub esi,dword ptr ds:[0x302420]
{ 0x29, 0x35 },//00177FA8 2935 20243000 sub dword ptr ds:[0x302420],esi
{ 0x39, 0x35 },//002D15B3 3935 08F03000 cmp dword ptr ds:[0x30F008],esi
{ 0x3B, 0x35 },//00177FA8 3B35 08F03000 cmp esi,dword ptr ds:[0x30F008]
/*-----------------------赋值立即数--------------------------------*/
{ 0xC7, 0x05 },//003016B1 C705 B0453100 9C7C3000 mov dword ptr ds : [0x3145B0], 00307C9C
{ 0xC6, 0x35 },//00177FAE C605 B0453100 30 mov byte ptr ds : [0x3145B0], 0x30
{ 0x83, 0x25 },//003016FE 8325 D41A3100 00 and dword ptr ds : [0x311AD4], 0x0
{ 0x83, 0x0D },//00177FAE 830D D41A3100 00 or dword ptr ds : [0x311AD4], 0x0
{ 0x83, 0x35 },//00177FAE 8335 D41A3100 00 xor dword ptr ds : [0x311AD4], 0x0
{ 0x80, 0x25 },//00177FB4 8025 D41A3100 00 and byte ptr ds : [0x311AD4], 0x0
{ 0x80, 0x0D },//00177FAE 800D D41A3100 00 or byte ptr ds : [0x311AD4], 0x0
{ 0x80, 0x35 },//00177FAE 8035 D41A3100 00 xor byte ptr ds : [0x311AD4], 0x0
/*------------------------------直接乘除加减----------------------------*/
{ 0xF7, 0x25 },//00177FB4 F725 B0073100 mul dword ptr ds : [0x3107B0]
{ 0xF7, 0x2D },//00177FB4 F72D B0073100 imul dword ptr ds : [0x3107B0]
{ 0xFF, 0x0D },//00177FB4 FF0D B0073100 dec dword ptr ds : [0x3107B0]
{ 0xFF, 0x05 },//00177FB4 FF05 B0073100 inc dword ptr ds : [0x3107B0]
{ 0xF7, 0x35 },//00177FB4 F735 B0073100 div dword ptr ds : [0x3107B0]
{ 0xF7, 0x3D },//00177FB4 F73D B0073100 idiv dword ptr ds : [0x3107B0]
/*----------------------------跳转和压栈出栈----------------------------*/
{ 0xFF, 0x15 },//002D1077 FF15 28203000 call dword ptr ds : [0x302028];
{ 0xFF, 0x25 },//002D1744 - FF25 70243000 jmp dword ptr ds : [0x302470]
{ 0xFF, 0x35 },//002F35E5 FF35 2C3F3100 push dword ptr ds : [0x313F2C]
{ 0x8F, 0x05 }//002F35E5 8F05 2C3F3100 pop dword ptr ds : [0x313F2C]
};
(动作代码之后便是需要重定位地址)
通过比较找到不同的位置后,向前查找有没有类似于“2B05”这类动作代码,找到后,便确定是一个需要重定位的地址,记录它在文件中的偏移。有的时候查找到的重定位地址中包含上面的动作代码,
这样就会对重定位地址判断出错,所以才借用了一个反汇编引擎重复确认一下。
详细的东西还是看代码吧,代码有点渣,不过都有注释。
附件为自己写的程序代码,其中Disasm.cpp Disasm.h Dsasm_Functions.cpp 为反汇编引擎代码(从网上找的)
关于重定位的知识,请朋友们不吝赐教,也好让我完成这个工具。
file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\767809501\QQ\WinTemp\RichOle\UURH84)5G0A393F97MZ7}}1.png
|