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