华夏黑客同盟
crack游戏(上)1~4关
原创版
----By Fox
……………………………………………………………………….QQ: 78930
高手不要见笑。。第一次写文章:)
第一关:
我拿到的时候就知道第一关很简单:) 凭感觉应该是明码验证的所以。。
文件名:1.rar||1.exe
MD5特征: 5afa26d753a87f0335c63ad0e60e589d 1.exe
是否有壳:无
编写语言:Visual Basic 6 SP6
用OD载入后会提示可能加壳 但是是否有壳:无 所以就毫不犹豫地按了是。 看了一下入口代码 觉得是没有加壳。F9运行 输入用户名 12345678 注册码 19900114(我的生日):) 弹出Msgbox所以根据经验 直接下断 右击->所有模块间调用->在两处Msgbox上面下断。按注册后OD断下 向上翻看到字符串
0040A2F9 . C745 90 909A4000 mov dword ptr ss:[ebp-70],1.00409A90 ; UNICODE "wrong!!! try it again"
0040A29B . C745 90 489A4000 mov dword ptr ss:[ebp-70],1.00409A48 ; UNICODE " welldone!! clever boy !!"
看到了这个相比各位应该知道了吧。再看看有没有调转代码 果真就在不远处
0040A24D . 68 389A4000 push 1.00409A38 ; UNICODE "77169"
0040A252 . FF15 3C104000 call dword ptr ds:[<&MSVBVM60.__vbaStrCmp>] ; MSVBVM60.__vbaStrCmp
0040A258 . 85C0 test eax,eax
0040A25A . B9 04000280 mov ecx,80020004
0040A25F . B8 0A000000 mov eax,0A
0040A264 . 894D A0 mov dword ptr ss:[ebp-60],ecx
0040A267 . 8945 98 mov dword ptr ss:[ebp-68],eax
0040A26A . 894D B0 mov dword ptr ss:[ebp-50],ecx
0040A26D . 8945 A8 mov dword ptr ss:[ebp-58],eax
0040A270 . 75 5E jnz short 1.0040A2D0
根与猜测MSVBVM60.__vbaStrCmp应该就是字符串比较函数 所以在上面下断
看堆叠窗口
0012F398 00409A38 UNICODE "77169"
0012F39C 0015A824 UNICODE "19900114"
所以应该注册码就是77169取消所以断点 在注册码那里输入77169试一试 通过验证:)在到网页那里即可得到下一关的程序
过关密码:77169
本关新手提示(其实我也是新手):
本关的用户名其实是用来麻痹人的,输出任何用户名都是77169,其实从产生的注册码是77169就知道绝对不可能是运算产生的。。不可能这么巧吧。
本关总结:本关难度很小,但要求对VB的相关常用函数比较熟悉。
第二关:
看说明
文件名:project2.rar||project2.exe
MD5特征: 68d296afa813a92a76fc93e9c193dc41 (Project2.exe)
是否有壳:无
编写语言:DELPHI 7.0
本关要求的NAME:124315391
感觉没有这么简单了。因为要求了Name验证了124315391
出入试验码 name 124315391
注册码:19900114
弹出出错提示:
由于是Delphi的 所以先试着 bpx MessageBoxA
OD并没有断下。 怎么办呢?算了用dede载入吧 看来分析delphi的还得专用工具OD落伍了:)
经过了近5分钟的处理终于翻编译晚了。。真慢啊!
打开按钮单击过程
看到
* Reference to: System.@LStrCmp;
|
00467906 E84DC9F9FF call 00404258
0046790B 740C jz 00467919
* Possible String Reference to: '重来撒....'
|
0046790D B870794600 mov eax, $00467970
* Reference to: Dialogs.ShowMessage(AnsiString);
|
00467912 E8A5FEFBFF call 004277BC
00467917 EB16 jmp 0046792F
Possible String Reference to: '做对了!!!'
这不是先出错的字符串吗?
哈 于是载入OD
* Reference to: SysUtils.StrToInt(AnsiString):Integer;
|
004678F0 E89305FAFF call 00407E88
在004678F0 下断
不过之后看寄存器 eax=0768E6FF 黑? 这个是什么?不要急。把这个用计算器转换一下就使124315391
所以在此证明了我们的猜想 程序先将Name字符串转换成为数字并处理 所以下面肯定就是运算代码了 所以继续往下看
004678F5 |. 35 1DD20C05 xor eax,50CD21D eax与50CD21Dxor 并保存在eax里面 结果dede看004678FA 8D55F0 lea edx, [ebp-$10]
Reference to: SysUtils.IntToStr(Integer):AnsiString;overload;
* Reference to: SysUtils.IntToStr(Integer):AnsiString;overload;
|
004678FD E84A04FAFF call 00407D4C
00467902 8B55F0 mov edx, [ebp-$10]
00467905 58 pop eax
* Reference to: System.@LStrCmp;
|
00467906 E84DC9F9FF call 00404258
0046790B 740C jz 00467919 运算后的Name与注册码明码比较相等就跳
* Possible String Reference to: '重来撒....'
|
0046790D B870794600 mov eax, $00467970
* Reference to: Dialogs.ShowMessage(AnsiString);
|
00467912 E8A5FEFBFF call 004277BC
00467917 EB16 jmp 0046792F
* Possible String Reference to: '做对了!!!' 。。。。。。过关
|
00467919 B884794600 mov eax, $00467984
所以很简单。本关的注册码就是name 与50CD21D xor后与注册码比较。
注册机就不写了
过关密码:40121570
新手提示:对于delphi这类程序不能像Vc那样可以直接在MessageBoxA下断。应该灵活运用工具
本关小结:活用工具Dede反编译的deiphi应用程序:)
第三关:
文件名:3.rar||3.exe
MD5特征: 941eeb4593c5b80f07f705bfd9711775 (3.exe)
是否有壳:无
编写语言:Action Script(FLASHMX2004)
本关要求的NAME:huaxia
我晕。。。。FlashMx2004的不是程序。看来OD也没有用了。哎。。。。。。。。
因为我一起做过Flash所以对Flash脚本有些了解。 可以直接反编译
在看雪上面找的。
SWF Decompiler MX 2004 v1.8.40430
反编译SWF文件。
晕。。用Decompiler MX 2004打开晕 不能打开exe。。倒。。那转化一下吧 在Google搜索了一下exetoswf的程序
转换后用Decompiler MX 2004 载入
在右边的菜单上面会看到Action里面有两个按钮 button1 和button3
button1 对应确定(因为在button文件架里面可以预览到button对应的按钮)
看action
// Action script...
on (release)
{
if (77 + name + 169 == key)
{
gotoAndStop(2); ---调到第二桢
}
else
{
gotoAndStop(3); 调到第3桢
} // end if
}
下面来看看(2) 和(3)分别对应着什么
打开Frame文件架 里面有1 2 .3的图画 预览可知2对应着well done也就是成功。
所以 注册机就是77 + name + 169(字符串)
过关密码:77huaxia169
新手提示:注意不要只局限于OD,有些东西要专用:)
本关小结:本关很有意思 用一个Flash来模拟验证 不过要对as有一定的了解。特别是他的字符串的连接是直接用+号 并且不需要用引号的 。(我当时做的时候都差点错了, 我都把她想成了是数值相加。汗。。)
第4关
文件名:4x.rar||4x.exe
MD5特征: e1f2e2217fb8da747018e8935b5ee281 (4x.exe)
是否有壳:无
编写语言:Visual C++ 6.0
本关要求的NAME:123456
我拿到的第一眼就是高兴。。终于是VC的了。。哈 免得看繁琐的运行库调用。
想都没有想就用OD载入
ps:我当时用OD载入失败了 然后由直接用explorer启动。 提示找不到mfc42d.dll
所以又从网上面下载了这个DLL。。。
老办法 输入Name:123456
注册码 19900114
提示出错。。 一看就知道是MessageBox所以直接bpx
晕死。。。没有断下来?看看所有模块参考。。倒。。全部是MFC的 而且没有MFC的符号 全部是市#xxx的形式。。这下怎么办呢?网上面搜索了一下他的符号文件 可是没有 ,,算了看来只能硬着头皮过了:)
在翻阅所有模块调用的时候无意中发现了atoi函数。。那不就是字符串-〉数值得函数吗?好吧 那么我们就在这里下断!
00401A3B |. 50 push eax ; /s
00401A3C |. FF15 30764100 call dword ptr ds:[<&MSVCRTD.atoi>] ; \atoi
这里断下。 看寄存器 窗口发现eax包含的是字符串123456的指针 步过
eax,保存着1E240(123456的十六进制) 下面就要留心对eax的操作了
00401A42 |. 83C4 04 add esp,4
00401A45 |. 3BF4 cmp esi,esp
00401A47 |. E8 4E030000 call <jmp.&MSVCRTD._chkesp> ---〉顺便说一下 这个是检查堆叠溢出的代码
00401A4C |. 8D9400 712D0100 lea edx,dword ptr ds:[eax+eax+12D71] ---〉出现了吧 eax 还是1E240 edx=12D71+1E240+1E240
00401A53 |. 8955 E4 mov [local.7],edx
edx存局部变量
00401A56 |. 8D4D E8 lea ecx,[local.6]
00401A59 |. E8 2A030000 call <jmp.&MFC42D.#880> ---〉步入发现其实就是一个取地址
00401A5E |. 8BF4 mov esi,esp
00401A60 |. 50 push eax ; /s
00401A61 |. FF15 30764100 call dword ptr ds:[<&MSVCRTD.atoi>] ; \atoi
注册码=012FA6D2
00401A67 |. 83C4 04 add esp,4
00401A6A |. 3BF4 cmp esi,esp
00401A6C |. E8 29030000 call <jmp.&MSVCRTD._chkesp>
00401A71 |. 99 cdq
00401A72 |. B9 0A000000 mov ecx,0A
00401A77 |. F7F9 idiv ecx
注册码除以0A(11)
00401A79 |. 05 40E20100 add eax,1E240
注册码+1e240
00401A7E |. 8945 E0 mov [local.8],eax
保存注册码到局部变量
00401A81 |. 8B55 E4 mov edx,[local.7]
00401A84 |. 3B55 E0 cmp edx,[local.8]
比较处理后的注册码与Name
00401A87 |. 75 10 jnz short 4x.00401A99
如果不相等就跳
00401A89 |. 6A 00 push 0
00401A8B |. 6A 00 push 0
00401A8D |. 68 A4524100 push 4x.004152A4
00401A92 |. E8 EB020000 call <jmp.&MFC42D.#1136>
00401A97 |. EB 0E jmp short 4x.00401AA7
这里
00401A99 |> 6A 00 push 0
00401A9B |. 6A 00 push 0
00401A9D |. 68 8C524100 push 4x.0041528C
0041528C CA A7 B0 DC C1 CB 21 21 失败了!!
00415294 D4 D9 CA D4 CA D4 B0 C9 再试试吧
0041529C 21 21 00 !!.
没有猜错。。这里就弹出信息框报错了。 所以直接步过
00401AA2 |. E8 DB020000 call <jmp.&MFC42D.#1136>
果然出错了。
00401AA7 |> C645 FC 00 mov byte ptr ss:[ebp-4],0
00401AAB |. 8D4D E8 lea ecx,[local.6]
00401AAE |. E8 C9020000 call <jmp.&MFC42D.#684>
00401AB3 |. C745 FC FFFFFFFF mov [local.1],-1
00401ABA |. 8D4D EC lea ecx,[local.5]
00401ABD |. E8 BA020000 call <jmp.&MFC42D.#684>
00401AC2 |. 8B4D F4 mov ecx,[local.3]
00401AC5 |. 64:890D 00000000 mov dword ptr fs:[0],ecx
00401ACC |. 5F pop edi
00401ACD |. 5E pop esi
00401ACE |. 5B pop ebx
00401ACF |. 83C4 60 add esp,60
00401AD2 |. 3BEC cmp ebp,esp
00401AD4 |. E8 C1020000 call <jmp.&MSVCRTD._chkesp>
00401AD9 |. 8BE5 mov esp,ebp
00401ADB |. 5D pop ebp
00401ADC \. C3 retn
所以注册机原理很简单:
Name*2+12D71=注册码/0x0A+1E240
注册机:(易语言)
.版本 2
Namea = 到整数 (Name)
Namea = Namea × 2
Namea = Namea + 77169
Namea = Namea - 123456
Namea = Namea × 10
返回 (到文本 (Namea))
过关密码:2006250
新手提示:当遇到MFC的时候首先是考虑调试符号,如果实在不行,可以直接对MPC下断点,虽然要麻烦一点
本关小结:注意对Vc的MFC运行库了解,不要被困难吓倒
累死了 以后再来写。 自认为写的还不错。。。。。希望能够加精。。鼓励一下新人嘛^_^
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!