【OD】脚本

共计18227字,阅读大约61分钟。
图片[1]-【OD】脚本-galgame
Document     key 20, 0, 1 //Ctrl+space
指令
全称
解释
示例
在后面的文档中, “源操作数” 和 “目的操作数”表示以下含义:
    – 十六进制常数,既没有前缀也没有后缀。 (例如:是00FF, 而不是 0x00FF 和 00FFh的形式)
      十进制常数,在后缀中加点. (例如:100.  128.也可以是浮点数128.56,浮点数只能保留小数点后2位)
    – 变量,这个变量必须在使用前用Var进行定义
    – 32位寄存器 (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP)。
      16位寄存器 (AX, BX, CX, DX, SI, DI,  BP,SP)
      8位的寄存器(AL, AH, … DL, DH)
    – 被中括号括起来的内存地址 (例如:[401000]指向内存地址为401000里存放分数据,
      [ecx] 指向内存地址为寄存器ecx里存放分数据).
    – 一个标志位,带有感叹号前缀(!CF, !PF, !AF, !ZF, !SF, !DF, !OF)
    – 字符串,也可叫数据序列。其格式为: #6A0000#(数值在两个“#”号之间),两个“#”号之间必须包含至少有一个数值。
                               “1234567ABCDEF”
    – 包含“?”通配符的字符串。比如 #6A??00# 或者 #6?0000#
$RESULT
<RESULT>
保存某些函数的返回值,比如FIND函数运行后的结果,等等。
    在ODbgScript的脚本调试窗口,你能观察到它的变化,并且可以修改它.
$VERSION
<VERSION>
ODBGScript的版本信息,它是系统保留变量名.
例:
    cmp $VERSION, “1.47”  //比较是否大于 1.47版
    ja version_above_147  
#INC “文件名”
一个脚本文件包含另外一个脚本.就像调用子程序一样.两个脚本中的变量名不能相同.
例:
    #inc “test.txt”
#LOG
开始记录运行指令
    指令会显示在OllyDbg的log窗口中,每条记录前都会加上“–>”的前缀
例:
    #log
ADD
<ADD>
源操作数与目的操作数相加,并把相加的结果保存到目的操作数中,支持字符串相加.
例:
    add x, 0F      //x=x+F
    add eax, x      //eax=eax+x
    add [401000], 5    //[401000]=[401000]+5
    浮点数相加
    CMP 目的操作数, 源操作数
AI
<Animate Into>
在OllyDbg中执行“自动步入”  [Animate into]操作。
    相当于在OllyDbg中按下CTRL+F7
例:
    ai
ALLOC
申请内存, 你能读/写/执行
例:
    alloc 1000      //新申请内存,大小为1000,返回结果$RESULT放着申请内存的开始地址.
    free $RESULT, 1000
AN 地址
<ANalyze>
从指定地址处,对代码进行分析
例:
    an eip //    相当于在OllyDbg中按 Ctrl+A键
AND 目的操作数, 源操作数
<AND>
源操作数与目的操作数进行逻辑与操作,并将结果保存到到目的操作数中
例:
    and x, 0F      //x=x&&f
    and eax, x      //eax=eax&&x
    and [401000], 5   //[401000]=[401000]&&5
   
AO
<Animate  Over>
在OllyDbg中执行“自动步过”  [Animate over]操作。
    相当于在OllyDbg中按下CTRL+F8
例:
    ao
ASK 问题
<ASK>
显示一个提示输入框,让用户输入,结果保存变量$RESULT中(如果用户按了取消键,则$RESULT=0)。
    $RESULT_1中放着输入的长度.
    (注:程序将判读你输入的是字符,$RESULT_1的结果是输入字符数的数目,整型/2,中文数*2)
例:
    ask “Enter new EIP”
    cmp $RESULT, 0
    je cancel_pressed
    mov eip, $RESULT
