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了!
寻找网络游戏中CALL的教程
寻找网络游戏中CALL的教程寻找网络游戏中CALL的教程说一说一个简单的找call原理其实游戏中的call是有一定规律的,这个规律是什么?1、调用之前,必定有call名入栈,什么,不知道如何看堆栈有哪些内容。
很简单啊,按alt+k就看到了2、系统进程空间,一般都可以忽略,那么,哪些是系统进程呢,我自己也分不太清,但是NTDLL,USER32,WS_S32等一般都是系统进程空间,在od的状态栏上就可以分辨出来。
举个例子:ZX中找死亡回程call一、在弄死小号后,先下了BP SEND指令,od中断下来,按ALT+K,看到的堆栈情况是这样的:地址堆栈函数过程参数调用来自结构029FFEC800572860WS2_32.send elementc.0057285A029FFECC000006BC Socket=6BC029FFED006D1F2A8Data=06D1F2A8029FFED400000003DataSize=3029FFED800000000Flags=0029FFEE800578BE7包含elementc.00572860elementc.00578BE4029FFEF000578827elementc.00578BB0elementc.00578822029FFF38005785DE elementc.00578640elementc.005785D9029FFF4800577128包含elementc.005785DE elementc.00577125二、然后F9让游戏正常,再回到游戏中,按下“回城”三、od中断下来,再按alt+K,看到的堆栈是另外一个样子了:地址堆栈函数过程参数调用来自结构0012F3B400581775elementc.005898B0elementc.005817700012F3C400583F75elementc.00581740elementc.00583F700012F400005A8CF6elementc.00583ED0elementc.005A8CF10012F4100057E701elementc.005A8CD0elementc.0057E6FC0012F42000509E80elementc.0057E6C0elementc.00509E7B0012F424006C6527包含elementc.00509E80elementc.006C65240012F444006C647C elementc.006C64B0elementc.006C64770012F45C006C8F0E包含elementc.006C647C elementc.006C8F0B0012F4640054A432elementc.006C8F00elementc.0054A42D0012F47C006C236B包含elementc.0054A432elementc.006C23680012F494006C269B elementc.006C22C0elementc.006C26960012F4E0006C93AA elementc.006C2380elementc.006C93A50012F55C00549BBB elementc.006C8F50elementc.00549BB6四、如果用CTRL+F9跟踪,很容易发现,前三个都是在WS32系统进程空间,所以,第4个,做了个标记的那里,就是死亡回程call了希望大家多多实践,注意观察。
找call图文教程2
例ONE目标:游戏找CALL练习实例ONE记:看这篇找CALL文章,并不是说要学会它的操作步骤,而是学会找步骤的原理,只有懂得原理,才算真正会了.不要因为模拟器的简单而忽略这篇文章,也不要因为曾经写过这个模拟器的挂而忽略这篇文章.希望这篇文章能给你带来帮助.这是一位大牛做的模拟器器,今天就来找这个模拟器的CALL用OD 加载模拟器然后按F9 运行下bp send 断点P:为什么要下send 断点?*send 是微软提供的一个API 函数,可以用来发送数据包. 绝大部分游戏都是用这个函数来发包的,其他还有WSASend sendto WSASendto == send对应的收包函数是recv WSASend对应的收包函数是WSARecv下段后这里按ALT+B 会显示已经下段的地址*当你暂时不想断下来而又不想删掉就可以按空格来禁止.断下来后,我们点下模拟器的加血按钮OD立马就断了下来*标题显示模块- ws2_32 表明我们还在系统领空*游戏发送数据包是调用send函数发送的,掉用以后程序告诉系统我要发包了,然后系统就开发发送封包,这个时候断下来后我们就在系统发送完封包后.按CTRL+F9 返回P:为什么要用CTRL+F9 返回?而不是前进?*程序是一层套着一层的,就像一个箱子里面包含一个箱子,而里面的箱子里又有一个箱子.而我们断的send 就是在最里面的箱子,所以我们需要返回到我们所需要的代码层.我们来看下堆栈窗口这里第一行是CALL第二行到第五行是CALL的参数写成函数就是send(soket,data,datasize,flags)这个就是系统send所需要的参数DATA 这里存放着send发送的封包内容DATASIZE 表示封包的大小从MSDN查看一下函数的参数我们会发现他的参数跟我们刚刚反汇编的一样.*按照__cdecl调用约定参数是从右边开始压入堆栈继续返回这里我们已经到了程序领空了(标题显示模拟器,而没有显示ws2_32)在这里OD已经给我们标明了. 这是调用send 的汇编代码因为这个模拟器并没有写接收返回封包的代码所以我们调用这个send 函数程序也是没有反应的继续返回这里有一个CALL 如果我们第一次找,我们并不能确认这个是否是我们要找的P:如何确认这个是否是我们需要的CALL呢?我们先断下来再说继续返回这里上面有一个retn*retn 表示一段程序的结束.这里从JMP 00403814 开始到下面的retn 代表这个是连续的一段代码继续返回这里我们又发现一个CALL 先断下来再说在返回一层这里也有一个CALL 也断下来好了我们现在已经返回了6层找到了3个CALL到底哪个是我们需要找的呢我们先来测试下我们找的把send 断点删了暂时没用了按下加血我们发现所有断点都会断, 这个时候我们发现第二个CALL 附近有"血"这种文本当然一般的除了喊话CALL 以外不会有很明确的数值当做依据这个时候就要靠你的经验去猜了.我们在点下吃蓝发现只断下第一个. 好了,第一个先不要管了.为啥?猜的...好了我们来看看第二个CALLmov edx,00453028call 00452E98retn*要写一个CALL,我们就要模拟出他所需要的寄存器,还有堆栈的环境P:如果看一个CALL所需要的寄存器?我们进入call 00452E98 的内部选中call 00452E98 那行按回车就会跳到下面00452E99 |. 8BEC mov ebp, esp00452E9B |. 83C4 F8 add esp, -800452E9E |. 53 push ebx00452E9F |. 8955 FC mov dword ptr [ebp-4], edx 00452EA2 |. 8BD8 mov ebx, eax00452EA4 |. 8B45 FC mov eax, dword ptr [ebp-4] 00452EA7 |. E8 1414FBFF call 004042C0 00452EAC |. 33C0 xor eax, eax00452EAE |. 55 push ebp00452EAF |. 68 7E2F4500 push 00452F7E 00452EB4 |. 64:FF30 push dword ptr fs:[eax] 00452EB7 |. 64:8920 mov dword ptr fs:[eax], esp 00452EBA |. 8B45 FC mov eax, dword ptr [ebp-4] 00452EBD |. BA 942F4500 mov edx, 00452F94 00452EC2 |. E8 5513FBFF call 0040421C00452E98 /$ 55 push ebp00452E99 |. 8BEC mov ebp, esp00452E9B |. 83C4 F8 add esp, -8这里是保存堆栈环境我们先不管他00452E9F |. 8955 FC mov dword ptr [ebp-4], edx将EDX 保存到[EBP-4]我们来找下EDX的值这段汇编代码前面没有给EDX赋值我们返回上一层按小键盘- 上一层mov edx,00453028这句代码的意思是将453028赋值给EDX也就是说EDX=00453028找到EDX 的值后继续往下面找00452EA2 |. 8BD8 mov ebx, eax这里需要EAX的值,但是我们找了这一层和上一层并没有发现有给EAX赋值的代码我们这里先直接给EAX赋值其他没有了好了我们现在可以确认了这个CALL 调用了EDX 和EAX的寄存器的值这个CALL的写法就是mov edx,00453028 mov eax,00991FA8 call 00452E98我们来测试下CALL成功了但是,我们拿到另外一台电脑发现居然不能用了? 调试了下发现EAX的值跟刚刚的不一样~P:如何取到EAX的固定值呢?答案很简单用CE搜看到那个绿色的值了么那个就是EAX的基址,无论EAX的值怎么变都可以在这个地址读取到真正的值代码如下mov edx,00453028mov eax,456d68mov eax,[eax]call 00452E98好了现在可以再任意一台电脑上运行了================================================== =====好了先不管这个CALL我们现在来找下EAX的值。
超级详细找CALL写CALL教程
好的。我们现在利用到了寄存器。看寄存器中的提示,有两个红色,说明当我们调用CALL的时候,它使用了寄存器中的两个地址。那么这个就是CALL的
运行环境了,也就是说,只要在我们调用这个CALL的时候,寄存器EAX中有值00D51FE4和寄存器ECX中有值0042ABE4就可以运行。这里还有一个特殊
好,不管是不是这个CALL,我们先来测试一下
我是用delphi的,所以这里讲解delphi-----这里我还要多一嘴,其实语言只是工具,只要学会了道理,就不在乎语言的问题了,其实在我们这个阶段,语言的区分仅仅是命令不同而已
我会把如何写的理论告诉给大家。让大家知道------花儿为什么这样红!o(∩_∩)o...哈哈
呵呵谢谢lz这么好的文章,希望能解答下我的问题。。。
回答:这里的ECX不是环境之一,这个不一定就要一定不变才是因素,具体问题要具体分析,如果你想知道到底这个寄存器中的值在call后是否变化了,可以进入这个call看看这个call的具体运算方法。
Quote:
引用第10楼ffzzfcll于2008-04-18 15:06发表的:
WriteProcessMemory(Hid, ThreadAdd,FunName, 128, WriteCount);//将要注入的过程写到上面建立的内存空间中
TmpHandle := CreateRemoteThread(Hid, nil, 0, ThreadAdd, nil, CREATE_SUSPENDED, ThreadID);//获得注入后过程的句柄ID
首先,我们要调用一个程序的CALL,需要干什么。当然是指定这个程序啦!如何指定?如果这里您不知道,建议您去句柄那里好好修炼一下。
OD菜鸟的福音(经典讲解CALL的找法)
OD菜鸟的福音(经典讲解CALL的找法)详细教程目录第一章概述 (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 位汇编—分析调试器。
call的生僻用法 -回复
call的生僻用法-回复【call的生僻用法】"Call"是一个常见的英语词汇,用于表示打电话或呼叫。
然而,除了这个常见的用法外,"call"还有一些生僻的用法。
在本文中,我们将一步一步地探讨一些"call"的生僻用法,并解释它们的意思以及在何种情况下使用。
1. "Call"用于表示被叫名字:"Call"也可以用于表示被叫某个名字。
在这种情况下,它用于传达一个指令或命令,要求对方用特定的名字来称呼某人。
例如,"You can call me Mr. Smith"(你可以称呼我史密斯先生)。
2. "Call"用于表示预测:"Call"可以用于表示对未来事件或趋势的预测。
这种用法在商业和金融领域非常常见。
例如,分析师可以表示对股票或商品价格的预测,比如:"The analysts are calling for a decrease in oil prices"(分析师们预测石油价格会下跌)。
3. "Call"用于表示召集或召唤:"Call"有时用于表示召集或召唤某人参加会议、事件或活动。
这种用法在组织和管理方面非常常见。
例如,"The boss called a meeting for tomorrow afternoon"(老板召集了明天下午的会议)。
4. "Call"用于表示判断或决定:"Call"还可以用于表示判断或决定某事物或情况的结果。
这种用法常见于体育比赛或裁判员的决定中。
例如,"The referee made a controversial call on that play"(裁判对那个动作做出了有争议的判断)。
call的发音规则
call的发音规则
【最新版】
目录
1.介绍 call 的发音
2.讲解 call 的发音规则
3.举例说明 call 在不同情境下的发音
正文
call 是一个英语单词,它的发音是/kl/.这个发音包括三个元音音素(/o/,//,//) 和两个辅音音素 (/k/和/l/),其中/k/和/l/分别是清辅音和浊辅音。
在 call 的发音中,/k/和/l/分别代表发音器官的阻塞和释放。
在发音时,先轻轻咬住舌尖,然后让舌头快速离开上颚,使声带振动,发出/k/声。
接着舌头向上顶,张开嘴巴,让声音自然流出,发出//声。
最后,舌头向上顶,嘴唇略微收圆,发出//声。
call 在不同情境下的发音可能会略有不同。
例如,在英式英语中,call 的发音可能更偏向于/kl/,而在美式英语中,call 的发音可能更偏向于/kɑl/.此外,当 call 作为名词时,它的发音可能会比作为动词时更加短促和尖锐。
call 的发音规则包括三个元音音素和两个辅音音素,其中/k/和/l/分别是清辅音和浊辅音。
在 call 的发音中,要注意舌头和嘴唇的正确姿势,以及声调的掌握。
第1页共1页。
call用法归纳总结
call用法归纳总结Call这个单词在英语中有多种用法和意义。
本文将通过总结归纳的方式,详细解释call这个单词的各种用法,并给出相应的例句和解释,帮助读者更好地理解和运用call。
一、名词用法1. Call作为名词,表示电话通话或电话号码。
例句:I will give you a call later.(我会稍后给你打电话。
)解释:在这个例句中,call表示给某人打电话。
2. Call也可以表示号召或请求。
例句:The captain made a call to arms.(船长发出了战斗号召。
)解释:在这个例句中,call表示号召或请求。
3. 此外,call还可以指称一次访问或访问的目的地。
例句:I made a call at the museum.(我在博物馆停留了一会儿。
)解释:在这个例句中,call表示一次访问。
二、动词用法1. Call作为及物动词,表示打电话联系或呼叫某人。
例句:I will call you tomorrow.(明天我会给你打电话。
)解释:在这个例句中,call表示打电话联系。
2. Call也可以表示称呼、命名或对某人或事物的评价。
例句:She called her dog Max.(她把她的狗命名为Max。
)解释:在这个例句中,call表示命名。
3. Call还可以表示预测或预告结果。
例句:I call it a success.(我预测这是一个成功。
)解释:在这个例句中,call表示预测。
4. Call也可以表示参观或访问某地。
例句:We called at the bookstore.(我们参观了书店。
)解释:在这个例句中,call表示参观。
5. 此外,call还可以表示召集或宣布。
例句:The teacher called the students to class.(老师召集学生去上课。
)解释:在这个例句中,call表示召集。
6. 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了希望大家多多实践,注意观察。
如何找到Call调用
如何找到Call调用
这个是自己写的VC客户端,大家可以看做是游戏的血量
使用CE找到血量的地址0x4168B0
怎么找这个很简单,很多高手已经说过了,就不再说了。
使用OllyDbg选择打开文件,找到AddBlood.exe,然后打开。
在最下方有个地方可以输入命令
输入hw 0x4168B0
按几次F9
让程序运行。
点击出来的对话框上面的
程序就会中断。
然后往上看看,看到PUSH EBP,MOV EBP,ESP一般表示函数的开始。
这里就是加血函数的开始
点击一下push ebp,就会有个箭头下来
找到根源。
看到了吧,AddBlood.AddBlood
地址在最前面0x410014
好了,这样就可以了。
然后可以使用我之前发的帖子的命令进行RemoteCall
/forum.php?mod=viewthread&tid=280508。
武林外传快捷键CALL及ID的跟踪寻找(菜鸟用)
OD下BP SEND 断点:按快捷键F1断下后,7次CTR+F9后断在00546547 |. FF52 08 call dword ptr [edx+8]0054654A|> 5F pop edi上面一句就是我们要找的快捷键CALL,; 如下图图1前6次中间分析过程略过。
我们直接分析快捷键CALL各参数的由来1、由得知,我们要找EAX的来源;往上看,EAX是由传递来的;下断后F7跟进:图2上面可以看到,EAX=[ECX],ECX=*[ECX+EAX*4] ,ECX=[ECX+C]也就是说:公式1:EAX=*[ECX+C]+EAX*4]接下来我们首先跟ECX里是什么了,分析好了再分析EAX,CTR+F9返回程序调用可以看到:ECX=EAX跟EAX,可以看到EAX由下面跳上来的图3很明显EAX=[EBX+EAX*4+8F8],既ECX=[EBX+EAX*4+8F8]由上面的分析可以知道:EAX=*[ECX+C]+EAX*4] 代入公式1:EAX=*[[EBX+EAX*4+8F8]+C]+EAX*4]这里又分支了,暂时放开[EBX+EAX*4+8F8]里的EAX,我们先找EBX的来历,顺着OD 的跳转红线一路找上去;很快就到了图4EBX=[ECX+24]ECX=[EAX+1C]EAX=[901C3C]到这里我们的一个分支已经有了,先整理一下:我们快捷键CALL的第一个参数EAX的数值= *[[[901C3C]+1C]+24]+EAX*4+8F8]+C]+EAX*4] 这样一个地址值2、找上面2个EAX的由来:首先看第一个EAX,回到图2,按F1断下后观察EAX的值是调用堆栈中是值观察堆栈ESP+4的值=0,我们找堆栈的进栈点图5可以看到而ESI=ESI-70H70很明显可以想象到是F1的ASC码,由此可见F1~F8对应栈中的0~7再一次带入上面的公式:EAX= *[[[901C3C]+1C]+24]+EAX*4+8F8]+C]+(0~7)*4] 公式23、找最后一个EAX:由图5可以看到:EAX是由CALL 503BD0返回的,在此下断,F1断住后F7进入:常数,可以看到EAX=1OK:代入公式2:EAX= *[[[901C3C]+1C]+24]+8FC]+C]+(0~7)*4]附件:VB调用123版本测试。
call的用法归纳
call的用法归纳嘿,同学们!咱们今天来好好唠唠“call”这个单词的用法。
先来说说“call”作动词时候的常见用法。
比如说,“call”有“叫,称呼”的意思。
就像我有一次在公园里,看到一个小朋友跑着跑着摔了一跤,哇哇大哭起来。
他妈妈赶紧跑过去,嘴里喊着:“宝贝儿,别哭别哭,妈妈在这呢!” 这时候的“喊”就可以用“call”,“The mother called her baby ”“call”还能表示“打电话”。
我记得有一回,我在家正忙着做饭呢,手机响了,一接,是我朋友打来的,她说:“Hey,I just called to sayhello ” 这里“called”就是打电话的意思。
“call”也有“召集,召唤”的意思。
有次学校组织活动,老师在教室里大声说:“I'll call all of you together at 8 o'clock tomorrow morning ”(明天早上八点我会把你们都召集起来。
)它还有“认为,看作”的用法哦。
比如说,“We call him a hero ”(我们认为他是个英雄。
)再讲讲“call”构成的一些常见短语。
“call on”意思是“拜访,访问”。
上次我去拜访一位老朋友,我提前给他打了个电话说:“I'll call on you this afternoon ”(今天下午我去拜访你。
)“call at”则是“拜访(某地)”。
像“He called at my house yesterday ”(他昨天来我家了。
)“call for”有“要求,需要”的意思。
有一次我们班组织活动,需要大家分工合作,老师就说:“This activity calls for everyone's effort ”(这次活动需要每个人的努力。
)“call up”可以表示“打电话;使人想起”。
我有时候看到一些老照片,就会 call up 很多美好的回忆。
- 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跟踪信息保存到一个文件中,这样就可以对比两次运行的差别。