欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

北斗4.1壳改壳之一 用等价替换代码法修改壳头

程序员文章站 2022-05-09 20:33:39
摘自:jgaoabc的空间 最近闲着无事,对北斗4.1壳做了点研究,发现这个壳兼容性较好,压缩性大,而且改壳比较容易,所以向大家推荐我的改壳方法,经过修改后,瑞星2009和金山2009是脱不...

摘自: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了。

北斗4.1壳改壳之一 用等价替换代码法修改壳头
北斗4.1壳改壳之一 用等价替换代码法修改壳头