ASM 地址, 指令
<ASseMble>
修改指定地址的指令。
    并将修改后的汇编指令长度保存到保留变量$RESULT中
例:
    asm eip, “mov eax, ecx” //将当前指令修改为 mov eax,ecx
ASMTXT 文件
<ASseMble>
汇编指定文件中的指令
    将汇编指令长度保存到保留变量$RESULT中
    并将汇编指令行数保存到保留变量$RESULT_1中
例:
    asmtxt EIP,”myasm.txt”//将myasm.txt文件中的asm转成opcode后写入EIP.
ATOI str [, base=16.]
转换字符串到16进制整型,[可以将任何进制转成16进制整型]
    返回结果放到 $RESULT
例:
    itoa “F”      //字符串”F”转成了整型,结果会等于F
    itoa “10”, 10.   //字符串”10″代表十进制,结果会等于A
BC 地址
<BreakPoint  Clear>
清除指定地址的断点
例:
    bc 401000      //清除401000处的断点
    bc x       //清除X(变量值)处的断点
    bc eip      //清除当前EIP处的断点
BP 地址
<BreakPoint>
在指定地址设断点
例:
    bp 401000      //在401000处下断点
    bp x       //在X(变量值)处下断点
    bp eip      //在当前EIP处下断点
BPCND 地址, 条件
<BreakPoint  on CoNDition>
在指定地址处,设置条件断点。
例:
    bpcnd 401000, “ECX==1” //当 代码执行到401000且  ecx等于1 时,程序暂停
BPD 函数字符串
清除调用函数断点,函数为字符串表示.
例:
    bpd “GetVersion”   //取消呼叫GetVersion的断点
BPHWC 地址
<BreakPoint  HardWareClear>
删除指定地址处的硬件断点
例:
    bphwc 401000 //清除 401000处的断点
    bphwc //不接地址默认清楚全部 等同于bphwcall
BPHWCALL
清除所有的硬件断点
例:
    BPHWCALL   //清除所有的硬件断点
BPHWS 地址, 模式
<BreakPoint  HardWare Set>
在指定地址,设置硬件断点。有三种模式: “r” – 读取, “w” – 写入 或者 “x” – 执行.
    此断点只支持1个字节的动作.
例:
    bphws 401000, “x” //当执行到此地址时产生中断.
    Bphws 401000,”r”  //当读取401000的时候产生中断
BPL 地址, 表达式
<BreakPoint  of Logging>
在指定地址处设置记录断点,将表达式的结果记录到记录窗口中。
例:
    bpl 401000, “eax” // 每次执行到401000时,都将eax寄存器的结果记录
BPLCND 地址, 表达式, 条件
<BreakPoint  of
    Logging onCoNDition>
在指定地址处设置记录断点,如果条件为真时,将表达式的结果记录到记录窗口中。
例:
    bplcnd 401000, “eax”, “eax >  1” //如果执行到401000时,满足eax>1,则将eax寄存器的结果记录
BPMC
<BreakPoint  Memory Clear>
清除内存断点。
例:
    bpmc
BPRM 地址, 大小
<BreakPoint  on ReadMemory>
在指定地址处,设置一个内存读取断点。 “大小” 是指内存中的字节大小。
例:
    bprm 401000, FF //在401000中设置内存读断点,内存中的大小为FF
BPWM 地址, 大小
<BreakPoint  on WriteMemory>
在指定地址处,设置一个内存写入断点。“大小” 是指内存中的字节大小。
例:
    bpwm 401000, FF   //在401000中设置内存写断点,内存中的大小为FF
BPX 函数字符串
设置调用函数断点,函数为字符串表示.
    返回下了断点的地址数量,结果保存在保留变量$RESULT中.
例:
    bpx “GetVersion”   //下呼叫GetVersion断点,断下的语句为call [xxxxx]
BUF var
string/dword  variable to a Buffer
转换字符串变量到缓冲区
例:
    mov s, “123”
    buf s
    log s // output “#313233#
