[原创]softDefender破解
关于脱壳点击这里有介绍
用softDefender未注册版加壳后的程序运行就弹出一个提示框.很讨厌.下面来破解一下.
我尽量把我的思路写下来,请各位大侠多指教.
od加载脱壳后的程序.运行.
第一反应,看看关于.里面有UNREGISTER VERSION字样.
用字符串搜索插件,很快可以找到.往上拉很容易发现 test ... je...jmp结构.
00412A4A A1 D4D24600 mov eax, dword ptr [0x46D2D4] 00412A4F 85C0 test eax, eax 00412A51 74 4F je short 00412AA2 ;下断,修改z标志位 00412A53 68 14DD4500 push 0045DD14 ; registered to:
在je处下断,断下后修改z标志位,关于窗口就会变成registered to:
继续找0x46D2D4数据来源.在0x46D2D4处下硬件写入DWORD断点.
重新加载运行:
0040F088 897E 70 mov dword ptr [esi+0x70], edi 0040F08B C746 68 E7CB000>mov dword ptr [esi+0x68], 0xCBE7 0040F092 897E 64 mov dword ptr [esi+0x64], edi 0040F095 893D D4D24600 mov dword ptr [0x46D2D4], edi ;这里初始值 0040F09B 8BC6 mov eax, esi
删除硬件断点.
因为esi中的值不为0,而且将edi改为esi后代码字节长度不会变.将修改复制到可执行文件.
不会这么简单吧.运行,点击关于,果然没有UNREGISTER VERSION字样.但是一加壳,运行加壳后的程序依然还是会弹出提示框,果然不会这么简单.
加载修改后的文件,再次搜索字符串reg, 这样找到的结果会多点.
就会找到reg.dat reginfo,都在一起,附近还有username code.
这应该没错了.在reg.dat处下断点.
0041265D 68 D0DC4500 push 0045DCD0 ; reg.dat 00412662 E8 E9760200 call 00439D50 00412667 8D4C24 64 lea ecx, dword ptr [esp+0x64] 0041266B E8 60970000 call 0041BDD0 00412670 8D4C24 60 lea ecx, dword ptr [esp+0x60] 00412674 E8 97980000 call 0041BF10 00412679 84C0 test al, al 0041267B 0F84 75030000 je 004129F6 ;这里的je不能跳 nop掉.
f8单步跟到je处,如果跳走就跳过了usrname code这些敏感信息,所以不能跳.
暂时修改z标志位,继续跟.中间从reg.dat文件中读了username,code.那些call跟进去也没发现啥.
跟到
00412911 8D4C24 24 lea ecx, dword ptr [esp+0x24] 00412915 C68424 20020000>mov byte ptr [esp+0x220], 0xB 0041291D 895424 4C mov dword ptr [esp+0x4C], edx 00412921 E8 4A8B0000 call 0041B470 ; ? 卡住 00412926 85C0 test eax, eax 00412928 74 67 je short 00412991
发现到call 0041B470 就会卡住,重新加载,到这个call f7进去看看.
0041B4D7 56 push esi 0041B4D8 C74424 14 00000>mov dword ptr [esp+0x14], 0x0 0041B4E0 33DB xor ebx, ebx 0041B4E2 53 push ebx 0041B4E3 8D8C24 44010000 lea ecx, dword ptr [esp+0x144] 0041B4EA 68 288D4600 push 00468D28 ; \\.\physicaldrive%d 0041B4EF 51 push ecx 0041B4F0 E8 D2D40000 call 004289C7 0041B4F5 83C4 0C add esp, 0xC 0041B4F8 8D9424 40010000 lea edx, dword ptr [esp+0x140] 0041B4FF 6A 00 push 0x0 0041B501 6A 00 push 0x0 0041B503 6A 03 push 0x3 0041B505 6A 00 push 0x0 0041B507 6A 03 push 0x3 0041B509 68 000000C0 push 0xC0000000 0041B50E 52 push edx 0041B50F FF15 18724D00 call dword ptr [<&kernel32.CreateFile>; KERNEL32.CreateFileA
这里读取了磁盘信息不知道用来干啥.
继续f8到
0041B637 85C0 test eax, eax 0041B639 75 10 jnz short 0041B64B 0041B63B 8D8C24 34020000 lea ecx, dword ptr [esp+0x234] 0041B642 E8 59000000 call 0041B6A0 ; ?又卡住 0041B647 85C0 test eax, eax 0041B649 74 42 je short 0041B68D
发现又被卡住,只好重新加载再f7进去
0041B70C C640 01 00 mov byte ptr [eax+0x1], 0x0 0041B710 BF 3C8D4600 mov edi, 00468D3C ; winio.sys 0041B715 83C9 FF or ecx, 0xFFFFFFFF 0041B718 33C0 xor eax, eax 0041B71A F2:AE repne scas byte ptr es:[edi] 0041B71C F7D1 not ecx 0041B71E 2BF9 sub edi, ecx
又是不知道在用winio.sys干啥.继续f8...
然后就在那里面循环循环,走不出来.
只好把retn前不远处的jl跳转修改s标志位给改了.
0041BA2E ^\0F8C 24FDFFFF jl 0041B758 ;往上跳循环 nop掉 0041BA34 8B4424 20 mov eax, dword ptr [esp+0x20] 0041BA38 5F pop edi 0041BA39 5E pop esi 0041BA3A 5D pop ebp 0041BA3B 5B pop ebx 0041BA3C 81C4 E8010000 add esp, 0x1E8 0041BA42 C3 retn
运行.加壳.发现加壳后的程序不会弹对话框了.
所以nop掉两次跳转.然后复制到可执行文件 .暴破成功.
