P-Code引发的爆破惨案
{:6_218:}以前草草跑了两圈VB6运行库的PCODE解释引擎,很EASY+TYPICAL的一个基于堆栈的虚拟机结构。没有仔细看。今天微机课的时候一同班同学DOWDNLOAD了一个CM下来,问我如何干掉。我扫了一下DEDE,大汗,PCODE程序……今天是注定要亲密接触了。{:6_207:}嗯,写完这篇文章之后我发现是160个CrackMe里面第38号CrackMe的……真TM的是无处不在。Private Sub Form_Initialize() '40DC38
'Data Table: 402AEC
loc_40DC34: global_76 = &H45A0
loc_40DC37: Exit Sub
End Sub
&H表示十六进制(和0x前缀,H后缀一个道理)。
-----------分割线-------------
首先尝试无脑爆破之。但是PCODE的机器码我没有研究过,嗯,网上也找不到资料。PASS掉。不能改机器码。然后,本人想到了改Handler。我真的要为我的机智点10086个赞了。{:6_215:}
把运行库从系统目录里面抠出来,修改后扔到CM的目录下。
VB5运行库在此。
loc_40E4DE: If ((CVar(Me.txtkey.Text) - var_94) = CVar(Len(Me.txtname.Text))) Then
loc_40E502: MsgBox("Wow, you have found a correct key!", &H40, "Correct key", var_FC, var_11C)
loc_40E533: MsgBox("Mail me, how you got it: CyberBlade@gmx.net ", &H40, "Correct key!", var_FC, var_11C)
loc_40E550: Me.Command2.Caption = "Exit"
loc_40E55B: Else
大兄弟可还记得我们开头的时候贴出的代码?0x40E4DE,这里就是PCODE的机器码地址了。在上面下一个内存访问断点,中断在VB5运行库的FFree1Str Handler上。(实际爆破的时候不能直接改成无条件跳转,堆栈会不平衡)
7411E712 8A06 mov al, byte ptr
7411E714 46 inc esi
7411E715 FF2485 94ED1174 jmp dword ptr
取操作码,指令流递增,从Handler表里面取地址。跳转之,没什么好解释的。凡Handler末尾必定是这段代码。接下来单步会走到BranchF Handler上。
7411D545 59 pop ecx
7411D546 66:0BC9 or cx, cx
7411D549^ 74 D9 je short 7411D524
这里这个or cx,cx是什么意思呢?一般来说,只有0 or 自己才结果为0(ZF为0,JE跳转),其它数都是非0。
意思是说,这条指令的意思是,栈顶的数为False,我就跳,True就不跳。
步过Pop ecx后,把ecx修改为1,之后提示成功。
此时记录ESI的地址,0x40E4DF。
然后把VB5运行库扒拉出来。
WTF?居然还有绑定输入?直接全部清0,否则没有空间加区块头。
点上面菜单栏的保存图标,一路SAVE即可(上一个界面里的0x240和0x90记得改0)。然后加个区块。
换studype这个工具,LordPE只负责加区块头,我们要自己往后面补数据。很麻烦。
0x14D000是RVA地址。OllyDbg载入运行库。
刚刚因为我调试CM时看到运行库被装载到了推荐基址,就直接记了VA地址。在LOADDLL里面不出意外也会被装载到推荐基址,直接转到0x7411D546即可。
以下是补丁数据:
保存补丁即可。
保存后运行库扔到程序目录。提示成功。
哈哈哈,66666,这智力我也给点10086个赞 看花眼{:5_120:} 这个是好办法,虽然小白不懂! 看不懂 不过只有说6666666{:5_116:} {:5_116:}只有说看不懂 非常好的教程,图文并茂,慢慢研究必有所收获 以后慢慢来学习吧! 虽然有些不太明白,还是感觉楼主真牛!!! 兄dei666