IDC脚本介绍
IDC語(yǔ)言為IDA的一種腳本引擎,它之所以叫做IDC是因?yàn)樗恼Z(yǔ)法與C語(yǔ)言很相似,這里我參考《IDA Pro權(quán)威指南》介紹一些IDC常用的基本語(yǔ)法。
1.IDC的變量沒(méi)有明確的類型,IDC關(guān)鍵字auto用于引入一個(gè)局部變量的聲明,用extern關(guān)鍵字引入全局變量的聲明,不能在聲明全局變量時(shí)為其提供初始值。
Example1:
auto addr, reg, val; //沒(méi)有初始化聲明的多個(gè)變量auto count = 0; //已聲明和初始化Example2:
extern outsideGlobal;static main() {extern insideGlobal;outsideGlobal = “Global”;insideGlobal = 1; }2.IDC幾乎支持C中的所有運(yùn)算和邏輯操作符,所有整數(shù)操作數(shù)均作為有符號(hào)的值處理。這會(huì)影響到整數(shù)比較與右移位運(yùn)算。如果需要進(jìn)行邏輯右移位運(yùn)算,你必須修改結(jié)果的最高位,自己移位,如下代碼:
Example3:
result = ( x >> 1 ) & 0x7fffffff; //將最大有效位設(shè)置為0關(guān)于0x7fffffff :
每個(gè)十六進(jìn)制數(shù)為4bit,因此8位16進(jìn)制是4個(gè)字節(jié),剛好是一個(gè)int整型,F的二進(jìn)制碼為 1111,7的二進(jìn)制碼為 0111。這樣一來(lái),整個(gè)整數(shù) 0x7FFFFFFF 的二進(jìn)制表示就是除了首位是 0,其余都是1。也就是說(shuō),這是最大的整型數(shù) int(因?yàn)榈谝晃皇欠?hào)位,0 表示他是正數(shù))。
3.雖然IDC沒(méi)有數(shù)組數(shù)據(jù)類型,但你可以使用分片運(yùn)算符來(lái)處理IDC字符串,就好像他們是數(shù)組一樣,IDC分片的用法:
Example4:
auto str = “String to slice”; auto s1, s2, s3, s4; s1 = str[7:9]; //'to' s2 = str[ :6]; //'String' s3 = str[10: ]; //'slice' s4 = str[5]; //'g'4.與C語(yǔ)言一樣,IDC所有簡(jiǎn)單語(yǔ)句均以分號(hào)結(jié)束。Switch語(yǔ)句是IDC唯一不支持的C風(fēng)格復(fù)合語(yǔ)句。在使用for語(yǔ)句時(shí)IDC不支持復(fù)合賦值運(yùn)算符,如果你希望以除1以外的其他值為單位進(jìn)行計(jì)數(shù),就需要注意這一點(diǎn),如下代碼:
Example5:
auto i; for (i = 0; i < 10; i += 2) {} //不合法,不支持 += for (i = 0; i < 10; i = i + 2) {} //合法5.輸出語(yǔ)句(Message函數(shù)類似于C中的printf函數(shù))
Example6:
auto i = 10; auto j = 20; Message(“i = %d\n”, i); Message(“j = %d\n”, j);6.IDC文件僅僅在獨(dú)立程序(.idc文件)支持用戶自定義的函數(shù),IDC命令對(duì)話框不支持。IDC程序文件的基本結(jié)構(gòu):
Example7:
#include<idc.idc> //頭文件 static main() {//do something fun here }7.一些常用函數(shù):
1)void PatchByte(long addr , long val) 設(shè)置虛擬地址addr處的一個(gè)字節(jié)值,PatchByte可更換為PatchWord,PatchDword設(shè)置虛擬地址addr處的2字節(jié)和4字節(jié)值。
2)long Byte(long addr) 從虛擬地址addr讀取一個(gè)字節(jié)值,Byte可更換為Word,Dword讀取2字節(jié)和4字節(jié)值。
3)void Message(string format , …),在輸出窗口打印一條格式化消息。
4)void print(…),在輸出窗口中打印每個(gè)參數(shù)的字符串表示形式。
5)long atol(string val),將10進(jìn)制val轉(zhuǎn)化成對(duì)應(yīng)整數(shù)值。
6)long xtol(string val),將16進(jìn)制val轉(zhuǎn)化成對(duì)應(yīng)整數(shù)值。
7)long ord(string ch),返回單字符字符串ch的ASCII值。
8)string Name(long addr),返回與給定地址有關(guān)的名稱,如果該位置沒(méi)有名稱,則返回空字符串。
總結(jié)
- 上一篇: 范德堡计算机科学硕士,美国范德堡大学计算
- 下一篇: OV2715驱动