OD菜鸟的福音(经典讲解CALL的找法)
od找call找call!

。
如果有朋友用过readProcessMemory API的话,一定会奇怪,我们可以读写其他进程中的函数,
为什么你又说windows不允许呢。如果你有跟踪过readProcessMemory函数的话,你会发现,该
API用的是共享内存区的方式获得对方内存中的数据。
就先写这么多吧,打这么点字也用了半个多小时。
} } 2个线程都可以调用add函数,都可以得到正确的结果。同样的概念套到游戏里就是游戏的线程和 我们自己的线程都可以调用“选怪”这个函数,并且得到正确的结果。call的原理就是让我们自 己的程序,去调用游戏里的函数。当然,必须存在我们这个“线程”。注意,这里线程是非常关 键的。如果不是一个新的线程,就无法得到CPU时间片。所以,一定是一个线程在调用1个或者多 个call。 明白概念之后,我们就可以考试动手了。首先找到call的地址,然后想办法调用他。 这里又需要考虑,我们如何才能调用它。首先第一个概念是要在游戏进程开辟一个线程,在这个 线程中做我们想要的操作。 那么首先要做的是,把这个线程放在游戏进程中。目前流行的方式有2中,编写钩子dll。或者远 程注入一个dll。 因为dll没有自己的独立空间,只能依附在一个exe的进程当中。而且windows帮我做了很多dll在 exe空间中定位的问题。所以dll就是我们的不二选择。 鉴于钩子和远线程的资料非常多,我就不写了。 我习惯用远线程来注入dll。按我的习惯,我们继续说。 被注入的dll,一定要是个标准dll。不能是activex dll。两者的调用方式不同,所以不能用 activex,这也决定了vb做的dll是不能被注入的。能被注入游戏地址空间中的dll,几乎都是用c 或者delphi写的。所以这个dll,还需要大家去学习这两种语言中的一种。 然后在dll里,直接调用。比如我们找到的call汇编如下: push 1 push 2 call 123456 这里传递1和2做加法操作。我们在自己的dll写下: __asm { push 2 push 5 call 123456 } 这样,这个call中就实现了2+5的操作。如果在123456这个call中,输出一个和的消息框,我们 就能看到结果了。在后面我会给出一个可操作的exe和注入dll的代码。 我要说的最后一个概念,也是很多人的疑问。已经注入的dll,我们如何调用它。 可以很明确的告诉你,不能调用(其实也不是不能调用,只是很麻烦,也非常占用资源,就是利 用远线程调用)。因为你的dll已经生存在对方进程中了。你自己的exe又是另外一个独立的进程 。想像一下,如果你能调用对方进程里dll中的函数,那不是也可以直接调用游戏call了么:)
小艾教程_基础篇_第二课:找CALL的基本方法

第二课:找CALL的基本方法
1、玩游戏:当我们拿到一个游戏,不管是单机游戏还是网络游戏(没有驱动保护的那种),我们首先得要会玩这个游戏,不说很精通,但是至少得要知道怎么玩!而且在玩的过程中慢慢经验丰富了也就可以快速找到突破口!
2、找基址:前一课让你们学习了CE,现在这一步就是用CE查找基址,比如说人物的血值,蓝值等,这些信息对于找CALL很有用的,特别是蓝值,对于找技能CALL特别重要,不说要找到基址,至少也要找到存放蓝值的地址,但是要注意,有的游戏的地址并不好找(有可能是浮点数或者加密的或者是动态的)
3、找CALL:根据找到的地址,通过寻找操作的指令,然后用OD到CALL附近,最后找到关键CALL (这个过程最难)
4、写外挂:找到了CALL,我们就要写CALL,我们用E语言来写,比较简单!
5、调试:外挂很难一次性成功,所以我们要调试!
6、体验成果!!
下节课:实例:找XP扫雷游戏开局CALL。
寻找CALL的教程

