吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6968|回复: 5
收起左侧

[原创] 爆破160个CrackMe之013 badboy

[复制链接]
反沉沦 发表于 2015-12-29 22:41
爆破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载入程序
点击功能 ->运行,来到下面界面





中间会弹出一些对话框,不用管,最终来到这个界面
IBD9ZQK_724_ER%`K]BK2DN.png




点击 窗口管理,在弹出的对话框的下拉列表中选择 Form1,下面的按钮由不可用变为可用,
KPTXDV`9A8J(5{8F}]H%@GG.png




点击Command
_~A0E`A}F$SM`ZB{8DRYECN.png
在弹出的对话框中选择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对应文件偏移地址为45DA00405815对应文件偏移地址为4C15010 Editor打开 badboy.exe,将45DA和4C15处的1C改为1D,保存文件,爆破成功

免费评分

参与人数 2热心值 +2 收起 理由
1485573943 + 1 谢谢@Thanks!
Sound + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

头像被屏蔽
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做了什么?

看了后面的描述明白了,应该是下断点的意思。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-23 18:22

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表