VB 调试之优先创建窗体
使用工具
分析思路
首先运行软件,了解一下程序:
- 运行程序后,首先出现一个倒计时 5 秒的窗体;
- 同时 Continue 按钮处于禁用状态;
- 倒计时结束后,Continue 按钮启用,并在点击后可进入主窗体;
将
CrackMe
倒入OD
,开始分析:这里的倒计时窗体可以算得上是
NAG
窗口了,很是烦人啊有木有;如何跳过
烦人的窗口
直接进入主程序呢?倒计时结束后,点击 Continue ,程序跳转进入主程序;
程序的跳转肯定发生在
CODE
段;在倒计时结束后,到
内存窗口
给CODE
段设置内存访问断点,然后在程序界面点击 Continue:程序中断,可以看到接下来要执行 JMP,根据程序的逻辑可以确定,这个 JMP 就是跳转到主窗体的:
相邻的还有 3 个 JMP,给它们全部设置断点,看看它们分别要做的事情;
重载并运行程序,程序中断在第三个 JMP,根据程序逻辑,程序初始运行后,会先展示一个
NAG
窗口,F9
运行程序,果然不出所料;接着运行程序,程序中断在第四个 JMP,共计中断 5 次,不用说,这个是倒计时跳转,同时,最后一次中断后,Continue 按钮启用;
点击 Continue 按钮,程序中断在第一个 JMP 位置,四个跳转已知其三,第二个 JMP 肯定是 Exit,最后,分析结果如图:
既然已经知道了第一个 JMP 是跳转至程序主窗体的,那能否让程序刚运行就跳转到主窗体,这样是不是就绕过了
NAG
窗口?值得一试:将修改保存到文件,保存方法不再赘述,然后运行程序,Perfect!
4C 法
4C 法对于单纯的本地验证应该比较好用,但是基于网络验证可能就不是很好用了,尽管可以到达程序主窗口,但功能也许还是不可用;
还是这个
CrackMe
,将CrackMe
倒入OD
:VB 程序有个特点:入口处都是一个 PUSH 指令,然后一个 CALL 指令;
发现第一行是一个 PUSH 指令,4C 法就是将 PUSH 的地址加上
4C
,然后在数据窗口中跟随这个地址;Ctrl + G
跟随地址后,发现这个地址中存储着另外一个地址,选择存储的地址,然后右键选择数据窗口中跟随(DWORD)
:跟踪地址来到数据窗口:
这里可以看到两块类似的数据,每块 50(十六进制)个字节的长度,每块数据的第 24(十六进制)个字节处都有一个标志(第一个是 00,第二个是 01);
该标志指定了代码块(也就是程序启动后要加载的窗体)出现的顺序,先加载 00,也就是我们要去掉的 NAG 窗口,再加载 01,也就是主窗口;
所以,为了去掉
烦人的窗口
,将此处的两个标志的值互换,即:00 改 01,01 改 00,这样的话 NAG 窗口就永远也没机会出现了,最后将修改保存到文件;接着,运行保存的文件:
直接出现程序主窗体,NAG 窗口被去除;