寻找CALL的教程2009-04-03 12:49说一说一个简单的找call原理其实游戏中的call是有一定规律的,这个规律是什么?1、调用之前,必定有call名入栈,什么,不知道如何看堆栈有哪些内容。
很简单啊,按alt+k就看到了2、系统进程空间,一般都可以忽略,那么,哪些是系统进程呢,我自己也分不太清,但是NTDLL,USER32,WS_S32等一般都是系统进程空间,在od的状态栏上就可以分辨出来。
举个例子:ZX中找死亡回程call一、在弄死小号后,先下了 BP SEND指令,od中断下来,按ALT+K,看到的堆栈情况是这样的:地址堆栈函数过程 / 参数调用来自结构029FFEC8 00572860 WS2_32.send elementc.0057285A029FFECC 000006BC Socket = 6BC029FFED0 06D1F2A8 Data = 06D1F2A8029FFED4 00000003 DataSize = 3029FFED8 00000000 Flags = 0029FFEE8 00578BE7 包含elementc.00572860 elementc.00578BE4029FFEF0 00578827 elementc.00578BB0 elementc.00578822029FFF38 005785DE ? elementc.00578640 elementc.005785D9029FFF48 00577128 包含elementc.005785DE elementc.00577125二、然后F9让游戏正常,再回到游戏中,按下“回城”三、od中断下来,再按alt+K,看到的堆栈是另外一个样子了:地址堆栈函数过程 / 参数调用来自结构0012F3B4 00581775 ? elementc.005898B0 elementc.005817700012F3C4 00583F75 ? elementc.00581740 elementc.00583F700012F400 005A8CF6 ? elementc.00583ED0 elementc.005A8CF10012F410 0057E701 ? elementc.005A8CD0 elementc.0057E6FC <<<<<<<<<<<<< 0012F420 00509E80 elementc.0057E6C0 elementc.00509E7B0012F424 006C6527 包含elementc.00509E80 elementc.006C65240012F444 006C647C elementc.006C64B0 elementc.006C64770012F45C 006C8F0E 包含elementc.006C647C elementc.006C8F0B0012F464 0054A432 elementc.006C8F00 elementc.0054A42D0012F47C 006C236B 包含elementc.0054A432 elementc.006C23680012F494 006C269B elementc.006C22C0 elementc.006C26960012F4E0 006C93AA ? elementc.006C2380 elementc.006C93A50012F55C 00549BBB ? elementc.006C8F50 elementc.00549BB6四、如果用CTRL+F9跟踪,很容易发现,前三个都是在WS32系统进程空间,所以,第4个,做了个标记的那里,就是死亡回程call了希望大家多多实践,注意观察。
10授人以鱼不如授之以渔●CALL入门篇二:CALL的寻找与分析

