您好,欢迎来到小奈知识网。
搜索
您的当前位置:首页ODbgScript 入门系列

ODbgScript 入门系列

来源:小奈知识网
ODbgScript入门系列

标 题: 调试好帮手ODbgScript 入门系列(一)-认识ODbgScript【原创】 作 者: hnhuqiong

时 间: 2006-05-21,21:16

链 接: http://bbs。pediy。com/showthread。php?t=26029 调试好帮手ODbgScript 入门系列(一)-认识ODbgScript 作者:hnhuqiong

看到CCDebuger的图文并茂的OD教学系列很受欢迎,这里我也仿照它的教学模式写吧,这样容易让新手学习,CCDebuger不会让律师给我发版权函吧 :),我感觉看雪如果形成了自己的教学风格也是不错的。

一、ODbgScript 的介绍

调试程序,程序逆向工作,加密解密都存在大量的重复工作,ODbgScript就是一个让你从重复而又枯燥的劳动中解脱的一个工具。OllyScript是OLLYDBG的一个功能增强插件(Plugin),OllyScript使用的脚本语言是一个种类汇编的语言。你使用它来控制OLLYDBG和进行脚本运算。它的内部机制是一种解释执行的方式,当然,大侠luocong开发了一个和这个功能相近的插件OM,所不同的是OM是运行在虚拟机上的,而ODbgScript是解释执行。现在ODbgScript在世界上有大量的使用者和他们发布了大量的脚本,你能好好的利用它。

ODBGScript的前身是由SHaG开发的OLLYScript,感谢SHaG开发了这么好的插件,并且开放了它的源码,SHaG于2004年停止了它的开发,直到今天,还有众多的爱好者在使用它。从2005-11-4开始由Epsylon3继承SHaG继续开发并变更插件名就是你现在看到的ODbgScript,并且继续开发源码发行。它现在的最后版本是1。47,由于Epsylon3开发的版本最大的变化是出现了调试运行窗口。

hnhuqiong在ODbgScript开放源码的基础上对其进行了本地化,并且优化(BugFix)。如果经原作者同意,愿意将此插件继续升级。

天工开物,必物尽其用。。。。 二、ODbgScript 的安装

ODbgScript 1。48 版的发布版本是个 RAR 压缩包,要解压到OD的plugin目录下,运行OD就可以在插件栏看见ODbgScript插件了。点击脚本运行窗口就可以看见新弹出一个脚本运行窗口(老的OLLYscript0。92版本没有运行调试窗口。)

(插入图片ODbgscript-windows。jpg,图片一)

ODbgScript中插件窗口的功能如上图。

简单解释一下各个选项的功能,更详细的内容可以看readme。txt中文帮助:

运行脚本:直接调入脚本运行,网络上有大量的各种脱壳和解密脚本文件,你可以在这里直接引入运行。

中止:中止脚本运行。 暂停:暂停脚本的运行。

继续:脚本处于暂停状态下,可以恢复脚本继续运行 单步:单步执行脚本每一句。

脚本运行窗口:这个是新版ODbgScript增加最为有用的一个功能,可以查看脚本的运行状态,观察脚本变量的结果,以及控制脚本的运行。上面图片中,就是ODbgScript的脚本运行窗口的模样。

脚本日志窗口:这个模块还不完善,在以后将逐渐完善它。 关于:这里显示的DbgScript的版权信息。 二、 ODbgScript的脚本调试窗口 (1)脚本调试窗口的介绍:

行号栏:引入脚本后,ODbgScript将脚本复制入这个窗口,并为每一句脚本语言赋予一个行号

命令栏:就是脚本命令显示在这里

返回值栏:就是函数返回值$Result显示在这里,$Result是ODbgScript的一个保留变量名,它一般保存各脚本命令的返回结果。

EIP栏:就是脚本命令现在位置,所控制的OD的EIP值,这里是观察脚本控制OD流程的地方。

计算结果栏:ODbgScript可以让用户使用变量,这里就是显示变量的计算结果

(2)ODbgScript的右键菜单功能

好了现在我们在ODbgScript运行窗口点击右键,将弹出一个菜单。如图 (插入图片ODbgScript run。jpg,图片二)

运行脚本:和插件菜单功能相同,直接调入脚本运行,网络上有大量的各种脱壳和解密脚本文件,你可以在这里直接引入运行。

脚本断点切换(F2):对光标处脚本的命令下一个断点标记,重复一次就是取消断点标记。这个功能的快捷键是F2

光标处下断点并执行(F4):对光标处脚本的命令下一个断点标记,并让脚本运行到这里。这个功能的快捷键是F4。

单步执行(S):单步执行脚本的语句。这个功能的快捷键是S键

继续(SPC空格键):如果脚本处于暂停状态,切换脚本到继续运行状态,这个功能快捷键是 空格键(SPC)

放弃(ESC):放弃脚本运行状态,也就是让脚本复位,重新处于第一行的位置。

编辑变量:ODbgScript有一个功能很好用,就是变量的使用。这里是查看变量和编辑变量的地方。

如果进入变量,可以看见2个值,一个是0x表示的是16进制值,一个是。表示的是十进制值

手工执行脚本命令:有时候调试脚本的时候,需要手工运行脚本命令,那么这里就是为你提供这个功能的地方。

其它介绍:如果引入了脚本,你会看见一个横条,这个是标号分界条,它利用脚本标号对脚本分界。

让你的脚本可读性大大加强,建议今后的脚本可以多使用标号。 光标条:脚本运行到的脚本命令位置会有一个光标条,当然它的颜色可以根据你的要求来调

整。

