od脚本编程

 

C++代码
  1. ODbgScript脚本编写资料与示例   
  2.   
  3. OllyScript脚本语言是一个种类汇编的语言。你使用它来控制ODbgScript和脚本运算.   
  4.   
  5. 在后面的文档中, “源操作数” 和 “目的操作数”表示以下含义:   
  6. - 十六进制常数,既没有前缀也没有后缀。 (例如:是00FF, 而不是 0x00FF 和 00FFh的形式)   
  7.       十进制常数,在后缀中加点. (例如:100. 128. 也可以是浮点数128.56,浮点数只能保留小数点后2位)   
  8. - 变量,这个变量必须在使用前用Var进行定义   
  9. - 32位寄存器 (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP)。   
  10.       16位寄存器 (AX, BX, CX, DX, SI, DI, BP, SP)   
  11.       8位的寄存器(AL, AH, ... DL, DH)   
  12. - 被中括号括起来的内存地址 (例如:[401000] 指向内存地址为401000里存放分数据,    
  13.       [ecx] 指向内存地址为寄存器ecx里存放分数据).   
  14. - 一个标志位,带有感叹号前缀(!CF, !PF, !AF, !ZF, !SF, !DF, !OF)   
  15. - 字符串,也可叫数据序列。其格式为: #6A0000# (数值在两个“#”号之间),两个“#”号之间必须包含至少有一个数值。   
  16.                                       "1234567ABCDEF"  
  17. - 包含“?”通配符的字符串。比如 #6A??00# 或者 #6?0000#   
  18.   
  19. 3.1.1 保留变量   
  20. ------------------------   
  21.   
  22. $RESULT   
  23. -------   
  24. <RESULT>   
  25. 保存某些函数的返回值,比如FIND函数,等等。   
  26. 在ODbgScript的脚本调试窗口,你能观察到它的变换,并且可以修改它.   
  27.   
  28. $VERSION   
  29. --------   
  30. <VERSION>   
  31. ODBGScript的版本信息,整个是系统保留变量名.   
  32. 例:   
  33. cmp $VERSION, "1.47"      //比较是否大于 1.47版   
  34. ja version_above_147     
  35.   
  36. 3.1.2 指令   
  37. --------------   
  38.   
  39. #INC "文件名"     
  40. ---------   
  41.   
  42. 一个脚本文件包含另外一个脚本.就像调用子程序一样.两个脚本中的变量名不能相同.   
  43. 例:   
  44. #inc "test.txt"        
  45.   
  46. #LOG   
  47. ----   
  48. 开始记录运行指令   
  49. 指令会显示在OllyDbg的log窗口中,每条记录前都会加上“-->”的前缀   
  50. 例:   
  51. #log   
  52.   
  53. ADD 目的操作数,源操作数   
  54. -------------   
  55. <ADD>   
  56. 源操作数与目的操作数相加,并把相加的结果保存到目的操作数中,支持字符串相加.   
  57. 例:    
  58. add x, 0F              // x=x+F   
  59. add eax, x             //eax=eax+x   
  60. add [401000], 5        //[401000]=[401000]+5   
  61. 浮点数相加   
  62. add x,16.50            //x=x+16.50   
  63. (字符串相加)   
  64. add y, " times"        // 如果在次之前y="1000" ,则在执行完此指令之后y="1000 times"   
  65.   
  66. AI   
  67. --   
  68. <Animate Into>   
  69. 在OllyDbg中执行“自动步入” [Animate into]操作。   
  70. 相当于在OllyDbg中按下CTRL+F7   
  71. 例:   
  72. ai   
  73.   
  74. ALLOC 大小   
  75. ----------   
  76. 申请内存, 你能读/写/执行.   
  77. 例:   
  78.       alloc 1000              //新申请内存,大小为1000,返回结果$RESULT放着申请的内存开始地址.   
  79. free $RESULT, 1000   
  80.   
  81. AN 地址   
  82. -------   
  83. <ANalyze>   
  84. 从指定地址处,对代码进行分析。   
  85. 例:   
  86. an eip //       相当于在OllyDbg中按 Ctrl+A键   
  87.   
  88. AND 目的操作数, 源操作数   
  89. -------------   
  90. <AND>   
  91. 源操作数与目的操作数进行逻辑与操作,并将结果保存到到目的操作数中。   
  92. 例:    
  93. and x, 0F                      //x=x&&f   
  94. and eax, x                     //eax=eax&&x   
  95. and [401000], 5                //[401000]=[401000]&&5   
  96.   
  97. AO   
  98. --   
  99. <Animate Over>   
  100. 在OllyDbg中执行“自动步过” [Animate over]操作。   
  101. 相当于在OllyDbg中按下CTRL+F8   
  102. 例:   
  103. ao   
  104.   
  105. ASK 问题   
  106. ------------   
  107. <ASK>   
  108. 显示一个提示输入框,让用户输入,结果保存变量$RESULT中(如果用户按了取消键,则$RESULT=0)。   
  109. $RESULT_1中放着输入的长度.   
  110. (注:程序将判读你输入的是字符,$RESULT_1的结果是输入字符数的数目,整型/2,中文数*2)   
  111. 例:   
  112. ask "Enter new EIP"  
  113. cmp $RESULT, 0   
  114. je cancel_pressed   
  115. mov eip, $RESULT   
  116.   
  117. ASM 地址, 指令   
  118. -----------------   
  119. <ASseMble>   
  120. 修改指定地址的指令。   
  121. 并将修改后的汇编指令长度保存到保留变量$RESULT中   
  122. 例:   
  123. asm eip, "mov eax, ecx" //将当前指令修改为 mov eax,ecx   
  124.   
  125. ASMTXT 文件    
  126. -----------------   
  127. <ASseMble>   
  128. 汇编指定文件中的指令。   
  129. 将汇编指令保存到保留变量$RESULT中   
  130. 并将汇编指令长度保存到保留变量$RESULT_1中   
  131. 例:   
  132. asmtxt EIP,"myasm.txt" //将myasm.txt文件中的asm转成opcode后写入EIP.   
  133.   
  134. ATOI str [, base=16.]   
  135. -----------------   
  136. 转换字符串到16进制整型,[可以将任何进制转成16进制整型]   
  137. 返回结果放到 $RESULT    
  138. 例:   
  139. itoa "F"             //字符串"F"转成了整型,结果会等于F   
  140. itoa "10", 10.       //字符串"10"代表十进制,结果会等于A   
  141.   
  142. BC 地址   
  143. -------   
  144. <BreakPoint Clear>   
  145. 清除指定地址的断点。   
  146. 例:   
  147. bc 401000              //清除401000处的断点   
  148. bc x                   //清除X(变量值)处的断点   
  149. bc eip                 //清除当前EIP处的断点   
  150.   
  151. BP addr   
  152. --------   
  153. <BreakPoint>   
  154. 在指定地址设断点   
  155. 例:   
  156. bp 401000              //在401000处下断点   
  157. bp x                   //在X(变量值)处下断点    
  158. bp eip                 //在当前EIP处下断点   
  159.   
  160. BPCND 地址, 条件   
  161. ----------------   
  162. <BreakPoint on CoNDition>   
  163. 在指定地址处,设置条件断点。   
  164. 例:   
  165. bpcnd 401000, "ECX==1" //当 代码执行到401000且 ecx等于1 时,程序暂停   
  166.   
  167. BPD 函数字符串   
  168. ---------------   
  169. 清除调用函数断点,函数为字符串表示.   
  170.   
  171. 例:   
  172. bpd "GetVersion"       //取消呼叫GetVersion的断点   
  173.   
  174. BPHWC 地址   
  175. ----------   
  176. <BreakPoint HardWare Clear>   
  177. 删除指定地址处的硬件断点。   
  178. 例:   
  179. bphwc 401000 //清除 401000处的断点   
  180.   
  181. BPHWCALL   
  182. -----------   
  183. 清除所有的硬件断点   
  184. 例:   
  185. BPHWCALL         //清除所有的硬件断点   
  186.   
  187. BPHWS 地址, 模式   
  188. ----------------   
  189. <BreakPoint HardWare Set>   
  190. 在指定地址,设置硬件断点。有三种模式: "r" - 读取, "w" - 写入 或者 "x" - 执行.   
  191. 此断点只支持1个字节的动作.   
  192. 例:   
  193. bphws 401000, "x" //当执行到此地址时发生中断.   
  194. Bphws 401000,"r"      //当读取401000的时候,发送中断   
  195.   
  196. BPL 地址, 表达式   
  197. --------------   
  198. <BreakPoint of Logging>   
  199. 在指定地址处设置记录断点,将表达式的结果记录到记录窗口中。   
  200. 例:   
  201. bpl 401000, "eax" // 每次执行到401000时,都将eax寄存器的结果记录   
  202.   
  203. BPLCND 地址, 表达式, 条件   
  204. -----------------------   
  205. <BreakPoint of Logging on CoNDition>   
  206. 在指定地址处设置记录断点,如果条件为真时,将表达式的结果记录到记录窗口中。   
  207. 例:   
  208. bplcnd 401000, "eax""eax > 1" // 如果执行到401000时,满足eax>1,则将eax寄存器的结果记录   
  209.   
  210. BPMC   
  211. ----   
  212. <BreakPoint Memory Clear>   
  213. 清除内存断点。   
  214. 例:   
  215. bpmc   
  216.   
  217. BPRM 地址, 大小   
  218. ---------------   
  219. <BreakPoint on Read Memory>   
  220. 在指定地址处,设置一个内存读取断点。 “大小” 是指内存中的字节大小。   
  221. 例:   
  222. bprm 401000, FF      //在401000中设置内存读断点,内存中的大小为FF   
  223.   
  224. BPWM 地址, 大小   
  225. ---------------   
  226. <BreakPoint on Write Memory>   
  227. 在指定地址处,设置一个内存写入断点。“大小” 是指内存中的字节大小。   
  228. 例:   
  229. bpwm 401000, FF       //在401000中设置内存写断点,内存中的大小为FF   
  230.   
  231. BPX 函数字符串   
  232. ---------------   
  233. 设置调用函数断点,函数为字符串表示.   
  234. 返回下了断点的地址数量,结果保存在保留变量$RESULT中.   
  235. 例:   
  236. bpx "GetVersion"       //下呼叫GetVersion断点,断下的语句为 call [xxxxx]   
  237.   
  238. CMP 目的操作数, 源操作数   
  239. -------------   
  240. <CoMPare>   
  241. 比较 目的操作数与源操作数的大小,和其对应的汇编指令作用相同。   
  242. 可以是各种数值,甚至可以是字符串(对大小不敏感).   
  243. 例:    
  244. cmp y, x              //比较两个变量(Y和X)的大小,   
  245. cmp eip, 401000       //比较EIP和401000的大小   
  246.   
  247. CMT 地址, 字符串   
  248. --------------   
  249. <CoMmenT>   
  250. 在指定地址处,加入注释。   
  251. 例:   
  252. cmt eip, "这是入口" //当前地址处 加上“这是入口”的注释   
  253.   
  254. COB   
  255. ---   
  256. <Continue On Breakpoint>   
  257. 发生中断后,让脚本继续执行(移除EOB指令)   
  258. 例:   
  259. COB   
  260.   
  261. COE   
  262. ---   
  263. <Continue On Exception>(移除EOE指令)   
  264. 发生异常后,让脚本继续执行   
  265. 例:   
  266. COE   
  267.   
  268. DBH   
  269. ---   
  270. <DeBugger Hided>    
  271. 隐藏调试器   
  272. 例:   
  273. dbh   
  274.   
  275. DBS   
  276. ---   
  277. <DeBugger Show>   
  278. 对隐藏的调试器操作进行恢复,不再隐藏。   
  279. 例:   
  280. dbs   
  281.   
  282. DEC 变量   
  283. -------   
  284. <DECrement by 1>   
  285. 对变量进行减一操作   
  286. 例:   
  287. dec v                //V=V-1   
  288.   
  289. DIV 目的操作数, 源操作数   
  290. -------------   
  291. <div>   
  292. 源操作数与目的操作数进行除法操作,并将结果保存到到目的操作数中。   
  293. 例:    
  294. div x, 0F            //X=X/0F   
  295. div eax, x           //eax=eax/x   
  296. div [401000], 5      //[401000]/5   
  297.   
  298. DM 地址, 大小, 文件名   
  299. -------------------   
  300. <Dump Memory>   
  301. 从指定地址处开始,在内存中提取指定大小的数据,并保存到指定的文件中   
  302. 例:   
  303. dm 401000, 1F, "c:\dump.bin"  
  304.   
  305. DMA 地址, 大小, 文件名   
  306. -------------------   
  307. <Dump Memory Appended>   
  308. 从指定地址处开始,在内存中提取指定大小的数据,并保存到指定的文件中;如   
  309. 果指定文件已存在,则将数据追加到指定文件尾部。   
  310. 例:   
  311. dma 401000, 1F, "c:\dump.bin"  
  312.   
  313. DPE 文件名, 入口   
  314. ----------------   
  315. <Dump Process with Entry point>   
  316. 提取执行模块到指定文件中。   
  317. “入口”用来设定入口地址。   
  318. 这个命令用来抓取文件,还是比较好用的,因为直接利用了OD强大的内存管理功能.   
  319. 例:   
  320. dpe "c:\test.exe", eip //入口为当前地址,保存为C盘下test.exe   
  321.   
  322. EOB 标签   
  323. ---------   
  324. <Execution On Breakpoint>   
  325. 在下次中断发生时,跳转到指定标签处。   
  326. 此功能和EOE命令常常让新手迷惑不解,其实就是遇见中断做脚本的流程转向.   
  327. 如果还有不懂,请看下文的答疑解惑章节.   
  328. 例:   
  329. eob SOME_LABEL   
  330.   
  331. EOE 标签   
  332. ---------   
  333. <Execution On Exception>   
  334. 在下次异常发生时,跳转到指定标签处。   
  335. 例:   
  336. eoe SOME_LABEL   
  337.   
  338. ESTI   
  339. ----   
  340. <Exception STep Into>   
  341. 相当于在OllyDbg按 SHIFT-F7。   
  342. 例:   
  343. esti   
  344.   
  345. ESTO   
  346. ----   
  347. <Exception STep      cOntinue>   
  348. 相当于在OllyDbg按 SHIFT-F9。   
  349. 例:   
  350. esto   
  351.   
  352. EVAL    
  353. ----   
  354. <EVALuate>   
  355. 计算含义变量的表达式。   
  356. 变量必须已经在脚本中声明。   
  357. 注意:插到字符串中时,要放在大括号{ }中。   
  358. 结果保存在保留变量$RESULT中.   
  359. 这句和其它语句结合将产生很多的变化,用好它将让你的脚本十分灵活.   
  360. 例:   
  361. var x   
  362. mov x, 1000   
  363. eval "x的值是 { x }" // 执行后$RESULT为 "x的值是00001000"   
  364.   
  365. EXEC/ENDE   
  366. ---------   
  367. <EXECute/END of Execute>   
  368. 对当前调试进程,执行在EXEC和ENDE之间的指令。   
  369. 有这个命令就是你可以直接跳入进程,对进程进行直接控制.   
  370. 它的原理就是取当前进程的信息进行保存,然后新分配一个代码内存区(可读/写/执行.大小1000)   
  371. 调用OD汇编器将你的汇编语句转成OPcode,将OPcode拷贝到代码区,然后将EIP指向你的代码开头.   
  372. 然后将控制权交给你.执行完后将EIP归还原位,然后将控制权交还ODbgScript.   
  373. 这里的好处就是让你以很高的效率来避免在较慢的脚本环境运行需要高效的操作.   
  374. !注意:由于进程控制权交给你了,那么,你的代码有效性将只有你自己来控制了.   
  375. !注意:执行后不保存现场.这都需要你来做工作.(要保存现场,你可以使用pushad,popad)   
  376. 有大括号的,会被大括号中的变量的值替代。   
  377. 例:   
  378. // 以下是做移动操作   
  379. var x   
  380. var y   
  381. mov x, "eax"  
  382. mov y, "0DEADBEEF"  
  383. exec   
  384. mov {x},{y}         // 到进程中新开的代码区去,mov eax,0DEADBEEF 将被执行   
  385. mov ecx, {x}        //mov ecx, eax 将被执行   
  386. ende   
  387. // 以下是调用调试程序的ExitProcess函数   
  388. exec   
  389. push 0   
  390. call ExitProcess   
  391. ende   
  392. ret   
  393.   
  394. FILL addr,len,value   
  395. -------------------------   
  396. 从地址addr开始填充长度为len的值value   
  397. !注:value的值最大8个字节,可以为寄存器值,标志位值,变量值,16进制值,10进制值,[]指针操作数.   
  398. 如:   
  399. fill 401000,10,90             //NOP 10h个字节   
  400. fill 401000,ff,[eax]            //取出[eax]值,填充到401000,长度为ff   
  401. fill 401000,ff,$RESULT         //将变量$RESULT的值填充到401000,长度为ff   
  402.   
  403. FIND 地址, 查找内容 ,[最大大小]   
  404. ---------------   
  405. <FIND>   
  406. 从指定地址开始在内存中查找指定的内容。   
  407. 如果查找成功,地址会保存到保留变量$RESULT中,否则$RESULT将等于 0。   
  408. 查找的串支持通配符“??”(见下面的例子)。   
  409. ##中的为HEX,""中的为字符串,什么都不带的为内存数据   
  410. !注:输入的16进制字符必须是成偶数   
  411.         从1.52版开始支持直接变量和数据查找.   
  412. 例:   
  413. find eip, #6A00E8# // 查找一个Call,其的第一个参数为0 (push 0)   
  414. find eip, #6A??E8# // 查找一个带参数的Call,一个?代表一个字符常量   
  415. find eip,"kernel32.dll"      //查找字符串"kernel32.dll"   
  416. find eip,"ker???32.d??"      //查找带通配符的?字符串,一个?代表一个字符串常量   
  417.                                (请注意这里的通配符?和HEX中的?不同)   
  418.   
  419. find eip,15ff          //查找内存数据15ff(代码为ff115)   
  420. (mov tmp,#ff15#   
  421. find eip,tmp )        //查找变量tmp中的数值,tmp=ff15   
  422. (mov tmp,"kernel32.dll"  
  423. find eip,tmp      )        //查找变量tmp中的字符串"kernel32.dll"   
  424. (mov tmp,15ff   
  425. find eip,tmp          //查找变量tmp中的内存数据15ff(注意和#ff15#区别)   
  426. (ask "输入需要的数据"  
  427. find eip,$RESULT           //输入的为#ff15#,"Kernel32.dll",15ff就同上面三例子   
  428.   
  429. find eip,#ff15#,ff      //从EIP开始,FF大小范围内,查找字符ff15,   
  430.   
  431. FINDOP 地址, 查找内容,[查找范围]   
  432. -----------------   
  433. <FIND OPcode>   
  434. 从指定地址开始查找指定一个指令,这个指令是以指定内容为开始的。    
  435. 如果查找成功,地址会保存到保留变量$RESULT中,否则$RESULT将等于 0。   
  436. 查找的串支持通配符“??”(见下面的例子)。   
  437. 注意:findop由于是opcode查找,不支持字符串查找.   
  438.          findop和find的区别是findop查找到的必须是opcode.   
  439.       1.52起支持直接变量和内存数据   
  440. 例:   
  441. findop 401000, #61# // find next POPAD   
  442. findop 401000, #6A??# // find next PUSH of something   
  443. 译者注:   
  444. 对比一下FIND 和FINDDOP的区别:   
  445. 地址              数据                     代码   
  446. 00401007          B8 3300              MOV         EAX, 33   
  447. 0040100C          33F6                 XOR         ESI, ESI   
  448. find 401007,      #33#        //$RESULT等于401008   
  449. finddop 401007, #33#      //$RESULT等于40100C   
  450.   
  451. FINDMEM what [, StartAddr]   
  452. --------------------------   
  453. 从整个内存开始在内存中查找指定的内容   
  454. 如果查找成功,地址会保存到保留变量$RESULT中,否则$RESULT将等于 0。   
  455. 查找的串支持通配符“??”(见下面的例子)。   
  456. Example:   
  457. findmem #6A00E8# // find a PUSH 0 followed by some kind of call   
  458. findmem #6A00E8#, 00400000 // search it after address 00400000   
  459.   
  460. FREE   
  461. FREE 地址 大小   
  462. -----------   
  463. 释放由ALLOC申请的内存.   
  464. Example:   
  465. alloc 1000   
  466. free $RESULT, 1000   
  467.   
  468. GAPI   
  469. GAPI 地址   
  470. ------------   
  471. 获得指定代码处的API调用信息   
  472. API信息保存到保留变量$RESULT中。   
  473. 如果符号名是一个API函数,则   
  474. $RESULT保存API信息   
  475. $RESULT_1保存链接库名(比如 kernal32)   
  476. $RESULT_2保存符号名(比如 ExitProcess)。   
  477. $RESULT_3保存调用地址XXXX(比如 call xxxxx)   
  478. 注意:这个和GN的区别是GN必须指向IAT地址   
  479.          而GAPI直接给出代码地址就可得出API   
  480.          还有如果你是在此处下了软件断点,请先清除断点再用此句,因为软件断点修改了代码为CC   
  481.       这里如果不清除此处的软件断点,将造成这句不能很好的识别.   
  482. 例:   
  483. GAPI 401000       (call kernal32.ExitProcess)   
  484. GAPI EIP       //查看当前代码是否是API调用,不是则返回0   
  485.   
  486. GCMT addr   
  487. ---------   
  488. 获得指定地址处的解释   
  489.   
  490. GMEMI addr, info   
  491. ----------------   
  492. 获得指定地址处内存的信息.   
  493. 信息可以是 MEMORYBASE, MEMORYSIZE or MEMORYOWNER   
  494. Example:   
  495. GMEMI addr, MEMORYBASE // After this $RESULT is the address to the memory base of the memory block to   
  496.   
  497. which addr belongs   
  498.   
  499. GMI 地址, 信息   
  500. --------------   
  501. <Get Module Info>   
  502. 获得指定地址所在模块的相关信息。   
  503. “信息”可以是模块基地址[MODULEBASE], 模块大小[MODULESIZE], 代码段基地址[CODEBASE] 或者 代码段大小   
  504.   
  505. [CODESIZE]    
  506. (如果您想在将来的版本中,获得更多的信息,请联系我)。   
  507. 信息会保存到保留变量$RESULT中 (如果没有找到信息,则$RESULT等于0).   
  508. 例:   
  509. GMI eip, CODEBASE // 这条指令执行后,$RESULT等于当前所在模块的代码段基地址。   
  510. GN 地址   
  511. -------   
  512. <Get Name>   
  513. 获得指定IAT地址的符号名(比如指向API函数)。   
  514. 符号名将保存到保留变量$RESULT中。   
  515. 如果符号名是一个API函数,则   
  516. $RESULT是符号名   
  517. $RESULT_1保存链接库名(比如 kernal32)   
  518. $RESULT_2保存符号名(比如 ExitProcess)。   
  519. 例:   
  520. gn 450100   
  521.   
  522. GO 地址   
  523. -------   
  524. <GO>   
  525. 执行到指定地址处    
  526. 例:   
  527. go 401005   
  528.   
  529. GPA 函数名, 动态链接库名   
  530. -------------   
  531. <Get Procedure      Address>   
  532. 在指定的动态链接库中,获得指定函数的地址。   
  533. 如果查找成功,地址会保存到保留变量$RESULT中,否则$RESULT将等于 0。   
  534. 在设置API函数断点时,这个指令非常有效。   
  535. 例:   
  536. gpa "MessageBoxA""user32.dll" // 这条指令执行后,$RESULT等于函数MessageBoxA的地址,您可以   
  537. 使用"bp $RESULT"设置断点。   
  538.   
  539. GPI key   
  540. -------------   
  541. 获得进程的信息.   
  542. 这个信息可以是   
  543.   
  544. HPROCESS,PROCESSID,HMAINTHREAD,MAINTHREADID,MAINBASE,PROCESSNAME,EXEFILENAME,CURRENTDIR,SYSTEMDIR   
  545.   
  546. GPP key   
  547. --------------   
  548. find API parameters number and types   
  549.   
  550. HANDLE x, y, class  
  551. ---------------------   
  552. 返回指定点(16进制)子窗口指定类的句柄   
  553.   
  554. INC 变量   
  555. -------   
  556. <INCrement by 1>   
  557. 对变量进行加一操作   
  558. 例:   
  559. inc v   
  560.   
  561. ITOA n [, base=16.]   
  562. -----------------   
  563. 转化一个整数到字符串   
  564. 结果放在 $RESULT    
  565. Example:   
  566. itoa F   
  567. itoa 10., 10.   
  568.   
  569. JA 标签   
  570. --------   
  571. <Jump if Above>   
  572. 在cmp命令后使用. 和其对应的汇编指令作用相同.   
  573. 例:   
  574. ja SOME_LABEL   
  575.   
  576. JAE 标签   
  577. ---------   
  578. <jump if Above or Equal>   
  579. cmp. 和其对应的汇编指令作用相同.   
  580. 例:   
  581. jae SOME_LABEL   
  582.   
  583. JB 标签   
  584. --------   
  585. <Jump if Below>   
  586. 在cmp命令后使用.      和其对应的汇编指令作用相同.   
  587. 例:   
  588. jb SOME_LABEL   
  589.   
  590. JBE 标签   
  591. ---------   
  592. <Jump if Below or Equal>   
  593. 在cmp命令后使用。和其对应的汇编指令作用相同.   
  594. 例:   
  595. jbe SOME_LABEL   
  596.   
  597. JE 标签   
  598. --------   
  599. <Jump if Equal>   
  600. 在cmp命令后使用.      和其对应的汇编指令作用相同.   
  601. 例:   
  602. je SOME_LABEL   
  603.   
  604. JMP 标签   
  605. ---------   
  606. <JuMP>   
  607. 跳转到指定标签.   
  608. 例:   
  609. jmp SOME_LABEL   
  610.   
  611. JNE 标签   
  612. ---------   
  613. <Jump if Not Equal>   
  614. 在cmp命令后使用.      和其对应的汇编指令作用相同.   
  615. 例:   
  616. jne SOME_LABEL   
  617.   
  618. KEY vkcode [, shift [, ctrl]]   
  619. --------------------------   
  620. 仿真按下键盘.   
  621. Example:   
  622. key 20   
  623. key 20, 1 //Shift+space   
  624. key 20, 0, 1 //Ctrl+space   
  625.   
  626. LBL 地址, 字符串   
  627. --------------   
  628. <LaBel Insert>   
  629. 在指定地址处插入一个标签   
  630. 例:   
  631. lbl eip, "NiceJump"  
  632.   
  633. LC   
  634. ----   
  635. 清理LOG窗口   
  636.   
  637. LCLR   
  638. ----   
  639. 清理Script Log窗口   
  640.   
  641. LEN str   
  642. --------------   
  643. 获得字符串长度,结果放在$RESULT   
  644. Example:   
  645. len "NiceJump"  
  646. msg $RESULT   
  647.   
  648. LM addr, size, filename   
  649. -------   
  650. 引导Dm文件进内存   
  651. Example:   
  652.       lm 0x401000, 0x100, "test.bin"  
  653.      
  654. LOG 源操作数   
  655. -------   
  656. <log>   
  657. 将源操作数输出到OllyDbg的记录窗口[log window]中。   
  658. 如果源操作数 是一个字符串常量,则原样记录。   
  659. 如果源操作数 是一个变量或一个寄存器,则记录名称及其存放的数值   
  660. 例:   
  661. log "Hello world" // 记录为 "Hello world"   
  662. var x   
  663. mov x, 10   
  664. log x // 记录为 "x = 00000010"   
  665.   
  666. MOV 目的操作数, 源操作数,最大字节   
  667. -------------   
  668. <MOV>   
  669. 将源操作数移动到目的操作数中。   
  670. 源操作数可以是一个十六进制序列格式#某个十六进制序列#,例如:#1234#。   
  671. 提醒:十六进制序列的位长只能是偶数,比如2, 4, 6, 8等等。   
  672. 例:    
  673. mov x, 0F                             //将F传给变量x   
  674. mov y, "Hello world"                  //将字符串"Hello world"传给变量y   
  675. mov eax, ecx                          //同汇编   
  676. mov [ecx], #00DEAD00BEEF00#           //将##内的内容传到ecx的地址中   
  677. mov !CF, 1                            //赋值!CF标志寄存器为1   
  678. mov !DF, !PF                          //将!PF赋值给!DF   
  679. mov [403000], "Hello world"           //直接将字符串"Hello world"传送到403000的地址中   
  680. mov eax,[401000],1                    //只取401000地址中的一个字节长度的内容传送到eax中(新功能)   
  681.   
  682. MSG 消息   
  683. -----------   
  684. <MeSsaGe>   
  685. 将指定消息,显示到一个对话框中。   
  686. 例:   
  687. MSG "脚本暂停"  
  688.   
  689. MSGYN message   
  690. -----------   
  691. <MeSsaGe Yes or No>   
  692. 将指定消息,显示到一个对话框中,这个对话框有“是”、“否”按钮。   
  693. 如果点“是”,保留变量 $RESULT 等于1,否则保留变量$RESULT等于0 。   
  694. 例:   
  695. MSGYN "继续?"  
  696.   
  697. MUL 目的操作数, 源操作数   
  698. -------------   
  699. <mul>   
  700. 源操作数与目的操作数进行乘法操作,并将结果保存到到目的操作数中。   
  701. 例:    
  702. mul x, 0F   
  703. mul eax, x   
  704. mul [401000], 5   
  705.   
  706. NEG 操作数   
  707. -------------   
  708. <NEG>   
  709. 操作数做取补操作,并将结果保存到到操作数中。   
  710. 例:    
  711. NEG x, 0F   
  712. NEG eax   
  713. NEG [401000]   
  714.   
  715. NOT 操作数   
  716. -------------   
  717. <NOT>   
  718. 操作数做逻辑非操作,并将结果保存到到操作数中。   
  719. 例:    
  720. NOT x, 0F   
  721. NOT eax   
  722. NOT [401000]   
  723.   
  724. OPCODE addr   
  725. -----------   
  726. 反汇编指定地址处的代码.   
  727. $RESULT是opcode   
  728. $RESULT_1是汇编代码   
  729. $RESULT_2是字节数   
  730. 如果不是opcode,$RESULT_2将返回0   
  731. Example:    
  732. opcode 00401000   
  733.   
  734. opentrace   
  735. ------------   
  736. 打开运行跟踪功能,关闭它请使用TC   
  737.   
  738. OR 目的操作数, 源操作数   
  739. -------------   
  740. <OR>   
  741. 源操作数和目的操作数做逻辑或操作,并将结果保存到到目的操作数中。   
  742. 例:    
  743. or x, 0F   
  744. or eax, x   
  745. or [401000], 5   
  746.   
  747. PAUSE   
  748. -----   
  749. <PAUSE>   
  750. 暂停脚本运行。可以通过插件菜单恢复脚本运行。   
  751. 例:   
  752. pause   
  753.   
  754. PREOP addr   
  755. ----------   
  756. 回溯指定地址的汇编命令   
  757. 注意: 这个命令并不能真实的反映EIP前的包含jmp的命令   
  758. Example:   
  759. preop eip   
  760.   
  761. READSTR addr,maxsize   
  762. -----------   
  763. 从addr处读指定大小的字符串   
  764. Example:   
  765.         readstr 401000,15   
  766.   
  767. REF addr   
  768. --------   
  769. 相当于在OllyDbg按 Ctrl R.   
  770. $RESULT variable is set to the first reference addr    
  771. $RESULT_1 to the opcode (text asm command)    
  772. $RESULT_2 to the comment (like reference window).    
  773. Repeat "REF addr" until $RESULT=0 to get next refs   
  774. Example:   
  775. continue:   
  776.       REF eip   
  777.       log $RESULT   
  778.       log $RESULT_1   
  779.       log $RESULT_2   
  780. cmp $RESULT,0   
  781. jne continue  
  782. REPL addr, find, repl, len   
  783. --------------------------   
  784. REPL 地址, 查找字符串, 替换字符串, 长度   
  785. --------------------------   
  786. <REPLace>   
  787. 在指定地址开始,在指定长度的字节范围内,用“替换字符串”替换“查找字符串”。   
  788. 允许使用通配符   
  789. 例:   
  790. repl eip, #6a00#, #6b00#, 10   
  791. repl eip, #??00#, #??01#, 10   
  792. repl 401000, #41#, #90#, 1F   
  793.   
  794. REset   
  795. ---------------------------   
  796.   
  797. RET   
  798. ---   
  799. <RETurn>   
  800. 退出脚本。   
  801. 例:   
  802. ret   
  803.   
  804. REV   
  805. ---   
  806. 字节反转.(注意是字节反转,不是位反转)   
  807. Example:   
  808. rev 01020304 //$RESULT = 04030201   
  809.   
  810. ROL 目的操作数, n   
  811. -------------   
  812. 循环左移目的操作数,n比特位;并将结果保存到到目的操作数中。   
  813. 例:   
  814. mov x, 00000010   
  815. ROL x, 8 // x is now 00001000   
  816.   
  817. ROR 目的操作数, n   
  818. -------------   
  819. 循环右移目的操作数,n比特位;并将结果保存到到目的操作数中。   
  820. 例:   
  821. mov x, 00000010   
  822. ROR x, 8   
  823.   
  824. RTR   
  825. ---   
  826. <Run To Return>   
  827. 执行到返回   
  828. 相当于在OllyDbg中执行 "Run to return" [Ctrl+F9]操作。   
  829. 例:   
  830. rtr   
  831.   
  832. RTU   
  833. ---   
  834. <Run To User code>   
  835. 返回到用户代码区   
  836. 相当于在OllyDbg中执行 "Run to user code"[Alt+F9] 操作。   
  837. 例:   
  838. rtu   
  839.   
  840. RUN   
  841. ---   
  842. <RUN>   
  843. 让OD继续运行   
  844. 相当于在OllyDbg中按 F9。   
  845. 例:   
  846. run   
  847.   
  848. SCMP dest, src   
  849. -------------   
  850. 字符串比较.    
  851. Example:    
  852. cmp x, "KERNEL32.DLL"  
  853. cmp [eax], "Hello World"  
  854.   
  855. SCMPI dest, src   
  856. -------------   
  857. 字符串比较(大小写不敏感)   
  858. Example:    
  859. cmp sVar, "KERNEL32.DLL"  
  860. cmp [eax], "Hello World"  
  861.   
  862. SETOPTION   
  863. -------------   
  864. 调出调试设置(Option)菜单,设置好后按确定后继续执行脚本   
  865. 注意:此选项是为了可以在执行脚本的过程中可以调出调试设置异常,跟踪等等设置   
  866. SHL 目的操作数, n   
  867. -------------   
  868. 左移目的操作数,n比特位;并将结果保存到到目的操作数中。   
  869. 例:   
  870. mov x, 00000010   
  871. shl x, 8 // x is now 00001000   
  872.   
  873. SHR 目的操作数, n   
  874. -------------   
  875. <SHift Right>   
  876. 右移目的操作数,n 比特位;并将结果保存到到目的操作数中。   
  877. 例:   
  878. mov x, 00001000   
  879. shr x, 8 // x is now 00000010   
  880.   
  881. STI   
  882. ---   
  883. <STep Into>   
  884. 相当于在OllyDbg中按 F7,单步步入。   
  885. 例:   
  886. sti   
  887.   
  888. STO   
  889. ---   
  890. <STep Over>   
  891. 相当于在OllyDbg中按 F8,单步步过。   
  892. 例:   
  893. sto   
  894.   
  895. SUB dest, src   
  896. -------------   
  897. 源数据减目的数据   
  898. Example:    
  899. sub x, 0F   
  900. sub eax, x   
  901. sub [401000], 5   
  902.   
  903. TC   
  904. --   
  905. 相当于在OllyDbg中 "关闭运行跟踪"  
  906. Example:   
  907. tc   
  908.   
  909. TI   
  910. --   
  911. 相当于在OllyDbg中按 CTRL-F7,单步跟踪。   
  912. Example:   
  913. ti   
  914.   
  915. TICND cond   
  916. ----------   
  917. <Trace Into Condition>   
  918. 执行 "Trace into" 操作,直到条件为真时停止。   
  919. 例:   
  920. ticnd "eip > 40100A" // 当 eip > 40100A 时停止   
  921.   
  922. TO   
  923. --   
  924. <Trace Over>   
  925. 相当于在OllyDbg中执行 "Trace over" 操作。   
  926. 例:   
  927. to   
  928.   
  929. TOCND cond   
  930. ----------   
  931. <Trace Over Condition>   
  932. 执行 "Trace over" 操作,直到条件为真时停止。   
  933. 例:   
  934. tocnd "eip > 40100A" // 当 eip > 40100A 时停止   
  935.   
  936. VAR   
  937. ---   
  938. <VARiable>   
  939. 在脚本中,声明一个变量。   
  940. 必须在变量使用先声明。   
  941. 注意:变量名最好是由字母和数字组合成的容易识别的变量名   
  942.          +-*/等等符号最好不要附加在变量中,以免引起不可预测的错误   
  943.       由于为了兼容以前的系统,请不要将A,B,C,D,E,F作为变量.   
  944. 例:    
  945. var tmp   
  946.   
  947. XOR 目的操作数, 源操作数   
  948. -------------   
  949. <XOR>   
  950. 源操作数与目的操作数进行异或操作,并将结果保存到到目的操作数中。   
  951. 例:    
  952. xor x, 0F   
  953. xor eax, x   
  954. xor [401000], 5   
  955.   
  956. WRT file, data   
  957. -------------   
  958. 写数据给文件 (覆盖)   
  959. Numbers are wrote as strings... for the moment   
  960. Example:    
  961. wrt "out.txt""Data:\r\nOk\r\n"  
  962. wrt sFile, ebx   
  963.   
  964. WRTA file, data   
  965. -------------   
  966. 附加数据到文件中(文件结尾)   
  967. Example:    
  968. wrta sFile, "hello world\r\n"  
  969.   
  970. 3.2 标签   
  971. ----------   
  972. 定义标签,要在标签名后面要加上一个冒号.   
  973. 例:   
  974. SOME_LABEL:   
  975.   
  976. 3.3 注释   
  977. ------------   
  978. 您可以使用“//”在任何地方进行注释。   
  979. 块注释必须另外起一行并以 “/*”做为开始,以“*/”作为结束,“*/”也必须另起一行。   
  980.   
  981. 例:   
  982. /*  
  983. 您的注释  
  984. */  
  985.   
  986. 3.4 菜单   
  987. ---------   
  988. ODBGScript的主菜单包含了下面几项:   
  989. - Run script...[运行脚本...]: 用户选择一个脚本,并运行这个脚本。   
  990. - Abort [中止]: 中止脚本运行   
  991. - Pause [暂停]: 暂停脚本运行   
  992. - Resume[恢复]: 恢复脚本运行   
  993. -脚本运行窗口:动态观察脚本运行   
  994. -脚本日志窗口:记录脚本运行情况   
  995. - About [关于]: 显示此插件信息   
  996.   
  997. 3.5 Script Window   
  998. -----------------   
  999. 脚本窗口是ODbgScript内置的,它能让你调试和观察你的脚本.   
  1000. 你能在这里为脚本设置断点,调试脚本,编辑变量还能手工执行脚本命令   
  1001.   
  1002. 4. 嵌入其他的插件   
  1003. ---------------------------------   
  1004. 您可以在您的插件中调用OllyScrip,并且运行一个脚本。   
  1005. 使用类似于下面的代码进行调用:   
  1006.   
  1007. HMODULE hMod = GetModuleHandle("OllyScript.dll");   
  1008. if(hMod) // 检测是否被其他插件加载   
  1009. {    
  1010. // 获得输出函数地址   
  1011. int (*pFunc)(char*) = (int (*)(char*)) GetProcAddress(hMod, "ExecuteScript");   
  1012. if(pFunc) // 检查是否获得输出函数   
  1013. pFunc("myscript.txt"); // 执行输出函数   
  1014.   
  1015. =============================================================================   
  1016.   
  1017. 示例:   
  1018.   
  1019. 1: ESP定律脱“NsPacK”   
  1020.   
  1021. var addr                    //声明一个变量   
  1022. sto                            //F8单步   
  1023. sto                            //F8单步   
  1024. mov addr,esp           //将源操作数移动到目的操作数中   
  1025. bphws addr,"r"          //下断 hr esp   
  1026. run                           //F9运行   
  1027. BPHWC addr            //删除断点   
  1028. sto                            //F8单步   
  1029. sto                            //F8单步   
  1030. cmt eip, "This is the OEP!       //在指定地址处,加入注释   
  1031. ret                           //结束  

Tags: od脚本

« 上一篇 | 下一篇 »

1条记录访客评论

不错 我回头好好的学习下这个

Post by chx4 on 2010, May 25, 11:53 PM 引用此文发表评论 #1

发表评论