北斗4.1壳改壳之一 用等价替换代码法修改壳头
摘自:jgaoabc的空间
最近闲着无事,对北斗4.1壳做了点研究,发现这个壳兼容性较好,压缩性大,而且改壳比较容易,所以向大家推荐我的改壳方法,经过修改后,瑞星2009和金山2009是脱不了壳的。对于卡巴,配合数字签名也可以过。由于我不会做动画,我用文字说明。以下修改是针对EXE文件的,DLL则有点不一样。
修改前的代码和修改方法
004C51C4 pushfd
004C51C5 pushad
004C51C6 call 004C51CB
004C51CB pop ebp
004C51CC mov eax,7 修改为sub ebp,7(ebp的值为入口点的内存值)
004C51D1 sub ebp,eax NOP
004C51D3 lea esi,dword ptr ss:[ebp-48C] 修改为mov ebx,-48C和add ebx,ebp,记下此处的48C这个值就称A1。
004C51D9 mov al,byte ptr ds:[esi] 修改为mov al,0(al的值为eax的最低二位)
004C51DB cmp al,0 NOP(EXE文件在ebp-48C的值为0,DLL则为1,所以可以将以下的判断语句NOP,如果修改DLL文件,此处有点不同。)
004C51DD je short 004C51F1 NOP(下面的修改代码写到NOP这里,也可以在这里写点花代码)
004C51DF mov esi,ebp NOP
004C51E1 lea esi,dword ptr ss:[ebp-464] NOP
004C51E7 mov al,byte ptr ds:[esi] NOP
004C51E9 cmp al,1 NOP
004C51EB je 004C5433 NOP
004C51F1 mov byte ptr ds:[esi],1 修改为mov byte ptr ds:[ebx],1(往上移到NOP处)
004C51F4 mov edx,ebp
004C51F6 sub edx,dword ptr ss:[ebp-4D0] 修改为sub ebx,44和sub edx,dword ptr ss:[ebx]
004C51FC mov dword ptr ss:[ebp-4D0],edx 修改为mov dword ptr ss:[ebx],edx(edx的值为基址)
004C5202 add dword ptr ss:[ebp-4A0],edx 修改为add ebx,30和add dword ptr ss:[ebx],edx
004C5208 lea esi,dword ptr ss:[ebp-45C] 修改为add ebx,44和lea esi,dword ptr ss:[ebx]
004C520E add dword ptr ds:[esi],edx
004C5210 pushad 二进制代码修改为50 51 52 53 54 55 56 57
004C5211 push 40 修改为mov ebx,40和push ebx
004C5213 push 1000 和下面一句一起修改为mov ebx,1000和push ebx和push ebx
004C5218 push 1000
004C521D push 0 修改为sub ebx,1000和push ebx
004C521F call dword ptr ss:[ebp-428] 修改为mov ebx,ebp和add ebx,-428和call dword ptr ss:[ebx],记下此处的428这个值,就称A2。
004C5225 test eax,eax NOP
004C5227 je 004C5597 NOP
004C522D mov dword ptr ss:[ebp-4A8],eax 修改为sub ebx,80和mov dword ptr ss:[ebx],eax004C5233 call 004C5238 以下四句(含本句)NOP掉,修改为mov ebx,ebp和add ebx,3DC
004C5238 pop ebx NOP
004C5239 mov ecx,368 NOP
004C523E add ebx,ecx NOP
004C5240 push eax
004C5241 push ebx
004C5242 call 004C54F8 004C54F8的上一行代码是JMP语句,NOP掉,本句修改为call 004C54F3
004C5247 popad 修改到此,有兴趣的可以继续
004C5248 mov esi,dword ptr ds:[esi]
004C524A mov edi,ebp
北斗设置及修改后的代码见图,欢迎大家讨论。
通过对不同文件的对比,我发现其中的内存偏移的差值是固定的,就是上面的A1、A2不同,这就为我们批量修改提供了方便。我提供的二进制代码如下:
9C 60 E8 00 00 00 00 5D 83 ED 07 BB 74 FB FF FF 03 DD C6 03 01 B0 00 8B D5 83 EB 44 36 2B 13 36 89 13 83 C3 30 36 01 13 83 C3 44 36 8D 33 01 16 50 51 52 53 54 55 56 57 BB 40 00 00 00 53 BB 00 10 00 00 53 53 81 EB 00 10 00 00 53 8B DD 81 C3 D8 FB FF FF 36 FF 13 81 EB 80 00 00 00 36 89 03 8B DD 81 C3 DC 03 00 00
从开头往下至004C5240用上面的代码粘贴,修改上面记下的二个地方的值A1、A2为实际值。然后修改004C5242这一句CALL。就OK了。
上一篇: linux两台服务器之间如何实现复制?