好了,从基本上ODbgScript介绍完了,我们来看看它在OD中和其它窗口联合的工作状态。 (插入图片 OD。JPG,图片三)

和ODbgScript配套使用的程序有loveBoom开发的Ollyscript editor 1。0b3。 如图:

(插入图片 OSC。jpg,图片四)

它是一个ODbgScript语言编辑器。

好了,首篇先到这里,下一篇将介绍ODbgScript的语言和命令。 标 题: 【原创】ODbgScript 入门系列(二) ODbgScript的命令 作 者: hnhuqiong

时 间: 2006-05-22,14:11

链 接: http://bbs。pediy。com/showthread。php?t=26053

调试好帮手ODbgScript 入门系列(二) ODbgScript的脚本语言和命令 (作者:hnhuqiong)

总观ODbgScript洋洋洒洒那么多脚本命令,其实它分成了6大类:

1。变量和注释类和杂类 2。断点类 3。系统和操作类 4。流程控制类 5。计算和寄存器操作类

6。字符串操作和搜索和替换类

这里我就不那么具体的举例子了,因为那么多命令要是逐一图片讲解将成为天书了。 而具体的例子将在后面的章节来论述。这里将论述的是思想。授人以渔是上策! 文章不短,建议边听音乐边看(建议曲目:喜唰唰,披着羊皮的狼) 一。 变量和注释以及杂类

$RESULT :这个是系统保留变量,函数和ODS的命令返回都放这里。它还有一个隐含的变量

为$RESULT_1,有的返回是2个参数,第二个放这里。 $VERSION :返回当前版本号

VAR :在脚本中,声明一个变量

AN :从指定处,对代码进行分析 CMT :在指定地址处,加入注释

MSG :将指定消息,显示到一个对话框中

MSGYN :将指定消息,显示到一个对话框中,这个对话框有“是”、“否”按钮

ASK :显示一个提示输入框,让用户输入,并将结果保存转保留变量$RESULT中

(如果用户按了取消键,则$RESULT=0) #INC :脚本里面包含了另外的脚本

这是一个小类,它们主要就是做变量和注释工作。其中唯一需要注意的是var命令,它是一个变量声明 命令,如果要养成一个好的脚本编辑习惯,你最好将脚本的变量名字命令的通俗易懂,这样,不会到了时间

久远而不至于你自己都看不懂你的脚本。 例子:

var a :这就不是一个好的变量名,其它人或者时间久了你都不知道它是干什么用的了。 好的例子--var entrypoint 二。断点类 ------普通断点类

BP :在指定地址设断点 BC :清除指定地址的断点 ------条件断点类

BPCND :在指定地址处,设置条件断点

BPL :在指定地址处设置记录断点,将表达式的结果记录到记录窗口中

BPLCND :在指定地址处设置记录断点,如果条件为真时,将表达式的结果记录到记录窗口中 ------硬件断点类

BPHWS :在指定地址,设置硬件断点 BPHWC :删除指定地址处的硬件断点 BPHWCALL :删除所以的硬件断点 ------内存断点类

BPRM :在指定地址处,设置一个内存读取断点 BPWM :在指定地址处,设置一个内存读写断点 BPMC :清除内存断点

对于调试和逆向工作来说,断点是重中之重!只有掌握了断点基本技能,才能说你学会了逆向工作的入门。

有过编程经验的人都知道在源代码下调试还是比较容易的,因为你可以在源代码上直接下断点调试。而逆向就 不同了,你面对的是二进制文件,如何找断点,怎么下断点都是靠常年累月积累下来的经验。当然在看雪你能学

到很多很多的下断点技巧。ODbgScript里面提供的断点基本囊括了OD强大的下断点的功能。而如何灵活的组

合和使用它们将让你的逆向水平有质的飞跃。

这一节可以和CCdebuger的OD断点文章相参照学习脚本的编辑和断点使用。

ODbgScript断点命令是通过OD的API接口向OD下断点命令的,所以,只要你在OD中能下的断点,那么,在

脚本中就能一样下同样的断点。所不同的是一个是你手工下,一个是脚本帮你下!可以这样说,逆向和解密就

是不断的靠近自己所需要的核心地带,只要真正的找到了核心地带,那么剩下的就是程序等待你的肢解和解

剖了。而这个过程就是如何利用断点来靠近它。而让人痛苦的是,常常你要经过无数次的实验和验证你才会

靠近你所需要的核心地带。没有ODbgScript以前,这个是一个让人痛苦不堪的过程,特别是如果程序有大量

的干扰和anti,你必须手工小心翼翼的越过这些障碍,爬山涉水千艰万险的来到程序某个地方,一不留神被

ANTI,你必须重头再来,这个过程任何玩逆向的人都深有体会。特别是在没有OD以前,记得多年前我在2。8

版的SICE上,为记录很多东西不得不鬼画桃符的写的到处都是记录。而一旦\"失手\",那么很多过程是不得不再

做一遍。其中的艰辛不是能描述的。

而有了ODbgScript你就不同了,anti也好干扰也好,它能让你过去的工作在瞬间帮你完成。你就能集

中力量寻找你的核心地带,而不会被已经分析过的各种干扰,anti所!它就是我们对付ANTI和虫海战术的

利器!!!可以说一个软件或者一个壳无论你有多复杂,无论你多虫海,只要有一个人有真正进展!并公布工作

脚本,尽管是半成品那么其它人就可以利用脚本不断的站在前人的肩膀上,向你进攻!壳是相对静态的防守,

这就是加密和加壳软件的悲哀!你是anti是利用不为人知的后门,就有无数人想方设法靠近你的命门,那么