CMP 目的操作数, 源操作数
<CoMPare>
比较 目的操作数与源操作数的大小,和其对应的汇编指令作用相同
    可以是各种数值,甚至可以是字符串(对大小不敏感).
例:
    cmp y, x      //比较两个变量(Y和X)的大小,
    cmp eip, 401000   //比较EIP和401000的大小
    这里可以设置比较的数的长度 比如 cmp [eip],#ff25#,2 这里比较EIP所在的指令 前两个字节是否是FF25
    测试代码如下:
    00581DAC    $- FF25 C0B55B00 jmp     dword  ptr [5BB5C0]
CMT 地址, 字符串
<CoMmenT>
在指定地址处,加入注释。
例:
    cmt eip, “这是入口” //当前地址处 加上“这是入口”的注释
COB
<Continue  On Breakpoint>
发生中断后,让脚本继续执行(移除EOB指令)
例:
    COB
COE
<Continue  OnException>
    (移除EOE指令)
发生异常后,让脚本继续执行
例:
    COE
DBH
<DeBuggerHided>
隐藏调试器
例:
    dbh
DBS
<DeBugger  Show>
对隐藏的调试器操作进行恢复,不再隐藏。
例:
    dbs
DEC 变量
<DECrement  by 1>
对变量进行减一操作
例:
    dec v      //V=V-1
DIV 目的操作数, 源操作数
<div>
源操作数与目的操作数进行除法操作,并将结果保存到到目的操作数中。
例:
    div x, 0F       //X=X/0F
    div eax, x      //eax=eax/x
    div [401000], 5  //[401000]/5
DM 地址, 大小, 文件名
<Dump  Memory>
从指定地址处开始,在内存中提取指定大小的数据,并保存到指定的文件中
例:
    dm 401000, 1F, “c:\dump.bin”
DMA 地址, 大小, 文件名
<Dump  Memory Appended>
从指定地址处开始,在内存中提取指定大小的数据,并保存到指定的文件中;如果指定文件已存在,则将数据追加到指定文件尾部。
例:
    dma 401000, 1F, “c:\dump.bin”
DPE 文件名, 入口
<Dump  Process with Entrypoint>
提取执行模块到指定文件中。
    “入口”用来设定入口地址。
    这个命令用来抓取文件,还是比较好用的,因为直接利用了OD强大的内存管理功能.
例:
    dpe “c:\test.exe”, eip //入口为当前地址,保存为C盘下test.exe
EOB 标签
<Execution  On Breakpoint>
在下次中断发生时,跳转到指定标签处。
    此功能和EOE命令常常让新手迷惑不解,其实就是遇见中断做脚本的流程转向.
    如果还有不懂,请看下文的答疑解惑章节.
例:
    eob SOME_LABEL
EOE 标签
<Execution  On Exception>
在下次异常发生时,跳转到指定标签处。
例:
    eoe SOME_LABEL
ESTI
<Exception  STep Into>
相当于在OllyDbg按  SHIFT-F7。
例:
    esti
ESTO
<Exception  STep cOntinue>
相当于在OllyDbg按 SHIFT+F9。
例:
    esto
    一般来说用这个 不用F9多 因为Shift+F9  忽略异常运行
EVAL
<EVALuate>
计算含义变量的表达式。
    变量必须已经在脚本中声明。
    注意:
    插到字符串中时,要放在大括号{ }中。
    结果保存在保留变量$RESULT中.
    这句和其它语句结合将产生很多的变化,用好它将让你的脚本十分灵活.
例:
    var x
    mov x, 1000
    eval “x的值是 { x  }” // 执行后$RESULT为 “x的值是00001000”
