ODbgScript的脚本命令[转载]

来源:互联网 发布:天音淘宝工具箱 编辑:程序博客网 时间:2024/04/27 18:56

破解利器Olldbg脚本教学(二)-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:/unpack.exe", 401000
     
好了,这篇先到这里,下一篇将介绍ODbgScript的文字串命令和流程控制命令.

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来进行反复搜索的利器.