你的\"专利\"就大白天下了。你是多么复杂的算法,多么变态的VM,那么只要每天有人在算法上进步一点点,

点点滴滴的积累将会铁棒磨成针,不要小看逆向界人的耐心!!!!

由于后门和有效ANTI越来越少,加密和加壳开始向虫海方向发展,也就是利用反复的加密算法和动态解码

,以及VM(虚拟机)来产生大量的垃圾代码,反复和你斗你的耐心,从个人角度来说,的确逆向界开始遇到了一

堵厚实的墙。但大家要相信一句话,自古有矛就有盾!!!。我还相信一句就是众志成城!!! 这也是我想发展ODbgScript的初衷和下力气写这篇文章的动力。 罗嗦了半天,我自己都感觉我像缠脚的老太婆了。

其实我们用ODbgScript的一个主要目的就是-----直奔主题!

好了,我现在也回来直奔主题。我说到哪里里了??(各种砖头都来了)

这里,我们来演示一下断点的设置,看看在ODbgScript中下一个断点,那么OLLYDBG中有什么反应???

我们调出你的编辑器,先写一个简单的脚本如下,然后保存成txt或者osc文件: bp 40a910 bc 40a910

然后调出脚本运行窗口,引导你刚才写的脚本进来,按下S键,我们看看ODbgScript和OD中的断点窗口各有什么反应。 (插入图一:2-bp。jpg)

脚本窗口里面一按S,马上OD的断点窗口就产生了一个断点。再按一下S,OD中的断点窗口中的断点又消失了。

哈哈,我再按,我再按。哟,怎么没有反应了?当然就2句命令,你按那么多抽风呀??? (被一顿暴打,教学就教学,哪来那么多怪话)

那么,现在我们知道了,ODbgScript和OD之间通过 Plug-in API接口能很好的沟通。最起码比OD断点窗口里面

你要手工设断点激活或者删除强多了吧?要知道偷懒的人多了去了(被无数人怒目而视,寒~~~~),能省下时间干什么

去??直奔主题!!!!每次开会看见我们单位的头我都在假想,他会逆向多好呀。。。。

OD中断点主要分为4小类,普通断点,内存断点,硬件断点,条件断点。我不打算讲解断点的原理,有兴趣大家

可以看看雪大量的文章,大侠级别的,断点玩的都不叫断点叫INT,这个是什么?我不知道,我是菜鸟级别,不敢往 这个上面发言。。。。

那么,这四小类断点和其它命令的的组合将带你进入五光十色的逆向世界!!! 3。系统和操作类 -----内存操作类

ALLOC :分配新的内存页, 你能读/写/执行。 FREE :释放由ALLOC申请的内存。 -----文件操作类

DM :从指定地址处开始,在内存中提取指定大小的数据,并保存到指定的文件中

DMA :从指定地址处开始,在内存中提取指定大小的数据,并保存到指定的文件中;

如果指定文件已存在,则将数据追加到指定文件尾部。 DPE :提取执行模块到指定文件中。

WRT :Write to file (replace existing one) the only accepted symbol is \"\\r\\n\"Numbers are wrote as strings。。。 for the moment WRTA :Append to file

LM :引导Dm文件到内存 ,LM is the opposite of the DM command -----系统信息类

GPA :在指定的动态链接库中,获得指定函数的地址。

GCMT :获得指定地址的注释 GMEMI :获得内存块的指定信息 GPI :获得进程信息

GN :获得指定地址的符号名(比如指向API函数) GMI :获得指定地址所在模块的相关信息。 HANDLE :获得句柄信息 -----汇编和OD控制类

ASM :修改指定地址的指令。

EXEC/ENDE :对当前调试进程,执行在EXEC和ENDE之间的指令 KEY :相对于在OD中执行按键 古话有说:满纸荒唐言,一把辛酸泪。

其实,这段是最难写的,因为这段是承上启下的一段,有了这段你才能体会ODbgScript的强大,才

能从这里开始和中断组合产生各种五光十色的脚本世界,来到这段我常常有一种如履薄冰的感觉,生怕

误人子弟。这里别看命令不多,可句句都是重点。我在看源程序的时候,对这段的了解才更加的加深了我

对OD和ODbgScript的理解。

而ODbgScript今后如果能成功升级,核心的重点也在这里。

古人云:工欲善其事,必先利其器。如果说中断是ODbgScript的器。那么这里就是利你的器!!!

是情报和特工及机构,没有情报机构,那就是瞎打乱打。没有特工机构,就会让你身处危险而不知其险。

没有,你面对敌人强大的防护,束手无策!

希望不至于写成类MSDN的东西,可很多东西又难以取舍,霍金有一句话,你的一个公式能让你的读

者少50%。我尽量能写成入门级的东西,霍金的名言才让他的<时间简史>让无比抽象的时空概念深入人

心,让千千万万的老百姓明白什么是黑洞和黑洞辐射。

好了我们再次奔小康,不是不是,是奔主题!!!!(场外人全部处于抓狂中。。。。) 首先我们在脚本里面写下这样一些命令,引入ODbgScript然后按S执行。 gpa \"MessageBoxA\", \"user32。dll\" bp $RESULT esto

bc $RESULT

(图片2-gpa。jpg)

大家看到了,在返回值栏里面有一个值,这个值是什么呢?就是函数MessageBoxA的入口地址,这个

函数常常被注册码类的程序所调用,给大家一个比如注册码错误之类的提示。如果我们要定位这个注册

码的算法位置,那么如果弹出来了这样的窗口,算法就在附近不远的地方。情报机构上!!!!告诉我坐标,