10授人以鱼不如授之以渔●CALL入门篇二:CALL的寻找与分析*所谓的call,其实本质上来说就是一条汇编指令.*只要找到了关键代码的地址,传入适当参数,就可以借用游戏中已有功能来完成内挂的功能。
目标:武易的喊话CALL目的:以喊话CALL更深入了解所谓的CALL参数.问:写一个CALL,如何传入适当的参数?什么是适当的参数?是不是一定要按照反汇编代码来写?好了,废话就不说了, 用OD载入游戏,武易并下bp send 断点.在游戏中喊一句话,OD便断了下来.好了,这里我们已经非常熟悉了,是send函数的内部, 我们再来看看堆栈中的情况其中11111111 是我喊出去的话的内容,喊话CALL一般比较好找,因为有比较明确的数据好了,我们按CTRL+F9 返回这里是第一层,这里是游戏调用send函数的发包的位置,这里也不说了我已经在前面几篇详细的介绍用法.我们继续返回好了,我们又来到这一层,这里在上篇找打坐中也出现过,非常眼熟吧. 这里一层应该是封包组合之类的CALL 我们暂时跳过它.这一层中,我们也在上一篇遇到过,上次断下来后是压入的加密后封包的内容.还有一个应该是时间戳一类的东西.(这里也是猜的,因为不经过深入分析,是无法确认最终的作用.)*时间戳是根据时间的变化而变化的一个数值,经常被用来加在封包内,来检测封包达到前后,或者用来验证封包的真伪.好了继续返回.到了这一层,这里OD显示了压入的封包地址中有我们喊话的内容(因为写教程的原因不能暂停太长时间所以又喊了一遍,内容可能跟上面不同)0047218F 68 F0A77001 push 0170A7F0 ; ASCII "1111111111111"这里有一个地址里面的内容是我们的喊话内容,我们来测试下这个CALL是不是我们要找的喊话CALL===========================CALL分析=====================0047218F 68 F0A77001 push 0170A7F0这里压入了我们喊话的内容指针地址,这里到我们手里该怎么写呢? 是否一定要按照这个地址来写入我们的喊话内容呢? 其实不然,我说过,一个CALL只要压入适当的参数,他这里需要的是一个喊话内容的指针地址,而并非一定要系统指定的,所以我们可以自己找一个空白的, 或在语言定义一个变量然后取他的指针地址来压入堆栈都可以.这里我说一个用CE+代码注入器写喊话CALL的方法.用ce 写入我们的喊话内容. 并用代码注入器调试.随便取一个地址,将类型改变为文本型然后内容变成我们要喊话的内容这里参数只有一个我们已经弄好了, push 4ED056 (4ed056是我选的喊话内容地址,这里保存着我的喊话你让)00472194 E8 D7B9FBFF call 0042DB70这里是CALL的地址 . call 0042DB70写完参数和CALL地址后我们还要干嘛?当然是看CALL内部是否需要调用寄存器.我们来看看CALL内部调用了什么寄存器,我在前几篇中用过很多次这种方法来找CALL所需要的寄存器.其实所谓的适当的参数就是如此,你想要什么我就给你什么~~当内部CALL 出现这种,mov ebx,eax 或者push eax 这个时候我们往上面看看有没有给EAX赋值的指令,如果没有的话,那么我们需要给EAX赋值了. 因为EAX 本身并不带数据,除了几个特殊的寄存器外,寄存器本身就是用来给我们存放数据的,他本身并没有数据.0042DB7D 50 push eax 我们在第四行找到这样一句,但是上面有一行给EAX赋值的指令所以EAX一句不需要我们来赋值了.0042DB83 64:8925 0000000 mov dword ptr fs:[0], esp ESP 是堆栈指针, 永远指向栈顶,属于特殊寄存器,所以也不需要赋值.0042DB8E 53 push ebx 这里有一句,上面并没有赋值,我们来看看他的值是多少,喊一句话进入CALL之后发现EBX 一直=0 . 在这里我们先写入EBX的值=0 (经过后来我们测试发现不用给EBX赋值也不会出错,这个可能是因为这里的PUSH EBX 只是保存寄存器环境用来恢复,或者说寄存器本身的值为0 不需要写入他也等于0 . 我认为前者可能大一些)好了其他就没了 .我们来整理下push 04ED056call 0042DB70add esp,4 不要忘了堆栈平衡压入一个堆栈ESP+4这里我们没有压入EBX的值也没有出错看来PUSH EBX 是用于保存寄存器环境.频道的选择: 这里我们发现压入的数值并没有频道的参数,如何选择频道呢?这个时候我们就要不停的测试来看看他是如何选择频道的. 首先我们在游戏的聊天频道换成喊话,在调用刚刚的CALL, 我们发现,喊出来的频道是喊话的频道.这个时候我们觉得应该是把频道参数放在某一内存地址里然后调用喊话的时候在判断是哪个频道.如何用搜索频道所在内存地址呢?用模糊搜索, 首先搜索未知数值, 然后变化频道搜变化的数值然后重复就可以了(这里跟找血的基址一样)这里我们发现有一个 1 , 数值很小我们变化一下频道内容发现当选择不同的频道都有固定的值.这个时候我们就可以确认这个是频道的内容,我们换下他的值,然后调用喊话发现已经在其他频道喊了.这里改成3以后在帮派频道喊话, 不过我没有加入帮派所以不能喊话.=============================分析结束=================好了今天的喊话CALL就到这里.在这里有个不好的消息,告诉大家.其实这里的CALL地址在不同的电脑上地址也是不同的...如下图所示(下图是同一版本,同一区不同电脑返回4层后的CALL)发现了吧,参数是一样的但是CALL地址却不同.这里还是跟上一篇的一样.看来这个游戏有点诡异啊...人生就是如此,你做了很多努力,你还是会发现原来你做的都是无用功...好了今天就讲到这里,我们来总结一下总结:* CALL的参数地址并不需要CALL本身参数的地址.我们只需要给他想要的,就可以调用这个CALL为我们所用文中我们所调用的这个CALL,传入的并非是他原型中的地址, 却能正确调用,那是因为这个CALL的适当参数是给CALL一个有喊话内容的地址,而CALL是不会管这个是不是原来的,所以这个CALL的适当参数是压入一个喊话指针地址,便可.。
od找call找call!