EXEC/ENDE
<EXECute/END  of Execute>
对当前调试进程,执行在EXEC和ENDE之间的指令。
    有这个命令就是你可以直接跳入进程,对进程进行直接控制.
    它的原理就是取当前进程的信息进行保存,然后新分配一个代码内存区(可读/写/执行.大小1000)
    调用OD汇编器将你的汇编语句转成OPcode,将OPcode拷贝到代码区,然后将EIP指向你的代码开头.
    然后将控制权交给你.执行完后将EIP归还原位,然后将控制权交还ODbgScript.
    这里的好处就是让你以很高的效率来避免在较慢的脚本环境运行需要高效的操作.
    !注意:由于进程控制权交给你了,那么,你的代码有效性将只有你自己来控制了.
    !注意:执行后不保存现场.这都需要你来做工作.(要保存现场,你可以使用pushad,popad)
    有大括号的,会被大括号中的变量的值替代。
例:
    // 以下是做移动操作
    var x
    var y
    mov x, “eax”
    mov y, “0DEADBEEF”
    exec
    mov {x},{y}      //到进程中新开的代码区去,mov eax,0DEADBEEF 将被执行
    mov ecx, {x}      //mov ecx,eax 将被执行
    ende
    // 以下是调用调试程序的ExitProcess函数
    exec
    push 0
    call ExitProcess
    ende
    key 20, 1 //Shift+space
    key 20, 0, 1 //Ctrl+space
LABEL 名称
<LABEL>
定义一个标签,供跳转指令使用。
例:
    label SOME_LABEL
    jmp SOME_LABEL
LOG “消息”
<LOG>
在日志窗口中显示指定的消息。
例:
    log “This is a log message”
MOV 目的操作数, 源操作数
<Move>
将源操作数的值移动到目的操作数中。
例:
    mov eax, ebx // 将ebx的值移动到eax中
    mov [401000], eax // 将eax的值移动到地址401000中
NOP
<No Operation>
执行一个无操作指令。
例:
    nop // 无操作
PAUSE
<PAUSE>
暂停脚本执行,直到用户按下任意键。
例:
    pause // 脚本暂停,等待用户按键
RET
<Return>
从当前函数返回。
例:
    ret // 返回
RUN
<RUN>
运行调试中的程序。
例:
    run // 运行程序
STOP
<STOP>
停止脚本执行。
例:
    stop // 停止脚本
WAIT ms
<WAIT>
暂停脚本执行指定的毫秒数。
例:
    wait 1000 // 暂停脚本执行1秒钟
XOR 目的操作数, 源操作数
<XOR>
进行逻辑异或操作,并将结果保存到目的操作数中。
例:
    xor eax, eax // 将eax清零
    xor [401000], ebx // 将地址401000处的值与ebx进行异或操作
ZAP
<ZAP>
清除所有断点。
例:
    zap // 清除所有断点
LBL 地址, 字符串
<LaBel  Insert>
在指定地址处插入一个标签
例:
    lbl eip, “NiceJump”
LC
清理LOG窗口
LCLR
清理Script Log窗口
LEN str
获得字符串长度,结果放在$RESULT
例:
    len “NiceJump”
    msg $RESULT
LM 地址, 大小, filename
引导Dm文件进内存
例:
      lm 0x401000, 0x100,  “test.bin”
LOG 源操作数
<log>
将源操作数输出到OllyDbg的记录窗口 [log window] 中。
    如果源操作数是一个字符串常量,则原样记录。
    如果源操作数是一个变量或一个寄存器,则记录名称及其存放的数值
例:
    log “Hello world” // 记录为 “Hello world”
    var x
    mov x, 10
    log x // 记录为 “x  = 00000010”
MOV 目的操作数, 源操作数,最大字节
<MOV>
将源操作数移动到目的操作数中。
    源操作数可以是一个十六进制序列格式 #某个十六进制序列#,例如:#1234#。
    提醒:十六进制序列的位长只能是偶数,比如 2, 4, 6, 8 等等。