中断大炮在后面等着。大炮要打敌人第一件事情是要知道敌人在什么地方。而这个MessageBoxA的入口

地址就是敌人首先暴露的一个坐标点。我们利用GPA命令来定位它的位置,而这个位置是随着计算机的不 同而不同的,我们要抓住敌人,就要充分利用GPS来定位它!不对不对,不是GPS是GPA!!!(场下开始,

台上死猪不怕开水烫的继续说),情报机构准确的抓到了这个位置,那么通信兵是谁???就是$Result!!

它越过重重封锁线将坐标地址给中断大炮阵地送来了坐标,预备!~~~放!!!我们按下空格键让中断大炮 去打吧。

轰!程序诧然停止。打中啦~~士兵狂吼,硝烟散去。

作为指挥官的你邹了一下眉头,自言自语的说,是打中了,可离人家指挥中心差老鼻子了。又不是原

子弹,覆盖范围可以那么大!

怎么办?还需要更加精确的坐标!我们要派特别行动队出动了。

脚本上开始加下面的句子,然后执行,并调出OD的内存窗口,可以进行观察: alloc 2000

我们可以看到OD的内存区中增加了一个块,大小2000属性RWE。大家对比一下图3和图4

(插入图三: 2-alloc1。jpg) (插入图四: 2-alloc2。jpg)

(我们在敌人的眼皮低下打了一个埋伏区。。这个埋伏区可以藏弹药,可以藏,还可以打一场CS。。。。。。。。。。。。 。。。。台上不说话了,CS激战中。。。。。。想暗渡陈仓?小心点记得留退路哟。。。 突然听见MS电台广播在不断的播放歌曲:

\"洗刷刷,洗刷刷,请你--拿了给我的送回来,吃了我的给我吐出来,欠了我的给我补回来,偷了我的给我交出来!!!\"

侦测连长看偷袭阵地这样长期占领危险,还是有借有还!再来不难,马上烧军火等等走人。) free $RESULT,2000

这里指挥官还派出了外交官,要打击敌人就要从多方面的入手。

gmi eip,CODEBASE (或者CODESIZE,或者 MODULEBASE,MODULEDSIZE等,外交部在不断扩大范围中。。。) (插入图五:2-gmi。jpg)

某某情报局派出了天下无敌光头武乞丐功夫王\"零零漆\"----外号\"走醒醒\"上场。

GPI MAINTHREADID(可以是 HPROCESS,PROCESSID,HMAINTHREAD,MAINTHREADID,MAINBASE,PROCESSNAME。) (插入图片六:2-GPI。jpg)

某新闻社派出了强大的以\"不是零\"为代表的著名文字分析专家记者代表团。要知道记者是无冕之王!!!!!!

这里可以说你会明白为什么\"焦点访谈\"为什么那么可怕了。老百姓欢迎,有的人就要。。。。 (这里放到下面的一章专门讲叙)

为了打好这场战役,某野战军派出了王牌之师,ASM给以策应。 ASM eip,\"mov [eax],edx\"

从战役角度来说,围点一定要打援,那么,现在敌人那么狡猾,我们怎么能缺少这样的策应队伍呢???

它为什么是策应队伍呢?因为它只能向代码区汇编一句,效率比较低。但是毕竟是在和敌人干上了。。。

最高首长派出了空军王牌师EXEC/ENDE,直接轰炸给予空中支持,可惜空军轰炸机只有能装255颗的弹药仓。 exec

mov eip,[eax] ENDE

对当前调试进程,执行在EXEC和ENDE之间的指令。

有这个命令就是你可以越过ODbgScript直接跳入进程,对进程进行直接控制。

它的原理就是取当前进程的信息进行保存,然后新分配一个代码内存区(可读/写/执行。大小1000)

调用OD汇编器将你的汇编语句转成OPcode,将OPcode拷贝到代码区,然后将EIP指向你的代码开头。

然后将控制权交给你。执行完后将EIP归还原位,然后将控制权交还ODbgScript。 这里的好处就是让你以很高的效率来避免在较慢的脚本环境运行需要高效的操作。 !注意:由于进程控制权交给你了,那么,你的代码有效性将只有你自己来控制了。 !注意:执行后不保存现场。这都需要你来做工作。(要保存现场,你可以使用pushad,popad) 有大括号的,会被大括号中的变量的值替代。 (这对命令有小BUG在下一个发布版本中修正)

还有就是我们英雄的幕后,电子对抗队伍KEY在默默的支持着这场生死之战。。 key 20, 1 //Shift+space

一场战役就这样开始打响,轰轰烈烈。。。。。。。。。。。。。。。。。(世界没有免费的午餐) 各种和敌人短兵相接。。。。刺刀见红。。。。。。。。。。。。。。(见后章) 你会看见我们的是那么连贯的一气呵成完成了使命。。(效果出来了) 千帆过尽谱写的是华丽篇章。。。。。。。。。。。。。。。。。。。。。。。。(过程是那么美不盛收) 尽管尽管曾经历经千山万水。。。。。。。。。。。。。。。。。。。。。。。。(过程是那么令人辛酸) 可最终还是剑指七寸红颜笑。。。。。。。。。。。。。。。。。。。。。。。。(原来是披着羊皮的狼) 最后是你哼着\"日落西山打靶归。。。。\"

打扫战场,收获你的战利品,文件类操作就是干这个的。。。。。。。 dpe \"c:\k。exe\", 401000