- 幻觉公式 2007.06.19 13:29
欢迎转载,但请保留所有内容。
也欢迎朋友们,接着这个话题继续说下去,或者对未说明的地方进行补充。
2008-11-20 0:20:31
疯狂代码 /
od找call:找call!
疯狂代码 / ĵ:http://assembler/Article23524.html 先说下call是什么。
call就是程序调用。熟悉VB的朋友,应该熟悉调用函数call add(a, b)的方法。 在任何程序的编写中都有很多call。如何找到正确的call是比较难的事情。 列一个调用过程: call 鼠标点击 { call 判断是点到怪、物品、地面 { select case 怪 : call 选怪 case 物品 : call 捡取物品 case 地面 : call 走路 case 墙壁 : call ... case ... } } call 选怪(怪物ID或标识) { push 明文包 call 加密 } call 捡取物品(物品ID或标识) { push 明文包 call 加密 } call 加密1级 { call 加密n级 { w32_send() //发送给服务器 } } 游戏的大概流程就是这样子的了。
这样的话,也就不需要注入了。
然后你肯定又会问,如果不能调用dll里的函数,我们让他执行。
这里有2种方法,
1.全部代码都在dll中写,包括界面、流程等这些内容。
2.采用进程间交互的方法。windows虽然不同意你调用其他进程中的数据,但是允许不同的进程
间做数据通讯。进程间通讯的方法要的是在n层嵌套中找到正确的call。这方面只能靠经验或猜测,看那个 push比较有戏。具体的方法也很简单,在N层嵌套的call中,看那个参数我们比较熟悉,比如观 察是否有怪物ID等。在多个call中找到一个我们熟悉的,然后调用,观看效果,如果不对,再试 别的。 上次讲过,在找周围怪物列表的时候,通过call 选怪(怪物ID或标识),向上跟踪找到怪物ID的 来源。这个怪物ID肯定是在周围所有怪物中的其中一个,所以通过这种方法,可以找到怪物周围 列表。 基本的原理和方法都已经讲出来了。对于初次找CALL的朋友,可能对操作系统和编译器生成的原 理不是很熟悉。我这里大概说一下,也是重点。 首先要明白,windows是多进程、多线程的操作系统。CPU轮流切换时间片给每个线程。而每个进 程都有自己独立的地址空间。具个例子,一排的牢房,CPU是送餐的,从左到右一直送过去。 每个牢房都是独立的,不会影响其他的牢房。 而DOS操作系统是单进程的,每次只能运行一个程序。这里我要说的是,当你面对一个进程的时 候,就不要考虑其他进程怎么样怎么样了,因为其他的进程和你自己的进程是没有关系的。这也 是在大学里讲c或者汇编只考虑一个进程的原因。 我们继续。 而在一个进程里的多个线程是共享当前进程空间的,如果你写过多线程的程序,就比较容易理解 call是怎么回事。我们看代码: function add(a, b) as long { add = a + b } 这是一个加法的call。 在我们的程序里有2个线程。 function thread1() { while 1 { text1 = add(1, 2) } } function thread2() { while 1 { text2 = add(2, 3)
找call的万能方法

பைடு நூலகம்一:
开一个游戏,进入后,开OD【有的游戏可能会检测OD,也许需要你先开OD,然后通过一些插件来实现隐藏或者过掉游戏检测】,附加游戏进程,这个是必须的,虽然基本上人会搞游戏的都懂这个。
二:
然后按OD上面的那个字母按钮 “E” ,选择游戏进程,进入到游戏领空,然后在游戏领空里面你看到的第一个call,进到这个call里面,再看这里面的第一个call,进去,按照 这样的方法一直到 kernel32.dll 或者 ntdll.dll 里面的第一个call ,下断【可以双击此行的Hex dump 的值或者再选中此行的时候按F2】,然后回到游戏里面,随便使用一个你认为能让游戏发包的功能。
最后再次重申,由于本人才疏学浅,表达能力有限,以上发的烂文各位看不懂的话还请飘过,或者有什么疑问可以回帖发问,混沌尽量都能回复。
那么,现在知道了一个关键的地方了,也就是通讯,就是联网,就是发包了。那么发包就得send【或者WSASend】了。至于哪个是不重要的。因为他们的原理是一样的,而我下面将要说的是原理上的寻找,不是告诉你说具体找哪个的,因为在我看来,找哪个都是一样的。
要是你想懂得以下我说的意思,可能需要了解的有:OD的基本使用方法;《Wingdows核心编程》;还得懂得汇编;还要掌握一种编程语言及在此编程语言里面嵌入汇编【要是你把汇编转换成你的编程语言来写且实现跟汇编一样的功能的话也不反对】等。
五:
在找到了发包call之后,可能你想找到明文发包call,那样的话,也是通过这个call来向上找的,就看你想要什么call了,基本上99%都可以找到。
综上所述,应该就可以实现一个比较万能的方法了,要是由于本人的表达能力有限,导致各位读者看不懂的话,还请见谅。要是想要弄清楚或者交流的话,可以到我们专门为了交流call而准备的群:辅助技术支持群 88823117 .
找call图文教程1

找call图文教程
打开"游戏找CALL练习实例one.exe",打开OD,附加"游戏找CALL练习实例one"进程。
以下几步是边学边用的:
F9运行。
输入bp send,回车,这样发包函数被设成中断。
点“吃血”,OD在发包处中断。
游戏中一个具体的功能都会设成一个具体的过程或函数,在游戏主程序运行时,相应功能的实现都会有一个Call,找Call就是为了找功能入口。
OD中按Ctrl+F9,是返回(retn)。
返回到哪里?看下图中画圈处。
找游戏Call就要在游戏模块中。
不在就Ctrl+F9...
按Ctrl+F9,按会找到一个retn,往上看看会有个Call。
看教程说按到第五层。
找到的是加血的。
照做。
看下图。
怎么知道是不是加血call?
这里设上断点,然后光标移到别处。
按运行...按吃血,吃蓝。
挨下试,看那个能中断到这里,(先把原来的中断去掉,如下图,红色总分点右键删除。
)只有加血能到这里,这个CALL 就是加血的。
要进一步确认,就可以注入代码测试。
下图红框中的代码,注入发现不成功,这里反复了好几次。
我把右边的寄存器的值也写上了一些再试....注入远程代码。
OK成功了!!
成功了的心情,无法言表。
压抑越久,喜悦越大,但这还是因为自己的水平太** 如果你也像我一样,反复做不成,但愿这篇文章给你启发,那怕就一点。
第五课-学找游戏的CALL

不会让大家久等的!
因为我们动一下都会想游戏发个CALL 所以大家不要随便乱在游戏点这点那了.
我们现在下断 在bp send那里点下回车键 然后进入游戏按一下攻击怪物的快键
看吧!已经暂停了!游戏也不能动了!现在我们按CTRL+F9返回找CALL 由于我们不知道哪个才是真正的CALL 所以 我们看到每个CALL都先记下来
第五课-学找游戏的CALL
-----------------------------------------------------------------------------
大家好!今天我们就学习下找CALL的方法.
怎么说呢...嗯...由于游戏中每个动作都是有数据传递的.比如说你要打一个怪.
在游戏里就会把你要打的怪的数据传到游戏里.这里就产生一个CALL提交的功能了(我个人认为的,如果解释有误请谅解.我本来对于这些CALL很少研究.因为我都是做BT功能的内存挂,也没怎么做过挂机的外挂.都是一些BT功能的哈.比如说冒险岛的无敌或者吸怪这类的BT功能.我也是因为想帮下大家入门所以学习下.我个人觉得不难学.起码我花几天就看懂了.好了废话太多了.接下来就看教程里去).
一般CALL都是3-8层之间的 所以我们都找一下 按一次CTRL+F9就算一层 这个懂吧?
现在我按三次了!就看到一个CALL 记录一下
005A9EB0
现在是第5层 再往下找
由于我们按返回的时候上面或者下面的CALL如果不出现是数值的地址 而是 字母的话
那么我们就不用继续返回找了!就算有CALL是数值的也不用理会了!因为根本没地址在其他地方了! 现在我们删除断点 ALT+B 还记得刚才我说的吧? 现在点下运行 由于我们断的时间太久了!游戏连接已经断了!算了!没关系的!反正我们列出这些CALL了!
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OllyD详细教程目录第一章概述 (1)第二章组件 (5)一、一般原理[General prnciples] (5)二、反汇编器[Disassembler] (8)三、分析器[Analysis] (9)四、Object扫描器[Object scanner] (12)五、Implib扫描器[Implib scanner] (12)第三章 OllyDbg的使用 (13)一、如何开始调试[How to start debugging session] (13)二、CPU 窗口[CPU window] (14)三、断点[Breakpoints] (14)四、数据窗口[Dump] (15)五、可执行模块窗口[Executable modules window] (16)六、内存映射窗口[Memory map window] (17)七、监视与监察器[Watches and inspectors] (19)八、线程[Threads] (19)九、调用栈[Call stack] (20)十、调用树[Call tree] (21)十一、选项[Options] (21)十二、搜索[Search] (22)十三、自解压文件[Self—extracting (SFX) files] (22)十四、单步执行与自动执行[Step—by—step execution and animation] (23)十五、Hit跟踪[Hit trace] (23)十六、Run 跟踪[Run trace] (24)十七、快捷键 (26)十八、插件[Plugins] (29)十九、技巧提示[Tips and tricks] (29)第四章其他功能 (30)一、调试独立的DLL[Debugging of stand—alone DLLs] (30)二、解码提示[Decoding hints] (32)三、表达式赋值[Evaluation of expressions] (32)四、自定义函数描述[Custom function descriptions] (34)第一章概述OllyDbg 是一种具有可视化界面的32 位汇编—分析调试器。
它的特别之处在于可以在没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。
Version 1.10 是最终的发布版本。
这个工程已经停止,我不再继续支持这个软件了。
但不用担心:全新打造的OllyDbg2.00 不久就会面世!运行环境:OllyDbg可以以在任何采用奔腾处理器的Windows 95、98、ME、NT 或是XP(未经完全测试)操作系统中工作,但我们强烈建议你采用300—MHz以上的奔腾处理器以达到最佳效果。
还有,OllyDbg 是极占内存的,因此如果你需要使用诸如追踪调试[Trace]之类的扩展功能话,建议你最好使用128MB以上的内存。
支持的处理器:OllyDbg支持所有80x86、奔腾、MMX、3DNOW!、Athlon 扩展指令集、SSE指令集以及相关的数据格式,但是不支持SSE2指令集。
配置:有多达百余个选项用来设置OllyDbg的外观和运行。
数据格式:OllyDbg的数据窗口能够显示的所有数据格式:HEX、ASCII、UNICODE、16/32位有/无符号/HEX整数、32/64/80位浮点数、地址、反汇编(MASM、IDEAL或是HLA)、PE文件头或线程数据块。
帮助:此文件中包含了关于理解和使用OllyDbg的必要的信息。
如果你还有Windows API 帮助文件的话(由于版权的问题win32.hlp没有包括在内),你可以将它挂在OllyDbg 中,这样就可以快速获得系统函数的相关帮助。
启动:你可以采用命令行的形式指定可执行文件、也可以从菜单中选择,或直接拖放到OllyDbg中,或者重新启动上一个被调试程序,或是挂接[Attach]一个正在运行的程序。
OllyDbg支持即时调试。
OllyDbg根本不需要安装,可直接在软盘中运行!调试DLLs:你可以利用OllyDbg调试标准动态链接库(DLLs)。
OllyDbg 会自动运行一个可执行程序。
这个程序会加载链接库,并允许你调用链接库的输出函数。
源码级调试:OllyDbg可以识别所有Borland 和Microsoft 格式的调试信息。
这些信息包括源代码、函数名、标签、全局变量、静态变量。
有限度的支持动态(栈)变量和结构。
代码高亮:OllyDbg的反汇编器可以高亮不同类型的指令(如:跳转、条件跳转、入栈、出栈、调用、返回、特殊的或是无效的指令)和不同的操作数(常规[general]、FPU/SSE、段/系统寄存器、在栈或内存中的操作数,常量)。
你可以定制个性化高亮方案。
线程:OllyDbg可以调试多线程程序。
因此你可以在多个线程之间转换,挂起、恢复、终止线程或是改变线程优先级。
并且线程窗口将会显示每个线程的错误(就像调用GETLASTERROR 返回一样)。
分析:OllyDbg 的最大特点之一就是分析。
它会分析函数过程、循环语句、选择语句、表[tables]、常量、代码中的字符串、欺骗性指令[tricky constructs]、API调用、函数中参数的数目,import表等等。
这些分析增加了二进制代码的可读性,减少了出错的可能性,使得我们的调试工作更加容易。
Object扫描:OllyDbg 可以扫描Object文件/库(包括OMF 和COFF 格式),解压代码段[code segments]并且对其位置进行定向。
Implib扫描:由于一些DLL文件的输出函数使用的索引号,对于人来说,这些索引号没有实际含义。
如果你有与DLL相应的输入库[import library],OllyDbg 就可以将序号转换成符号名称。
完全支持Unicode:几乎所有支持ASCII 的操作同时也支持UNICODE,反之亦然。
名称:OllyDbg可以根据Borland 和Microsoft 格式的调试信息,显示输入/输出符号及名称。
Object 扫描器可以识别库函数。
其中的名称和注释你可任意添加。
如果DLL中的某些函数是通过索引号输出的,则你可通过挂接输入库[import library]来恢复原来的函数名称。
不仅如此,OllyDbg还能识别大量的常量符号名(如:窗口消息、错误代码、位域[bit fields]…)并能够解码为已知的函数调用。
已知函数:OllyDbg 可以识别2300 多个C 和Windows API 中的常用函数及其使用的参数。
你可以添加描述信息、预定义解码。
你还可以在已知函数设定Log 断点并可以对参数进行记录。
函数调用:OllyDbg可以在没有调试信息或函数过程使用非标准的开始部分[prolog]和结尾部分[epilog]的情况下,对递归调用进行回溯。
译者注:004010D0 push ebp \004010D1 mov ebp,esp |004010D3 sub esp,10h |>prolog004010D6 push ebx |004010D7 push esi |004010D8 push edi /……004010C5 pop edi \004010C6 pop esi |004010C7 pop ebx |>epilog004010C8 mov esp,ebp |004010CA pop ebp |004010CB ret /栈:在栈窗口中,OllyDbg 能智能识别返回地址和栈框架[Stack Frames]。
并会留下一些先前的调用。
如果程序停在已知函数上,堆栈窗口将会对其参数进行分析解码。
译者注:栈框架[Stack Frames]是指一个内存区域,用于存放函数参数和局部变量。
SEH 链:跟踪栈并显示结构化异常句柄链。
全部链会显示在一个单独的窗口中。
搜索:方法真是太多了!可精确、模糊搜索命令或命令序列,搜索常数,搜索二进制、文本字符串,搜索全部命令地址,搜索全部常量或地址域[address range],搜索所有能跳到选定地址的跳转,搜索所有调用和被调用的函数,搜索所有参考字符串,在不同模块中搜索所有调用、搜索函数名称,在全部已分配的内存中搜索二进制序列。
如果搜索到多个结果,你可以对其进行快速操作。
窗口:OllyDbg 能够列出关于调试程序中的各种窗口,并且可以在窗口、类甚至选定的消息上设置断点。
资源:如果Windows API 函数使用了参考资源串,OllyDbg 可以显示它。
其支持显示的类型仅限于附带资源[attached resources]的列表、数据显示及二进制编辑。
断点:OllyDbg支持各种断点:一般断点、条件断点、记录断点(比如记录函数参数到记录窗口)、内存读写断点、硬件断点(只适用于ME/NT/2000)等。
在Hit跟踪情况下,可以在模块的每条命令上都设置INT3断点。
在使用500—MHZ处理器的Windows NT 中,OllyDbg 每秒可以处理高达5000 个中断。
监视与监察器:每个监视都是一个表达式并能实时显示表达式的值。
你可以使用寄存器、常数、地址表达式、布尔值以及任何复杂代数运算,你还可以比较ASCII和UNICODE字符串。
监察器[inspectors]是一种包含了两个的索引序列的监视[Watches],它以二维表的形式呈现,可以对数组和结构进行解码分析。
Heap walk.:在基于Win95的系统中,OllyDbg 可以列出所有的已分配的堆。
句柄:在基于NT的系统中,OllyDbg 可列出被调试程序的所有系统句柄。
执行:.你可以单步执行、步入子程序或者步过子程序。
你也可以执行程序直到函数返回时、执行到指定地址处,还可以自动执行。
当程序运行时,你仍然可以操纵程序并能够查看内存、设置断点甚至修改代码。
你也可以任意的暂停或重启被调试的程序。
Hit跟踪:.Hit跟踪可以显示出目前已执行的指令或函数过程,帮助你检验代码的各个分支。
Hit跟踪会在指定指令到达之前设置断点,而在这个指令执行后,会把这个断点清除掉。
译者注:Hit在英文中是“击中”的意思,指令如果运行了就表示这个指令被“击中”了,没有执行的指令就是“未击中”,这样我们就很容易看出被调试程序哪些部分运行了,而哪些没有运行。
Run跟踪:Run跟踪可以单步执行程序,它会在一个很大的循环缓冲区中模拟运行程序。
这个模拟器包含了除了SSE指令集以外的所以寄存器、标志、线程错误、消息、已经函数的参数。
你可以保存命令,这样可以非常方便地调试自修改代码(译者注:比如加壳程序)。
你可以设置条件中断,条件包括地址范围、表达式、命令。
你可以将Run跟踪信息保存到一个文件中,这样就可以对比两次运行的差别。