关于脱壳后重定位修复 自己写了个半成品工具
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
这样不是很通用的吧,而且看起来好麻烦。。。Dll脱壳后的重定位能否成功修复过{:1_908:} 蚯蚓翔龙 发表于 2015-8-4 22:33
这样不是很通用的吧,而且看起来好麻烦。。。Dll脱壳后的重定位能否成功修复过
就是为了通用性才做的这个工具,这个工具的原理也是根据网上流传的大牛作品Relox dll修复工具而来的。
主要是我发现除了代码段需要重定位,重定位表里面还有data,rdata段里的数据,不知道这两个段中的什么需要重定位 都是大神的舞台 我说我一点都没看懂~~~在这个论坛里是不是很弱智{:1_937:} 此贴必火,先占位支持了,谢谢分享 移动一下,期待楼主完善,现在处理重定位的工具比较少,搞个完善的大有前途。
页:
[1]