(再不睡觉我LP要和我刺刀见红了 :( )

好了,这篇先到这里,下一篇将介绍ODbgScript的文字串命令和流程控制命令。 标 题: 【原创】ODbgScript 入门系列(三)ODbgScript的脚本命令(2) 作 者: hnhuqiong

时 间: 2006-05-23,18:57

链 接: http://bbs。pediy。com/showthread。php?t=26130 ODbgScript 入门系列(三) ODbgScript的脚本命令(2) 4。流程控制类

我曾经教过一个小DD写脚本,他老是把OD的运行流程和ODbgScript的流程搞混淆了,这个概念要

弄清除,作为新手常常弄不清这两个概念,而这两个概念是必须要弄明白的!要知道ODbgScript是一个

脚本插件,它执行脚本的流程,靠脚本运行过程中各种返回值/计算值判断后,修改/控制/影响OD的流程。 还是打个比方吧:

ODbgScript是铁路传感/信号/道岔控制系统,OD就是列车,而各种返回值就是各种信号灯和传感器,列车

的运行过程中,传感器系统不断的给出列车的各种运行状态,而ODbgScript就根据这些运行状态来调相

应的运行时刻表让列车在控制的范围内运行。那么ODbgScript控制道岔系统就完成了一趟完整的调度系统。

大家都坐过火车吧??你喜欢的是打着信号灯的铁道工人?还是现代化的排灯/道岔控制系统???

对应上一章的中断系统,我们又换概念打比方了(呵呵,对于新手我还是感觉自己有自己的一套办法来教

大家弄清这些的),断点在这里就是在铁轨上的信号灯,传感器它感受到了列车(OD)到这里了,马上给控制系统

(ODbgScript)发回信号,控制系统知道列车在什么位置后,相应的控制---信号灯/道岔系统,列车就乖乖的

听从我们的调度来运行了。脚本其实就是列车时刻表!!!而脚本内的标号就是所管理的机务段!

邓爷爷说:实现四个现代化,靠的是科技!

hnhuqiong说:OD逆向实现自动化,靠的是ODbgScript! (被愤怒的群众痛殴中!!!) -----ODbgScript流程控制类

EOB :在下次中断发生时,跳转到指定标签处

COB :发生中断后,让脚本继续执行(移除EOB指令) EOE :在下次异常发生时,跳转到指定标签处

COE :发生异常后,让脚本继续执行(移除EOE指令) JA :大于则跳到指定标签处,在cmp命令后使用 JAE :大于等于则跳到指定标签处

JB :小于则跳到指定标签处,在cmp命令后使用 JBE :小于等于则跳到指定标签处 JE :等于则跳到指定标签处 JNE :不等于则跳到指定标签处 JMP :跳转到指定标签。 PAUSE :暂停脚本运行 RET :退出脚本 -----OD流程控制类

RUN :相当于在OllyDbg中按 F9 GO :执行到指定地址处 F4

ESTI :相当于在OllyDbg按 SHIFT-F7 ESTO :相当于在OllyDbg按 SHIFT-F9 STI :单步步入,相当于在OllyDbg中按 F7 STO :单步步过,相当于在OllyDbg中按 F8 RTR :相当于在OllyDbg中执行 \"Run to return\"操作 [Ctrl+F9] RTU :相当于在OllyDbg中执行 \"Run to user code\"操作 [Alt+F9] AI :在OllyDbg中执行“自动步入” [Animate into]操作 [Ctrl+F7] AO :在OllyDbg中执行“自动步过” [Animate over]操作 [Ctrl+F8] TI :相当于在OllyDbg中执行 \"Trace into\" 操作 [Ctrl+F11] TO :相当于在OllyDbg中执行 \"Trace over\" 操作 [Ctrl+F12] TICND :执行 \"Trace into\" 操作,直到条件为真时停止 TOCND :执行 \"Trace over\" 操作,直到条件为真时停止 TC :关闭Trace

LBL :在指定地址处插入一个标签

现在大家明白了ODbgScript可以给我们带来多少便利了吧????概念恐怕大家已清楚了,

就不多讲解了。

其实,这些都是自动控制专业范围内的东西,刚好我本科是这个专业,所以比较轻车熟路。 :)

现代化社会这些自动控制无所不在,只是你用上了却不一定留心它!

用一个复杂一点的脚本示意图我们简单的来进行类比,让大家牢牢记住它的(感谢FLY的FSG V1。X-2。X脚本) (插图一:3-fllow。jpg)

5。计算和寄存器操作类

有了刚才的概念,那么这里的计算概念就好办了,这些都是ODbgScript内的计算。这里就不多讲解了。

就是现在命令有点少,我争取在下一个版本加多命令,这样调度起来不至于不会计算了,只好上铁轨手工 操作了。。

INC :对变量进行加一操作

ADD :源操作数与目的操作数相加,并把相加的结果保存到目的操作数中 DEC :对变量进行减一操作

SUB :和汇编里的sub一样,两个数相减

AND :源操作数与目的操作数进行逻辑与操作,并将结果保存到到目的操作数中

XOR :源操作数与目的操作数进行异或操作,并将结果保存到到目的操作数中 OR :源操作数和目的操作数做逻辑或操作,并将结果保存到到目的操作数中 SHL :左移目的操作数,n比特位;并将结果保存到到目的操作数中 SHR :右移目的操作数,n 比特位;并将结果保存到到目的操作数中

CMP :比较 目的操作数与源操作数的大小,和其对应的汇编指令作用相同, 现支持字符串比较

REV :字节反转。

MOV :将源操作数移动到目的操作数中 6。字符串操作类

LEN :获得字符串长度

FIND :从指定地址开始在内存中查找指定的内容

