160个Crackme之025学习笔记

本帖最后由 海天一色001 于 2019-6-11 09:30 编辑

看到025,图标显示就是一个VB程序。老规矩,先打开看看:



肯定是利用时间控件,5秒后才能继续,标题栏上显示要杀掉这个窗口,这也是破解的第一个要求了:
点击“Continue"按键,程序进入第二个窗口:



点击“About”按钮,又出现一个窗口,基本没什么用处:



输入“1234567890”,点击”Check“按钮,弹出错误提示框来,有提示应该就好办:



第一步、查壳:



程序用VB5.0编写,无壳:
第二步,杀NAG
VB程序,还是使用VB Decompiler来反编译一下:



仔细从VB Decompiler中查看,分别点击左边Forms组中的3个Form,从右边找不到是谁先启动的,但能看出来Form1是主程序窗口,Form2是NAG窗口,Form3是About窗口;
再点击Code中的3个Form,这下可以看到Form1有个Form_Load_405905,从右边窗口中看到了程序启动的参数:



其中,
loc_00405948: Me.Visible = False
loc_00405986: Form2.Visible = True
00405948处Form1设为隐藏,Form2设为显示。那么在这两处将它们反过来不就行了吗?



根据这个思路,将程序加载入OD,然后Ctrl+G,输入405948,点击“OK”,程序来到00405948处:
观察00405948和00405986两处代码,分别为“FF96 BC010000”和“FF90 BC010000”,只错一个,那么我将“6”和“0”改一下看看:



修改后反汇编命令中eax和esi两个进行了对调:



将修改的内容保存到可执行文件CodeZero.1.killnag.exe,运行一下,不行,出错了!



大概意思是窗体的variable属性没设置!!!说明我这样的修改有误,不能这样做。再返回OD,仔细查看:这两处设置参数的call会不会调用上面两句中的参数?00405945处是“6A 00”,反汇编为“push 0x0”,00405981处为“6A FF”,反汇编为“push -0x1”,一般00和FF表示true和false,但这里可能正好相反,0是false,-1是true。
[Asm] 纯文本查看 复制代码

00405945  |.  6A 00         push 0x0
00405947  |.  57            push edi
00405948  |.  FF96 BC010000 call dword ptr ds:[esi+0x1BC]            ;  form1.visable=false

00405981  |.  6A FF         push -0x1
00405983  |.  56            push esi
00405984  |.  8B06          mov eax,dword ptr ds:[esi]
00405986  |.  FF90 BC010000 call dword ptr ds:[eax+0x1BC]            ;  form2.visable=true

那么将原来修改的地方恢复,将00405945处的“6A 00”改为“6A FF”, 00405981处的“6A FF”改为“6A 00”,再将修改的所有内容保存为可执行文件CodeZero.1_killnag.exe,再试一下,成功了!



将CodeZero.1_killnag.exe加载入VB Decompiler中,查看Form_Load_405905的代码,和上面未修改前对照,正好反过来,说明这次是正确的。仔细想一下,遇到call之类给程序赋参数值时,应该向上面找一找参数从何而来。以前其实已经多次发现了这一点,但没留心,以后一定注意,少走一些弯路。



第三步、爆破
用VB Decompiler生成map文件,用于导入OD中作为注释:



用OD加载CodeZero.1_killnag.exe,再用中文智能搜索查找字符串:



很容易找到了成功和失败的提示内容。双击0040577B这一行来到CPU窗口,查看程序代码:



在0040577B上方的0040576E处看到一个跳转命令“je short CodeZero.0040579A”跳过了成功提示,那么nop掉它试一试:



将修改后的内容保存到可执行文件CodeZero.1_killnag_nop.exe,运行一下,输入“1234567890”,点击“Check”按钮,弹出正确提示框,爆破完成。



第四步、追码
撤消修改,观察代码情况:0040576E这一句指令是“je short CodeZero.0040579A”,当标志位ZF为1时跳过了成功提示,再向上查看,在00405746处有个比较指令,这里才能使ZF标志位发生改变。那么就看si和bx的值是怎么来的了。再向上一堆令人头疼的运算,看到了MSVBVM50.__vbaStrCmp函数,再向上,看到了参数是假码和真码,而注册码竟然是个明码“55555”!验证一下,在025和CodeZero.1_killnag.exe中输入“555555”,点击“Check”按键,成功提示均出现了。
可是这里的代码令人有点迷惑,虽然知道是调用MSVBVM50.__vbaStrCmp进行的比较,把返回结果存入[eax],再把[eax]赋值给[esi],然后用一堆运算来把[esi]处理一番,最后比较[si]与[bx], ([bx]==0),为什么不直接比较[eax]是否==0来判断字符串是否相等呢?
自己用VB写一个字符比较的程序,然后反汇编看看:
[Visual Basic] 纯文本查看 复制代码