例:
    mov x, 0F // 将 F 传给变量 x
    mov y, “Hello world” // 将字符串 “Hello  world” 传给变量 y
    mov eax, ecx // 同汇编
    mov [ecx], #00DEAD00BEEF00# // 将 ## 内的内容传到 ecx 的地址中
    mov !CF, 1 // 赋值 !CF 标志寄存器为 1
    mov !DF, !PF // 将 !PF 赋值给 !DF
    mov [403000], “Hello world” // 直接将字符串 “Hello world” 传送到 403000 的地址中
    mov eax, [401000], 1 // 只取 401000 地址中的一个字节长度的内容传送到 eax 中 (新功能)
MSG 消息
<MeSsaGe>
将指定消息,显示到一个对话框中。
例:
    MSG “脚本运行完毕”
MSGYN 消息
<MeSsaGe  Yes or No>
将指定消息,显示到一个对话框中,这个对话框有“是”、“否”按钮。
    如果点“是”,保留变量 $RESULT 等于 1,否则保留变量 $RESULT 等于 0 。
例:
    MSGYN “继续?”
MUL 目的操作数, 源操作数
<mul>
源操作数与目的操作数进行乘法操作,并将结果保存到到目的操作数中。
例:
    mul x, 0F
    mul eax, x
    mul [401000], 5
NEG 操作数
<NEG>
操作数做取补操作,并将结果保存到到操作数中。
例:
    NEG x, 0F
    NEG eax
    NEG [401000]
NOT 操作数
<NOT>
操作数做逻辑非操作,并将结果保存到到操作数中。
例:
    NOT x, 0F
    NOT eax
    NOT [401000]
OPCODE 地址
反汇编指定地址处的代码.
    $RESULT 是 opcode
    $RESULT_1 是汇编代码
    $RESULT_2 是字节数
    如果不是 opcode, $RESULT_2 将返回 0
例:
    opcode 00401000
opentrace
打开运行跟踪功能, 关闭它请使用 TC
OR 目的操作数, 源操作数
<OR>
源操作数和目的操作数做逻辑或操作,并将结果保存到到目的操作数中。
例:
    or x, 0F
    or eax, x
    or [401000], 5
PAUSE
<PAUSE>
暂停脚本运行。可以通过插件菜单恢复脚本运行。
例:
    pause
PREOP 地址
回溯指定地址的汇编命令
例:
    preop eip
READSTR 地址,maxsize
从 addr 处读指定大小的字符串
例:
        readstr 401000,15
REF 地址
相当于在 OllyDbg 按 Ctrl R.
例:
    continue:
    REF eip
    log $RESULT
    log $RESULT_1
    log $RESULT_2
    cmp $RESULT, 0
    jne continue
REPL 地址, 查找字符串, 替换字符串, 长度
<REPLace>
在指定地址开始,在指定长度的字节范围内,用“替换字符串”替换“查找字符串”。
    允许使用通配符
例:
    repl eip, #6a00#, #6b00#, 10
    repl eip, #??00#, #??01#, 10
    repl 401000, #41#, #90#, 1F
RESET
OD重新加载程序(相当于 Ctrl+F2)
RET
<RETurn>
退出脚本。
例:
    ret
REV
字节反转。(注意是字节反转, 不是位反转)
例:
    rev 01020304 // $RESULT = 04030201
ROL 目的操作数, n
循环左移目的操作数,n比特位;并将结果保存到到目的操作数中。
例:
    mov x, 00000010
    ROL x, 8 // x is now 00001000
ROR 目的操作数, n
循环右移目的操作数,n比特位;并将结果保存到到目的操作数中。
例:
    mov x, 00000010
    ROR x, 8
RTR
<Run  To Return>
执行到返回
    相当于在 OllyDbg 中执行 “Run to return” [Ctrl+F9] 操作。
例:
    rtr
RTU
<Run  To User code>
返回到用户代码区
    相当于在 OllyDbg 中执行 “Run to user code” [Alt+F9] 操作。