FINDOP :从指定地址开始查找指定一个指令,这个指令是以指定内容为开始的 FINDMEM :全内存中查找指定的内容

ATOI :转换一个字符到整数,返回结果保存到保留变量$RESULT中 ITOA :字符串进制转换

EVAL :计算含义变量的表达式

EXEC/ENDE :对当前调试进程,执行在EXEC和ENDE之间的指令 FILL :从指定地址处,填充指定长度的值

REPL :在指定地址开始,在指定长度字节内,用“替换字符串”替换“查找字符串”

SCMP :比较字符串,目的和源比

SCMPI :比较字符串,只不过是源和目的比 PREOP :获得当前地址的汇编指令 REF :交叉参考

OPCODE :反汇编当前指令

这里是一个很强技术概念类的类,为什么这样说呢?因为完全靠系统信息来定位断点是远远不够的,那么

我们必须寻找程序内的\"特征代码串\",这个和杀病毒软件是一个概念,杀病毒软件是怎么干活的??就是

搜索内存,找各个程序的可疑的\"特征字符串或者特征码\"。和人的DNA一样,各个程序的DNA是不同的

但又有相同的地方这就是亲子鉴定中心赚钱的秘方 :)。

从逆向角度来说,某个系列的加壳,加密软件它有它的一贯性,因为它的开发架构已经定死了,除非

它大规模推倒从来。这里我就自己创造一个叫法叫\"程序的DNA\"吧,这个不是我提出来的,很多大侠早就

提出了这个概念,比如FLY的\"特定码\",OPcode其实就那么多,但是就是这些,简简单单的OPcode就组成

了千千万万的程序,但有些东西是具有一贯性的,这个和生物学上的遗传概念一模一样。药剂学上有一个

东西叫生物试剂,就是利用生物的特定DNA来检测的。

一旦我们找到某个\"程序的DNA\",那么很多东西就简单多了,大侠级别的就是\"程序DNA试剂工厂\",

他们能够通过他们长年累月的积累总结出了大量的\"程序DNA特征\"检测手段,并且能够敏感的捕捉到

新的\"程序DNA特征\",这些才是逆向水平高低的所在。

为什么呢会这样呢?因为程序必须某时某刻要干某件事,这就注定了它的死结,大侠们能一眼就看明白

这段OPcode它是在干什么(这需要长年累月的积累),你要动态解码,那么你解码的一小节就是你的命门,

你要ANTi,你anti前必须做准备工作,这个准备工作就是命门等等诸如此类。你要干什么,我就在你要干什么

前定位你的\"特征码\",在你干什么前把你的手段给残废了(大侠们够残忍了吧?呜~~~我的ANTI,我的解码)

这就是矛和盾永远可以斗争的地方,我anti你,你定位我的ANTI,好,那么我要动态解码后才ANTI,

大侠就盯上你的动态解码的回写内存,我把我动态解码一段花了,那么,我用花特征分离出你的花。。。。。。。

逆向反ANTI的手段就是在你动手前我先动手!!!!这叫先发制人,一招快,招招快!!!!可怜程序它必须

按照列车时刻表来跑,最搞笑的是脱壳领域,有的大侠懒得理哪些大规模的ANTi了不费哪个劲脱你了,就干脆

写个小东西Loader带跑。穿透壳后用特征码一步步定位后patch掉,何必处处脱呢。。。。。。。。 这里,我说了一通,大家可以看图一,第20行命令find eip,#fe??0f84#, 这个句话的含义就是寻找

特征字符串fe??0f84,而这个特征字符串是什么含义呢,??代表的是可以是Hex任何数, 说明被2。0版FSG保护程序

在第一次运行系统函数LoadlibraryA后,从这里取出ESP指针所指的内存地址,下断点后,就会出现了这个特征字符

码。这个是2。0版特有的。大侠们发现了它的这个特征码。它出一定会出现在被FSG2。0保护程序经过上面运行步 骤后的某个内存地址中。

大家是不是有点豁然开朗的感觉?? 我们来分析一下轰动一时的特征串:

00B2C27C 68 A78FC31F PUSH 1FC38FA7 f9,改eip

00B7266A CALL 00B7267C

68A78FC31F就是在程序还没有启动运行的时候,就存在的一个特征字符串,它存在于加载到内存后

的地址00b2c27c上,大侠发现了它的这个BUG,就是在00b2c27c处,直接将列车扳道岔到00b7266a上,火

车一下子变轨到b7266a处,从而跳过了themida的验证。 我们用脚本来实现这个思想是什么样的? var bugaddress1 var bugaddress2

find eip,#68A78FC31F# //查找<特征字符串> mov bugadr1,$RESULT //保存查找到的地址

bphws bugaddress1,\"x\" //给bugaddress1处信号灯传感器系统下命令(断点) run //列车放行,会被bugaddress1处的信号系统命令停下来 bchwc bugaddress1 //信号灯系统复位,但列车还是停在原位等待放行 :) mov bugaddress2,b7266a //将b7266a的地址给变量

mov eip,bugaddress2 //扳轨改变列车时刻表,从bugaddress1-bugaddress2处

//所有站点都不过了,直接走近道到bugaddress2。 //这下这些站点的\"乘客\"们傻眼了,被脚本指挥的列车拒载了。

esto //列车放行

这个特征字符串仅仅存在于themida的1。3。3。0中,而不是全系列的themida的特征字符串,但是这个思想只要有

了就容易了,可你是否具备了一眼就能从全系列themida中利用它的这个思想来定位它的<特征字符串>的能力,那就

