反沉沦 发表于 2015-12-29 22:41

爆破160个CrackMe之013 badboy

爆破160个CrackMe之013 badboy
最近正在拿160个CrackMe练手,将013的爆破思路记录下来

OD载入程序,来到OEP
0040105A   $- FF25 98704000 jmp dword ptr ds:[<&MSVBVM50.#ThunRTMain>;msvbvm50.ThunRTMain
00401060 > $68 0C354000   push 复件_bad.0040350C
00401065   .E8 F0FFFFFF   call <jmp.&MSVBVM50.#ThunRTMain_100>
很明显是VB写的程序,没有加壳


使用VB.Decompiler进行反编译,点击Code -> Form1 -> Command2_Click_4058EC,看到如下代码
Private Sub Command2_Click() '4058EC
'Data Table: 403D90
Dim var_90 As Long
Dim var_1CC As Variant
loc_4055EE: If (Len(Me.Text1.Text) < 5) Then
loc_4055FE:   Me.Text2.Text = "At least 5 characters!"
loc_405606:   Exit Sub
loc_405607: End If
loc_40560A: var_94 = "0110617121214051216101106141404110614140411091211100810101608040610121608100416"
loc_405622: var_98 = Me.Text1.Text
loc_40562D: var_A8 = 1 'Variant
loc_405641: For var_108 = 4 To CVar(Len(var_98)): var_C8 = var_108 'Variant
loc_405698:   var_90 = CLng((CDbl(var_90) + (CDbl(Asc(Mid$(var_98, CLng(var_C8), 1))) * Val(Mid$(var_94, CLng((var_A8 * 3)), 3)))))
loc_4056C4:   If ((var_A8 + 1) >= 39) Then
loc_4056CC:   var_A8 = 0 'Variant
loc_4056D0:   End If
loc_4056D3: Next var_108 'Variant
loc_4056DE: var_A8 = 1 'Variant
loc_4056F2: For var_168 = 4 To CVar(Len(var_98)): var_C8 = var_168 'Variant
loc_405764:   var_1CC = CVar((CDbl((Asc(Mid$(var_98, CLng(var_C8), 1)) * Asc(Mid$(var_98, CLng((var_C8 - 1)), 1)))) * Val(Mid$(var_94, CLng((var_A8 * 2)), 2)))) 'Double
loc_40576C:   var_178 = (var_178 + var_1CC) 'Variant
loc_40579D:   If ((var_A8 + 1) >= 39) Then
loc_4057A5:   var_A8 = 0 'Variant
loc_4057A9:   End If
loc_4057AC: Next var_168 'Variant
loc_405815: If (Me.Text2.Text = LTrim$(Str$(var_90)) & "-" & LTrim$(Str$(var_178))) Then
loc_405824:   Me.Command2.Visible = False
loc_405838:   Me.Command1.Visible = False
loc_40584C:   Me.Command5.Visible = True
loc_405860:   Me.Command3.Visible = False
loc_405874:   Me.Text2.Visible = False
loc_405888:   Me.Frame3.Visible = True
loc_4058BD:   Me.Label3.Caption = "Congratulation " & Me.Text1.Text & " !"
loc_4058D5: Else
loc_4058E2:   Me.Text2.Text = "Try Again!"
loc_4058EA: End If
loc_4058EA: Exit Sub
End Sub

切换到OD窗口,在004058EC处F2下断,运行程序,发现程序根本断不下来;
采用其它方法,bp __vbaStrCmp/__vbaStrComp/__vbaVarTstEq,程序也断不下来
猜到程序用P-code,使用WKTVBDebugger进行调试


关于P-code和WKTVBDebugger的详细介绍可以参考这个链接:http://www.52pojie.cn/thread-33118-1-1.html

用WKTVBDebugger载入程序
点击功能 ->运行,来到下面界面





中间会弹出一些对话框,不用管,最终来到这个界面





点击 窗口管理,在弹出的对话框的下拉列表中选择 Form1,下面的按钮由不可用变为可用,





点击Command,

在弹出的对话框中选择Command1,点击BPX;依次选择Command2,点击BPX;选择Command3,点击BPX;选择Command4,点击BPX;选择Command5,点击BPX
关闭刚才打开的两个窗口,回到WKTVBDebugger主窗口

按F5运行程序,badboy开始运行

在下拉框中选择 CrackMe 1.0 ,随便输入Serial,点击 Try,程序中断在
004051A0: 04 FLdRfVar 0012F42Ch
004051A3: 21 FLdPrThis 0014FF60h
004051A4: 0F VCallAd Form1.Text3
004051A7: 19 FStAdFunc004051AA: 08 FLdPr
004051AD: 0D VCallHresult get__ipropTEXTEDIT
004051B2: 6C ILdRf 00000000h
004051B5: 04 FLdRfVar 0012F424h
004051B8: 21 FLdPrThis 0014FF60h
004051B9: 0F VCallAd Form1.Label3
004051BC: 19 FStAdFunc
004051BF: 08 FLdPr
004051C2: 0D VCallHresult get__ipropCAPTIONLABEL
004051C7: 6C ILdRf 00000000h
004051CA: 30 EqStr
004051CC: 32 FFreeStr
004051D3: 29 FFreeAd:
004051DA: 1C BranchF 00405295 ?
004051DD: F4 LitI2_Byte: -> 0h 0

p-code中
1c → BranchF 条件跳转指令,如果栈顶的值为false则跳转(相当于汇编指令JNE/JNZ)1d → BranchT 条件跳转指令,如果栈顶的值为true则跳转(相当于汇编指令JE/JZ)1e → Branch 无条件跳转(嘿嘿,相当于汇编指令JMP)
因此判断004051DA: 1C BranchF 00405295 ? 为关键跳转语句,
由于p-code代码的特殊性, BranchF和 BranchT涉及到堆栈平衡,因此不能直接把BranchF改为Branch,可以把BranchF改为BranchT
利用WKTVBDebugger自带的内存编辑功能,将004051DA处的第一个字节1C改为1D,运行程序,
按F5运行程序,在下拉框中选择 CrackMe 1.0 ,随便输入Serial,点击 Try,发现 CrackMe 1.0爆破成功



用同样的步骤破解 CrackMe2.0,程序中断后,按F8单步跟踪,特别注意跳转指令,运行到下面时,
00405812: 1A FFree1Ad
00405815: 1C BranchF 004058D5 ?
00405818: F4 LitI2_Byte: -> 0h 0
0040581A: 21 FLdPrThis 0014FF60h
0040581B: 0F VCallAd Form1.Command2
0040581E: 19 FStAdFunc00405821: 08 FLdPr

判断00405815: 1C BranchF 004058D5 ?为关键跳转,把BranchF改为BranchT,利用WKTVBDebugger自带的内存编辑功能,将00405815处的第一个字节1C改为1D,运行程序,发现 CrackMe2.0爆破成功

由于WKTVBDebugger不能保存修改后的代码(可能是我没找到),可以利用010 Editor等工具修改修改原始文件
经过换算,004051DA对应文件偏移地址为45DA,00405815对应文件偏移地址为4C15,用010 Editor打开 badboy.exe,将45DA和4C15处的1C改为1D,保存文件,爆破成功

Small、蛋蛋 发表于 2015-12-29 22:52

叫我屌炸天 发表于 2015-12-29 22:56

zeal_nba 发表于 2015-12-29 22:58

每一段过程我还一时没看懂

farewellwho 发表于 2017-5-21 16:11

楼主您好,请问为什么要选择Command然后点击bpx?点击bpx做了什么?

farewellwho 发表于 2017-5-21 16:13

farewellwho 发表于 2017-5-21 16:11
楼主您好,请问为什么要选择Command然后点击bpx?点击bpx做了什么?

看了后面的描述明白了,应该是下断点的意思。
页: [1]
查看完整版本: 爆破160个CrackMe之013 badboy