例:
    rtu
RUN
<RUN>
    让 OD 继续运行相当于在 OllyDbg 中按 F9
例:
    run
SCMP dest, src
字符串比较.
例:
    cmp x, “KERNEL32.DLL”
    cmp [eax], “Hello World”
SCMPI dest, src
字符串比较(大小写不敏感)
例:
    cmp sVar, “KERNEL32.DLL”
    cmp [eax], “Hello World”
SETOPTION
调出调试设置 (Option) 菜单, 设置好后按确定后继续执行脚本
    注意: 此选项是为了可以在执行脚本的过程中可以调出调试设置异常, 跟踪等等设置
SHL 目的操作数, n
左移目的操作数,n比特位;并将结果保存到到目的操作数中
例:
    mov x, 00000010
    shl x, 8 // x is now 00001000
SHR 目的操作数, n
<SHift  Right>
右移目的操作数,n 比特位;并将结果保存到目的操作数中
例:
    mov x, 00001000
    shr x, 8 // x is now 00000010
STI
<STep Into>
相当于在 OllyDbg 中按 F7,单步步入。
例:
    sti
STO
<STep  Over>
相当于在 OllyDbg 中按 F8,单步步过。
例:
    sto
SUB dest, src
源数据减目的数据
例:
    sub x, 0F
    sub eax, x
    sub [401000], 5
TC
相当于在 OllyDbg 中 “关闭运行跟踪”
例:
    tc
TI
相当于在 OllyDbg 中按 Ctrl+F7,单步跟踪。
例:
    ti
TICND cond
<Trace  Into Condition>
执行 “Trace into” 操作,直到条件为真时停止。
例:
    ticnd “eip > 40100A” // 当 eip > 40100A 时停止
TICK [var [,reftime]]
脚步运行时间 (microsec)
    如果是 2 次变量,则得出为时间差
例:
    tick time
    msg time // time since script startup
    tick time, time
    msg $RESULT // time since last TICK, DWORD value
TO
<Trace  Over>
相当于在 OllyDbg 中执行 “Trace over” 操作。
例:
    to
TOCND cond
<Trace  Over Condition>
执行 “Trace over” 操作,直到条件为真时停止。
例:
    tocnd “eip > 40100A” // 当 eip > 40100A 时停止
VAR
<VARiable>
在脚本中,声明一个变量。
    必须在变量使用前声明。
    注意: 变量名最好是由字母和数字组合成的容易识别的变量名
    +-*/ 等等符号最好不要附加在变量中, 以免引起不可预测的错误
    由于为了兼容以前的系统, 请不要将 A, B, C, D, E, F 作为变量。
例:
    var tmp
XOR 目的操作数, 源操作数
<XOR>
源操作数与目的操作数进行异或操作,并将结果保存到目的操作数中。
例:
    xor x, 0F
    xor eax, x
    xor [401000], 5
WRT file, data
写数据给文件 (覆盖)
例:
    wrt “out.txt”, “Data:\r\nOk\r\n”
    wrt sFile, ebx
WRTA file, data
附加数据到文件中 (文件结尾)
例:
    wrta sFile, “hello world\r\n”
    如果文件不存在 将会创建文件
IFA, IFAE, IFB, IFBE, IFG, IFGE, IFL, IFLE, IFEQ/IFNEQ..ELSE/ENDIF
这些命令是构建 IF 块的,类似于高级语言的语法,具体含义与汇编类似。
例:
    ifneq $RESULT, 0
    ifa flg, $RESULT
    mov flg, $RESULT
    endif
    endif
您可以使用“//”在任何地方进行注释。
块注释必须另外起一行并以 /* 开始, */ 作为结束,“*/”也必须另起一行。


温馨提示:
本文最后更新于2024-08-23 21:39:44,本文具有时效性,若有错误或已失效,请在下方留言或联系站长
© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容