需要你不断的加强你的功力了。其实1。3。3。0爆出这个BUG,各路大侠马上行动,先从1。3。3。0版本中定位b2c27c和

00b7266a地址处上下文中有什么可以进行再定位的地方,其实这就是这个系列的DNA指纹。从而一代枭雄轰然倒地!

而上面的脚本的bugaddress1,和bugaddress2就是大侠们利用ODbgScript来进行反复搜索的利器。

(习题,你能从1。3。3。0版本里面找到通用于1。3。3。5版bugaddress1的DNA指纹么?) 这里我们讲解完了,ODbgScript的命令等等,下面章节我将讲解ODbgScript的使用注意事项和使用技巧。

(作为脚本创作大户,原loveboom,fly都是脚本高手,其实他们才是真正的ODbgScript的英雄,我不才勉为其难吧 发表速度可能要慢下来了,找合适的例子进行演示和进行语言组织就不像前三章那么可以天马行空了。)

标 题: ODbgScript 入门系列(四) ODbgScript的 注意事项和使用技巧 作 者: hnhuqiong

时 间: 2006-07-25,10:47

链 接: http://bbs。pediy。com/showthread。php?t=29572

ODbgScript 入门系列(四) ODbgScript的 注意事项和新手使用技巧

ODbgScript还在不断的完善中,它是一个脚本解释器,那么它需要把用户的 脚本命令一一解释出来并执行,你必须严格复合它的命令规范它才能解释你的命令。 ODbgScript程序是这样定义的:

命令 目的操作数,源操作数 [,附加操作数]

命令:必须是ODbgScript能识别的命令,我前3章已经讲解了,不过今后命令不断的扩展中

操作数:

HEX : 既没有前缀也没有后缀 DEC : 在后缀中加点。

VAR : 变量,这个变量必须在使用前用Var进行定义

32REG: 32位寄存器 (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP) 16REG: 16位寄存器 (AX, BX, CX, DX, SI, DI, BP, SP) 8REG: 8位的寄存器(AL, AH, BH,BL,CH,CL, DL, DH) [ ] : 被中括号括起来的内存地址 而[]中可以是数值,寄存器,变量

FLG :一个标志位,带有感叹号前缀(!CF, !PF, !AF, !ZF, !SF, !DF, !OF)

## :HEX的数据系列 \"\" :字符串系列

?? :包含??的HEX系列或者字符串系列,代表的是可以代表任意数 {} :过程计算符,中间可以放的是变量 ::标号,跟在你命令的名字后面,代表对程序分段

本来1,47版可以支持+-*/&|^><的操作数,这个纯粹是C爱好者的一相情愿,也让脚本变得

可读性和通用性大大下降,我准备在后续版本中拿掉这个功能。看大家的意愿吧。

这里以看雪的<脱壳基础知识入门(2006年版)>为蓝本来讲解,这样便于新手对照来学习: <第一课PE格式章节,第三课 认识壳章节>

我们知道一般能玩PE文件的大部分是用正常的编程语言才能取PE的东西,我们用 脚本来完整的实现一次怎么知道PE信息。

(GMI将在下一个版本发布中增加大量的可获取PE信息的操作数,基本可以囊括整个PE结构的

基本信息。这个命令不光查exe的信息,同样可以查DLL的详细见发布版readme) 脚本一:取得有用的PE信息

//=============================================== var modulebase var DOSstub var PEheard var codebase var codesize

var ImportAddressTable var IATsize var temp var tmp

var OrignalFirstThunk var TimeDateStamp var ForwardChain var Allname var FirstName var FirstThunk var Namesize //获得基本地址 getbaseinfo:

gmi eip,MODULEBASE mov modulebase,$RESULT gmi eip,CODEBASE mov codebase,$RESULT gmi eip,CODESIZE mov codesize,$RESULT //寻找DOS头

mov DOSstub,[modulebase],2 //只取2个字节,这个小技巧很多大侠都不知道 :) cmp DOSstub,5a4d //\"MZ\"

jne end

//寻找PE头地址

find modulebase,#50450000# // \"PE\" mov PEheard,$RESULT //寻找IAT相关数据 mov temp,PEheard

add temp,80 //PE文件头偏移80处放的就是IAT mov temp,[temp] add temp,modulebase

mov ImportAddressTable,temp //取得IAT的地址 mov temp,PEheard

add temp,84 //PE文件头偏移84处放的就是IAT大小 mov temp,[temp]

mov IATsize,temp //取得IAT大小 //你将看见第一个DLL的API

mov temp,[ImportAddressTable+C] add temp,modulebase find temp,#0000# sub $RESULT,temp

mov Namesize,$RESULT //求得ALlName的大小 readstr [temp],Namesize //读出ALLName mov AllName,$RESULT find temp,#00# sub $RESULT,temp

mov Namesize,$RESULT //求得第一个Name的大小 readstr [temp],Namesize //读出Name mov Name,$RESULT mov temp,[ImportAddressTable+10]

mov FirstThunk,[temp+modulebase] //求出FirstThunk

gn FirstThunk //查询FirstThunk的符号名 mov tmp,$RESULT

//在调试文件所在目录里向PE。txt文件写信息 eval \"modulebase={modulebase}\" wrt \"PE。txt\",$RESULT eval \"codebase={codebase}\" wrta \"PE。txt\",$RESULT eval \"codesize={codesize}\" wrta \"PE。txt\",$RESULT

eval \"ImportAddressTable={ImportAddressTable}\" wrta \"PE。txt\",$RESULT eval \"IATsize={IATsize}\" wrta \"PE。txt\",$RESULT eval \"AllName={AllName}\" wrta \"PE。txt\",$RESULT