Private Sub Command1_Click()
    If Text1.Text = "1234567890" Then
        MsgBox "YES"
    Else
        MsgBox "NOT"
    End If
End Sub

自己编写的StrCmp.exe程序反汇编过来部分代码如下:
[Asm] 纯文本查看 复制代码

00401BCF   . |FF15 14104000 call dword ptr ds:[<&MSVBVM60.__vbaHresultChec>;  msvbvm60.__vbaHresultCheckObj
00401BD5   > \8B45 E8       mov eax,dword ptr ss:[ebp-0x18]
00401BD8   .  50            push eax
00401BD9   .  68 7C174000   push StrCmp.0040177C                           ;  1234567890
00401BDE   .  FF15 38104000 call dword ptr ds:[<&MSVBVM60.__vbaStrCmp>]    ;  msvbvm60.__vbaStrCmp
00401BE4   .  8BF0          mov esi,eax
00401BE6   .  8D4D E8       lea ecx,dword ptr ss:[ebp-0x18]
00401BE9   .  F7DE          neg esi
00401BEB   .  1BF6          sbb esi,esi
00401BED   .  46            inc esi
00401BEE   .  F7DE          neg esi
00401BF0   .  FF15 88104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeStr>]   ;  msvbvm60.__vbaFreeStr
00401BF6   .  8D4D E4       lea ecx,dword ptr ss:[ebp-0x1C]
00401BF9   .  FF15 8C104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeObj>]   ;  msvbvm60.__vbaFreeObj
00401BFF   .  B9 04000280   mov ecx,0x80020004
00401C04   .  B8 0A000000   mov eax,0xA
00401C09   .  66:3BF7       cmp si,di

025程序部分代码如下:
[Asm] 纯文本查看 复制代码

00405719   .  E8 3CBAFFFF   call <jmp.&MSVBVM50.__vbaHresultCheckObj>
0040571E   > \FF75 E8       push dword ptr ss:[ebp-0x18]                         ;  输入的假码
00405721   .  68 A4264000   push CodeZero.004026A4                               ;  55555
00405726   .  E8 3BBAFFFF   call <jmp.&MSVBVM50.__vbaStrCmp>                     ;  字符串比较,结果存入[eax],关键比较
0040572B   .  8BF0          mov esi,eax                                          ;  以下是对eax的值进行处理,绕了一大圈,到cmp si,bx 结果不变
0040572D   .  8D4D E8       lea ecx,dword ptr ss:[ebp-0x18]
00405730   .  F7DE          neg esi                                              ;  msvbvm50.7412C350
00405732   .  1BF6          sbb esi,esi                                          ;  msvbvm50.7412C350
00405734   .  46            inc esi                                              ;  msvbvm50.7412C350
00405735   .  F7DE          neg esi                                              ;  msvbvm50.7412C350
00405737   .  E8 18BAFFFF   call <jmp.&MSVBVM50.__vbaFreeStr>
0040573C   .  8D4D E4       lea ecx,dword ptr ss:[ebp-0x1C]
0040573F   .  E8 0ABAFFFF   call <jmp.&MSVBVM50.__vbaFreeObj>
00405744   .  6A 0A         push 0xA
00405746   .  66:3BF3       cmp si,bx                                            ;  关键比较

从00401BCF到00401C09处,与025程序中的00405719到00405746处非常相似,
估计是反汇编时编译器自动生成的这一堆代码,基本上可以认为作用是
cmp string1,string2
je XXXXXXXXX
其他的不用管就行了。
附件

025.zip

(261.94 KB, 下载次数: 0)

2019-6-11 09:28 上传
点击文件名下载附件

下载积分: 吾爱币 -1 CB

,含CM原程序、爆破后的程序、OD的调试文件等。
百度链接是:http://pan.baidu.com/s/1skMkJY9,密码: 86pm,160个CM、我已练习过的前25个crackme程序(不含012)都在里面。

THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
  • 管埋员

    昵称

  • 取消

    请填写用户信息: