前段时间,由于工作需要,打算爆破浙江恒强科技推出了所谓的最新版制版软件。拿到手一看,乖乖,恒强那伙人这次用上加壳技术了。没办法,要爆破总的先脱壳啊,废话不说了,调入程序开始。。。
007F9001 > 60 pushad ;典型的加了壳的标记,呵呵
007F9002 E8 03000000 call 007F900A
007F9007 - E9 EB045D45 jmp 45DC94F7
007F900C 55 push ebp
007F900D C3 retn
一路小心翼翼的F7,没走几步,悲剧出现。。。
007F903C FF95 A90F0000 call dword ptr [ebp+FA9] ;GetModuleHandleA
007F9042 8985 8C040000 mov dword ptr [ebp+48C], eax
007F9048 8BF0 mov esi, eax
007F904A 8D7D 51 lea edi, dword ptr [ebp+51]
没想到走到GetModuleHandleA这步,程序挂起,没法子只好在007F9042下了断点,重新F8,一路顺风,往后都是些壳的内存分配操作,由于赶着吃中饭,一急之下,直接F8走到弹出注册框,有两种注册方式,一种是短信注册,一种是注册码注册,短信注册还是算了花1毛钱不说,还容易暴露我的手机号,果断冲注册码注册入手,随便输入一个注册码,顺手把MESSAGEBOX断点也设了,然后点击注册。。。
77D66534 > 8BFF mov edi, edi
77D66536 55 push ebp
77D66537 8BEC mov ebp, esp
77D66539 833D BC14D777 0>cmp dword ptr [77D714BC], 0
77D66540 74 24 je short 77D66566
77D66542 64:A1 18000000 mov eax, dword ptr fs:[18]
77D66548 6A 00 push 0
77D6654A FF70 24 push dword ptr [eax+24]
77D6654D 68 241BD777 push 77D71B24
77D66552 FF15 C412D177 call dword ptr [<&KERNEL32.Interlocke>; kernel32.InterlockedCompareExchange
77D66558 85C0 test eax, eax
77D6655A 75 0A jnz short 77D66566
77D6655C C705 201BD777 0>mov dword ptr [77D71B20], 1
77D66566 6A 00 push 0
77D66568 FF75 14 push dword ptr [ebp+14]
77D6656B FF75 10 push dword ptr [ebp+10]
77D6656E FF75 0C push dword ptr [ebp+C]
77D66571 FF75 08 push dword ptr [ebp+8]
77D66574 E8 BFA2FEFF call MessageBoxExW
77D66579 5D pop ebp
77D6657A C2 1000 retn 10
果然跳到了消息框处理,不用说,一定是说我注册码错误云云,要是正确,那我反而要吐血了。
小心翼翼F7一步步走顺便说句我注册码错了,你也不用弹“注册码错误,请用短信注册”消息框。
0042966D 68 FC7C4600 push 00467CFC ; UNICODE "please input register code"
00429672 8D4D EC lea ecx, dword ptr [ebp-14]
00429675 FF15 BC484600 call dword ptr [4648BC] ; mfc90u.78A35B3B
0042967B C745 FC 0000000>mov dword ptr [ebp-4], 0
00429682 6A 40 push 40
00429684 51 push ecx
00429685 8BCC mov ecx, esp
00429687 8965 F0 mov dword ptr [ebp-10], esp
0042968A 68 F87C4600 push 00467CF8
0042968F FF15 BC484600 call dword ptr [4648BC]
00429695 8945 DC mov dword ptr [ebp-24], eax
00429698 8D4D EC lea ecx, dword ptr [ebp-14]
0042969B 51 push ecx
0042969C E8 574FFFFF call 0041E5F8 ; jmp 到 SettingM.Message
从SettingM.Message出来后,往上一瞅,哈哈,居然冒出“please input register code”这句话,说明,注册码的初级验证代码在上面,一不做二不休,直接在这个函数的入口下了断点。
004295C0 55 push ebp 函数入口断点下在这里
004295C1 8BEC mov ebp, esp
004295C3 6A FF push -1
004295C5 68 6F014600 push 0046016F
004295CA 64:A1 00000000 mov eax, dword ptr fs:[0]
004295D0 50 push eax
004295D1 83EC 1C sub esp, 1C
004295D4 A1 14304A00 mov eax, dword ptr [4A3014]
004295D9 33C5 xor eax, ebp
004295DB 50 push eax
004295DC 8D45 F4 lea eax, dword ptr [ebp-C]
004295DF 64:A3 00000000 mov dword ptr fs:[0], eax
004295E5 894D E0 mov dword ptr [ebp-20], ecx
004295E8 6A 01 push 1
004295EA 8B4D E0 mov ecx, dword ptr [ebp-20]
004295ED E8 C251FFFF call 0041E7B4
。。。。。。
0042966B /74 60 je short 004296CD
0042966D |68 FC7C4600 push 00467CFC ; UNICODE "please input register code"
00429672 |8D4D EC lea ecx, dword ptr [ebp-14]
00429675 |FF15 BC484600 call dword ptr [4648BC] ; mfc90u.78A35B3B
关键跳转 je short 004296CD,输入注册码,则不会提示"please input register code"了,跟着je,F7一步步走,一下子跳到
004296CD 8B4D E0 mov ecx, dword ptr [ebp-20]
004296D0 E8 9BFEFFFF call 00429570
004296D5 85C0 test eax, eax
004296D7 75 65 jnz short 0042973E
004296D9 68 387D4600 push 00467D38 ; UNICODE "register code error, please SMS register"
004296DE 8D4D E4 lea ecx, dword ptr [ebp-1C]
004296E1 FF15 BC484600 call dword ptr [4648BC] ; mfc90u.78A35B3B
哈哈,你以为换成英文我就不认识你了,“register code error, please SMS register”,说明核心的注册码校验就在call 00429570里面,果然插入。
00412C60 56 push esi
00412C61 8B7424 0C mov esi, dword ptr [esp+C]
00412C65 57 push edi
00412C66 8B7C24 0C mov edi, dword ptr [esp+C]
00412C6A 56 push esi
00412C6B 57 push edi
00412C6C E8 2F000000 call 00412CA0
00412C71 83C4 08 add esp, 8
00412C74 85C0 test eax, eax
00412C76 75 11 jnz short 00412C89
00412C78 56 push esi
00412C79 57 push edi
00412C7A E8 D1000000 call 00412D50
00412C7F 83C4 08 add esp, 8
00412C82 85C0 test eax, eax
00412C84 75 03 jnz short 00412C89
00412C86 5F pop edi
00412C87 5E pop esi
00412C88 C3 retn
call 00412CA0 和 call 00412D50就是关键的两个校验处理函数,跟进去,没走几步ESP里面就指向了我输入的那个从小用到大的注册码“111111”
call 00412CA0
00412CA0 6A FF push -1
00412CA2 68 22114600 push 00461122
00412CA7 64:A1 00000000 mov eax, dword ptr fs:[0]
00412CAD 50 push eax
00412CAE 83EC 08 sub esp, 8
00412CB1 56 push esi
到
00412CE5 83C4 08 add esp, 8
00412CE8 8D4C24 08 lea ecx, dword ptr [esp+8]
00412CEC FF15 F0484600 call dword ptr [4648F0] ; mfc90u.78A87587
这里,注册和注册码都暴露出来,就等着程序算出真的那个注册码了,菩萨保佑不要等于111111
稍微走几步
00412D02 E8 59F6FFFF call 00412360
00412D07 8B4C24 2C mov ecx, dword ptr [esp+2C]
00412D0B 83C4 0C add esp, 0C
00412D0E FF15 D0484600 call dword ptr [4648D0] ; mfc90u.78AD873C
经过 call 00412360的运算,真正的注册码出来了。。直接输入这个注册码,程序成功激活。至于程序的壳,留着吧。。。。鄙人硬盘小。。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课