eval \"Name={Name}\"

wrta \"PE。txt\",$RESULT

eval \"FirstThunk={FirstThunk}={tmp}\" wrta \"PE。txt\",$RESULT end: ret

//================================================================== 呵呵,我写VC同样的程序还没有它清晰好读,到处是指针。你看这个多清爽!!! (注意:这个版本里面加了命令readstr,请下载最新ODbgScript) <第二课 SEH技术>SEH脚本规避技术

其实,SEH挺死的,它的结构和原理在看雪已经被各位大侠研究透了,核心关键是抓住 SEH的就是异常处理的句柄,它让异常的程序能回归进入正常的流程。我这里要强调一点, 请小心使用你的硬件断点。至于为什么你去看SEH原理。所以请大家都检查一下OD,看选项-调试一栏

中,不要钩上硬件断点,否则你每次F7和F8都是下的硬件断点。硬件断点最好在需要的时候再下。

<第六课 寻找OEP>

(1)根据跨段指令寻找OEP和根据堆栈平衡原理找OEP ESP定律的发现和不断的完善是脱壳界一个重大进步,我们知道,壳无论怎么玩都是要交回 原运行环境给程序,这样就暴露出它的软肋,我们定位好堆栈的数据,只要某段时刻一旦两个环境

重合,就说明壳转了一圈回到了初始的环境,即便它不马上跳去OEP。但是,从堆栈平衡的原理来说

它完成了它的一个轮回。原理上来说,只要我们能熟练的把握好<堆栈平衡原理>,那么你就能够

在各种壳的风口浪尖上不走迷失了方向。我个人也认为<堆栈平衡原理>是对付壳的一个重大武器,

我们可以不断的在这个基础上进行深化和突破。

我们常常遇见ESP定理\"失效\"的时候,其实,它并没有失效,而是你不要把ESP定理机械的理解为

就是OEP处,,就像我们知道的两点决定一线一样简单的定律,你只是简单的想成一根线,那么,你还能

对付考大学路上的题海么? :)

真正掌握ESP定律,真正吸取ESP的精髓,壳等待你的就是你无比尖锐的利剑。。。

我曾经用ESP原理破掉了90%的壳,一个很简单的方法,我写过一个程序,就死死盯住原始环境,你走

多少次我记录多少次,然后把纪录一看再作些工作统计一下,OEP绝大部分原形毕露。。。方法笨是笨点,但找OEP 准确率太高了。

这里是一个简单的ESP定律脚本,主要是对付一些简单的压缩壳和保护壳,毕竟是教学,就不把它写复杂了。

这里用了几个小技巧就是靠单步来寻找pushad,并且避开当前就是pushad。并且还原堆栈以前的状态。

由于是脚本直接用指令改了EIP,所以,屏幕并没有刷屏,大家要双击一下EIP就是可以看

见堆栈还原后的状态 了。

脚本三:ESP定律

//===================================================================== Start:

msgyn \"你是选择pushad/popad方式吗(是)?还是狭义ESP方式(否)\" cmp $RESULT,1 jne esp

mov tmp,[eip],1

cmp tmp,60 //比较当前指令是否是pushad(60)如果是转ESP处理方式 je esp

findpushad: //如果不是就一直找到pushad(60)的地址 find eip,#60# cmp $RESULT,0 je findtmp

mov tmp,[eip],1 cmp tmp,60

jne findok sti jmp esp findtmp: sti

jmp findpushad

findok: bp $RESULT esto

bc $RESULT esp:

mov tmp,esp sub tmp,4 sti

bphws tmp,\"w\" esto

bphwcall

preop eip //向上还原堆栈状态。 mov oep,$RESULT add esp,4 mov eip,oep

msg \"你已经到达ESP平衡处\" end:

ret // 结束脚本

//============================================================== (3)根据编译语言特点找OEP

这个没有什么可教学的,就是需要你平时在计算机里面搜集一下各种没有加过壳的小程序,

建立常规

程序的搜集库,这些小文件可以很好的教你如何识别OEP的规律,各类语言编译的文件入口点都有一些规

律的,在于你是否熟悉它,千变万化不离其宗。重要的是现在壳开始大规模偷OEP的头了,这样就很难用一

般方法来简单定位OEP了,偷归偷,可环境它不能乱来,它只能来仿真以前的语句来实现被偷OEP的运行模

式,壳现在的确还没有达到IA高度智能化的境界。比如我们可以知道VC5-6有一些版本的首个API就是调用

GetVersion这个函数,可现在的壳大部分是把这个call给偷的没有影了,怎么办??? 呵呵,小猫腻,我们用脚本来一句就可以定位它。 tocnd \"eax == 0A280105\"

只要是VC5-6某些带GetVision的版本的程序,它一定要返回固定的版本号(只要你机器装好了XP操作系统

这个0A280105就一定是它,是2000的话你自己查一下),机器是傻的人是活的,包裹的再好你也要漏一丝缝,

Themida就是被我用这个简单的方法在GetVersion这个call中锁的死死的,不管你走多少步,我对照寄存器

环境的变换,就可以锁死你的VM在干什么!实在懒得在IDA中分析了,就这个方法破花指令和VM是特别有效的。

(小提示:这些VC5-VC6的程序,你只要OD能完整的跑一次,就可以用我这个方法跑到GetVersion这个CALL上

不管它怎么偷,当然你的CPU要够强劲,剩下的事情你可以去看连续剧了,慢是慢点,剩心剩事,顺便还可以把oep 被偷的头记录的完完整整)

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo3.com 版权所有 蜀ICP备2023022190号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务