Crack013-badboy
关于题目
- 通过PEID分析,此题是P-Code编码的VB程序,下图是未破解前程序所有状态。两种模式,一种是序列号,一种是名称加序列号(输入字符5个以上),输入不正确会出现Try Again字样。
解题思路
如果此题采用OllyDBG动态分析,很难找到合适断点去修改指令破解。既然程序采用VB就可以使用VB.Decompiler进行静态分析并修改,达到破解的目的。
题解过程
- 首先使用PEID查壳,检测到是VB程序,如下图:
用VB.Decompiler加载exe文件,如下图
点击下方Combol1_Click事件进行分析,如下图
分别点击Command2和Command4进行进一步分析
- 根据分析,通过Disassemble找到判断语句对应的反汇编指令,在HEX Editor中搜索并进行更改,破解模式1:搜索4051DA并将1C改为1D或者将4051CA处FB 30改为FB 3D。破解模式二:搜索405815将1C改为1D或者将40580D处FB 30改为FB 3D,(部分指令含义见文章末尾附录),如下图:
- 破解成功截图
另外的方法:用OllyDBG来分析的话,可以找到正确密码,但是很难将其破解。简单介绍这种思路:
用OllyDBG将exe运行,选择断点:BreakPoint->VB APIs->Comaparision->_vbaStrcomp,然后F9运行程序,输入序列号:123456,点击try,F9运行程序会中断,看主模块的堆栈区,会显示出来正确的答案:7718158。
- 同理,名称加序列号模式也会出现正确序列号:
- 这时候名称不变再输入一次序列号57572-444610就会成功。
- 程序有一点特殊的地方:输入正确的序列号点try,显示”Congratulation !”和“OK”按钮,点OK按钮后,回到序列号页,又输入刚刚正确的的序列号,再次点try会显示”Try Again!”,这是因为在第一次注册成功的时候,根据上面分析Label3.caption被赋值:“Congratulation !”,只有再次输入Congratulation !才能再次成功,不再会跳出Try Again!
附录
- 跳转指令:
Branch-无条件跳转-1E
BranchT-栈顶数据为真则跳转-1D
BranchF-栈顶数据为假则跳转-1C
- 比较指令:
EqVarBool-比较变量相等:FB 33
NeVarBool-比较变量不相等:FB 40
EqStr-比较字符串相等:FB 30
NeStr-比较字符串不相等:FB 3D
Lt-判断是否小于
Gt-判断是否大于
补充
- 这里补充一下栈帧的概念,栈帧是用来实现过程/函数调用一种数据结构(就是栈),也就是记录每次函数调用的相关信息的记录单元。这个参考网址里面的内容很经典
- 关键跳转前面一般都是关键call,所以要写注册机的话,往这里分析
- idiv是有符号除法,影响的标志位有A,C,O,P,S,Z,32位中,隐含的除数有EDX和EAX,商存在EAX,余数存在EDX
- CDQ:这个指令把 EAX 的第 31 bit 复制到 EDX 的每一个 bit 上。 它大多出现在除法运算之前。它实际的作用只是把EDX的所有位都设成EAX最高位的值。也就是说,当EAX <80000000, EDX 为00000000;当EAX >= 80000000, EDX 则为FFFFFFFF。
- 标志位补充:
- O:Overflow,溢出标志
- S:Sign,符号标志,结果为负置1
- Z
- C:Carry Flag,进位
- A:Auxiliary carry Flag,辅助进位标志,记录运算时第3位(半个字节)产生的进位,有进位为1
- P:Parity,奇偶标志
- D:Direction,方向标志
- I:Interrupt,中断标志
- T:Trap,陷阱标志
- 一些汇编指令
- shl,逻辑左移位,最后移出的一位写入cf中,最低位用0补充