能力值:
( LV2,RANK:10 )
|
-
-
2 楼
感谢你的文章,我应好好学习!
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
楼主好文章,谢谢分享
|
能力值:
( LV9,RANK:1250 )
|
-
-
4 楼
收藏学习!
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
学习,谢谢
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
第一种方法,我试过,有很多软件是拦不下的。
其他,学习!!!
|
能力值:
( LV9,RANK:180 )
|
-
-
7 楼
最初由 老头 发布 第一种方法,我试过,有很多软件是拦不下的。
不知道你指的具体是什么软件,具体是什么事件断不下来。有时间的话,我也可以看看分析分析,当学习提高的机会了。
这里提到的方法也是我分析新概念英语学习机和奇迹智能英语记忆这些VB程序时摸到的方法。
这个断法,是对VB中的的各种事件进行断下,如果是事件中调用的函数,可能这个就断不下来。这时可用其它方法辅助了。
还有,在JMP下断时,要将全部这种结构的JMP下断。我是用OD将全部内容输出为TXT文件,然后用ultraedit 以[esp+4]为关键词搜索,然后瑞在OD中进行下断。这样保证不会有漏掉的。
|
能力值:
( LV9,RANK:170 )
|
-
-
8 楼
提供了一个好思路哦,一直对 VB 头痛
|
能力值:
( LV6,RANK:90 )
|
-
-
9 楼
对用P-CODE处理的VB软件能不能用这种方法?
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
我想请教楼主,如何用OD将全部内容输出为TXT文件?
我是这样做的将全部内容复制到 TXT 文件中,用 ultraedit 也无法找到 [esp+4]的。对吗?
下面的代码,楼主看看,可以中断吗(用[esp+4] 的方法)
工程1:
Private Sub Command1_Click()
Form2.Show
End Sub
工程2:
Private Sub Command1_Click()
MsgBox "11111"
End Sub
该如何找到 [esp+4] ,我怎么没有找到? 好象对用P-CODE处理的VB软件也不能用
|
能力值:
( LV9,RANK:180 )
|
-
-
11 楼
OD复制方法:
用OD载入程序后,点右键,选择“复制 / 全选”,然后再选择“复制 / 到文件” ,就将OD界面中的所有内容复制到一个文件了。
需要注意的是,这个文本文件比较大。奇迹智能英语复制出的这个文件有65M之大。
作了个测试:
一个form load事件,一个text change事件,一个timer事件,一个command事件。
如下所示:
一般情况下,form load, text change, timer事件是很难跟踪的。
Private Sub Command1_Click()
MsgBox "exit"
End
End Sub
Private Sub Form_Load()
MsgBox "form load"
Timer1.Enabled = True
End Sub
Private Sub Text1_Change()
If Text1 = "123" Then
MsgBox "OK"
End If
End Sub
Private Sub Timer1_Timer()
Timer1.Enabled = False
MsgBox "timer off"
End Sub 用OD打开这个程序,查找相关特征码,可找到如下结构的JMP,设置断点后,跟踪,可以得到各个事件的入口:
00401BBC . 816C24 04 3B0>sub dword ptr [esp+4], 3B
00401BC4 . E9 E7000000 jmp 00401CB0 command1 click
00401BC9 . 816C24 04 330>sub dword ptr [esp+4], 33
00401BD1 . E9 EA010000 jmp 00401DC0 form1 load
00401BD6 . 816C24 04 370>sub dword ptr [esp+4], 37
00401BDE . E9 2D030000 jmp 00401F10 text1 change
00401BE3 . 816C24 04 3F0>sub dword ptr [esp+4], 3F
00401BEB . E9 B0040000 jmp 004020A0 timer1
这个说明,这个JMP法基本可以跟到所有的VB事件.
同时,在进行测试时,自定义的function等入口也是在上述的JMP结构中。而且一个form中的所有事件和自定义的函数都是连续放在一起的。如果还有其它的form,则放在另一块地方。
附,测试程序。
|
能力值:
( LV12,RANK:450 )
|
-
-
12 楼
呵呵,不错,偶要将你的发现写成一段脚本.
|
能力值:
(RANK:10 )
|
-
-
13 楼
可否把你的目标程序也发上来?谢谢
|
能力值:
( LV12,RANK:450 )
|
-
-
14 楼
按照楼主的文章与test.rar编写的OllyHTML脚本:
(0.5.0.5的OllyHTML插件有BUG,现已更新成0.5.0.6,下面是新的脚本,速度快一些)
<html>
<head>
<title>设置VB程序事件处理断点</title>
<script src="res://OllyHTML.dll/const.js"></script>
</head>
<body>
<table style="font-size:14px;width:100%;height:100%;border-collapse:collapse" cellspacing="0" cellpadding="0" align="center">
<tr>
<td>
<textarea id="resultArea" style="width:100%;height:100%;" title="双击跳到相应地址的指令" rows="10" ondblclick="gotoAddr()" WRAP="off"></textarea>
</td>
</tr>
<tr style="height:24px">
<td align="center">
<input type="button" value="设置断点" onclick="setEventBP()">
</td>
</tr>
</table>
<script>
function gotoAddr()
{
var txtRange=document.selection.createRange();
var val=parseInt(txtRange.text,16);
if(val>0x01000)
app.Analyser.Cpu(val,val,0);
}
function setEventBP()
{
resultArea.value="";
var lines=new Array();
var t=app.Analyser.GetThreadInfo(app.MainThreadID);
if(!t)
{
alert("请先装入被调试VB程序并让Ollydbg分析完代码!");
return;
}
var m=app.Analyser.GetModuleInfo(t.Entry);
var st=m.CodeBase;
var ed=m.CodeBase+m.CodeSize;
var addr=st;
setOnce();
function setOnce()
{
window.external.Title="addr:"+window.external.IntToHex(addr)+" found:"+lines.length;
for(var ct=0;ct<100 && addr>0 && addr<m.CodeBase+m.CodeSize;ct++)
{
addr=app.Analyser.FindOP(addr,"816C2404");
if(addr>0)
{
addr=app.Analyser.GetNextOPAddr(addr,1);
var dasm=app.Analyser.Disasm(addr);
if(dasm.CmdType==C_JMP && dasm.JumpAddr>0)
{
app.BreakPoint.On(addr);
lines.push(window.external.IntToHex(addr));
}
}
}
if(addr>0 && addr<m.CodeBase+m.CodeSize)
{
setTimeout(setOnce,100);
}
else
{
window.external.Title="finish! total found:"+lines.length;
resultArea.value=lines.join("\r\n");
}
}
}
</script>
</body>
</html>
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
挺好的办法,但是对于一些窗体比较多的软件就头疼了,我遇到一个软件用VBexplor看了又十多个窗体,其中有两个跟注册有关的。
|
能力值:
( LV9,RANK:180 )
|
-
-
16 楼
这个是得需要点耐心。奇迹智能英语有21个form呢。
如果是要跟踪form load中的初始化情况,就需要一步一步跟踪。如果是只是跟踪程序中的几个事件,可以先设置断点,然后禁止断点,然后启动程序,在要跟踪前,将断点激活就可以了。
另,请教dreaman:我还不知道OllyHTML脚本怎么用呢。我已装好插件了。但不知道怎么才能用起来。这样用起来的话,设置断点就不用麻烦了。
|
能力值:
( LV12,RANK:450 )
|
-
-
17 楼
1、首先装入被调试程序.
2、点插件菜单的OllyHTML=>Scripts,可以打开我放在网站上的脚本列表,点相应脚本条目后的"运行"就可以执行相应脚本了,这是在线脚本的用法.
3、如果脚本已经保存成本地HTML,则用菜单OllyHTML=>Load=>HTML,选择相应脚本文件,就可以运行脚本了.
4、脚本运行是使用弹出来的一个IE控件容器窗口,点“设置断点”就可以了。
另:
00401BBC . 816C24 04 3B0>sub dword ptr [esp+4], 3B
00401BC4 . E9 E7000000 jmp 00401CB0 command1 click
前一句后面的3B是不是代表什么控件与事件类型之类的,要是能直接识别出是什么样的事件处理就更好了,呵呵。
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
还是没懂 万能断点什么原理
|
能力值:
( LV9,RANK:180 )
|
-
-
19 楼
最初由 foretell 发布 还是没懂 万能断点什么原理
其实这个不是什么万能断点,是指的采用对[EBP+4] ~ JMP结构的下断,可能跟踪到所有的VB事件和各种自定义function入口点,便于对程序分析。所以称其为“万能”分析断点。主要是用于对程序分析用的。
另,dreaman:我调入HTM文件后,却显示如下内容?不知有什么问题。
|
能力值:
( LV12,RANK:450 )
|
-
-
20 楼
看起来像是你的HTML文件内容不太正确.我已经将脚本放在网上了,你用OllyHTML=>Scripts,然后点"设置VB程序事件处理断点"条目后的"运行"试试.
或者保存这个附件.
|
能力值:
( LV9,RANK:180 )
|
-
-
21 楼
谢谢 dreaman
我将你的HTML保存到文件后,不知怎么搞的 "<"和">"符号没有了。所以出错了。
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
OD有VB万能断点的插件,不用这么麻烦的~~~
|
能力值:
( LV9,RANK:180 )
|
-
-
23 楼
dreaman:
用HTML插件设置断点后,有些是没有设置的,不知道是怎么回事。
|
能力值:
( LV12,RANK:450 )
|
-
-
24 楼
能不能把你的这个程序发上来我试一下,我也不太清楚原因.
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
用OllyHTML=>Scripts
为什么我的OD没有这一条,(找不到 OllyHTML)我该如何操作?
|
|
|