SWF探索者1.4破解教程:从脱壳到获取注册码全流程
这款SWF探索者1.4,是一款功能强大的Flash动画播放器。早期版本如1.1和1.2曾被高手破解,但1.4版本采用了新的保护壳——PECompact 1.68—1.84,并加入了时间限制。不过不必担心,破解难度属于中等水平,适合有一定逆向基础的朋友练习操作。
先走一遍流程:安装软件后进入“关于”界面,输入注册信息——用户名填写“king”,注册邮箱输入“winners365@163.com”,注册码随意填写“999555”(当然无效)。点击注册,弹出“ThanksReg”提示。好,目标锁定。
用PEiD查壳,确认是PECompact 1.68—1.84。这里直接使用专用脱壳工具unpecompact完成脱壳,保存为unpacked.exe。接下来用C32ASM 0.412反汇编,搜索字符串“ThanksReg”,双击定位到关键代码位置:
004C79E8 .^E9 DFC7F3FF JMP unpacked.004041CC
004C79ED .^EB F0 JMP SHORT unpacked.004C79DF
004C79EF . 8D4D DC LEA ECX,DWORD PTR SS:[EBP-24]
004C79F2 . A1 10244D00 MOV EAX,DWORD PTR DS:[4D2410]
004C79F7 . 8B00 MOV EAX,DWORD PTR DS:[EAX]
004C79F9 . BA B47A4C00 MOV EDX,unpacked.004C7AB4 ; ASCII "ThanksReg"
004C79FE . E8 31EDFFFF CALL unpacked.004C6734
004C7A03 . 8B45 DC MOV EAX,DWORD PTR SS:[EBP-24]
004C7A06 . E8 3592F7FF CALL unpacked.00440C40
004C7A0B . A1 04254D00 MOV EAX,DWORD PTR DS:[4D2504]
004C7A10 . 8B00 MOV EAX,DWORD PTR DS:[EAX]
004C7A12 . E8 851CFAFF CALL unpacked.0046969C
004C7A17 . 33C0 XOR EAX,EAX
004C7A19 . 5A POP EDX ; kernel32.7C81774D
004C7A1A . 59 POP ECX ; kernel32.7C81774D
乍一看,这里只是弹窗的收尾部分。向上翻阅,发现前面有“RegCode”字样的字符串引用,说明此处正在进行注册码的比对或处理逻辑:
004C79C5 |. BA A47A4C00 MOV EDX,unpacked.004C7AA4 ; ASCII "RegCode"
004C79CA |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004C79CD |. E8 D6F6FBFF CALL unpacked.004870A8
004C79D2 |. 33C0 XOR EAX,EAX
004C79D4 |. 5A POP EDX ; kernel32.7C81774D
004C79D5 |. 59 POP ECX ; kernel32.7C81774D
004C79D6 |. 59 POP ECX ; kernel32.7C81774D
004C79D7 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX ; ntdll.KiFastSystemCallRet
004C79DA |. 68 EF794C00 PUSH unpacked.004C79EF
004C79DF |> 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004C79E2 |. E8 51C0F3FF CALL unpacked.00403A38
004C79E7 \. C3 RETN
在OllyDbg中,先对004C79C5下断,然后按F9运行——奇怪,居然没断下来。说明程序在初始化阶段就已经计算好了注册码,并存储在某个内存地址中。换个思路,寻找与注册表读写相关的API调用。
很快找到一处可疑的调用:
00487058 |. E8 7BDCF7FF CALL unpacked.00404CD8
0048705D |. 50 PUSH EAX ; |ValueName = NULL
0048705E |. 8B46 04 MOV EAX,DWORD PTR DS:[ESI+4] ; |
00487061 |. 50 PUSH EAX ; |hKey = 0
00487062 |. E8 31FEF7FF CALL ; \RegQueryValueExA(个人认为与注册有关!)
00487067 |. 85C0 TEST EAX,EAX
00487069 |. 0F94C3 SETE BL
0048706C |. 8B0424 MOV EAX,DWORD PTR SS:[ESP] ; kernel32.7C81774D
0048706F |. E8 50FCFFFF CALL unpacked.00486CC4
00487074 |. 8845 00 MOV BYTE PTR SS:[EBP],AL
00487077 |. 8BC3 MOV EAX,EBX
00487079 |. 5A POP EDX ; kernel32.7C81774D
这里调用了RegQueryValueExA,很明显是在读取注册表中的注册信息。果断在此处下断。重新运行程序后,遇到SEH异常,用Shift+F7单步跟踪,最终在7C82DAD4位置停下。此时查看堆栈窗口(12EC4C地址),赫然出现一个ASCII字符串:“D092E68F”——没错,这就是真正的注册码。
区区一个八位字符,竟锁住了功能如此完整的动画播放器。破解的过程,有时就是一层窗户纸。有兴趣的朋友不妨亲手实践一遍,从定位关键点直到获取注册码,体会逆向分析的乐趣。
