安全中国首页 > 文章中心 > 工具技巧
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:download.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

第四卷 OllyDBG 插件系列 第四篇 ODbgScript的 注意事项和使用技巧

更新时间:2008-10-13 3:08:30
责任编辑:流火
热 点:
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都是下的硬件断点.硬件断点最好在需要的时候再下.

1 2 下一页

 
相关文章
一日一文章
 
一日一软件
一日一动画