生活随笔
收集整理的這篇文章主要介紹了
常用的IDC函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 讀取和修改數據的函數
- 用戶交互函數
- 字符串操縱函數
- 文件輸入/輸出函數
- 操縱數據庫名稱
- 處理函數的函數
- 代碼交叉引用函數
- 數據交叉引用函數
- 數據庫操縱函數
- 數據庫搜索函數
- 反匯編行組件
讀取和修改數據的函數
下面的函數可用于訪問數據庫中的各個字節,字和雙字
long Byte(long addr),從虛擬地址addr處讀取一個字節值long Word(long addr),從虛擬地址addr處讀取一個字(2個字節)值long Dword(long addr),從虛擬地址addr處讀取一個雙字(4個字節)值long PatchByte(long addr,long val),設置虛擬地址addr處的一個字節值long PatchWord(long addr,long val),設置虛擬地址addr處的一個字值long PatchDword(long addr,long val),設置虛擬地址addr處讀取一個雙字值void idLoaded(long addr),如果addr包含有效數據,則返回1,否則返回0
在讀取和寫入數據庫時,這里的每一個函數都考慮到了當前處理器模塊的字節順序(小端或者大端)。例如,調用PatchByte(0x401010,0x1234)將使用字節值0x34(0x1234的低位字節)修改0x401010位置。如果在用Byte,Word和Dword讀取數據庫時提供了一個無效的地址,他們將分別返回值0xFF,0xFFFF和0xFFFFFFFF。因為你沒有辦法將這些錯誤值與存儲在數據庫中的合法值分開來,因此,在嘗試從數據庫中的某個地址讀取數據之前,可以調用isLoaded函數,
用戶交互函數
void Message(string fromat,……),在輸出窗口打印一條格式化消息,這個函數類似于C語言的printf函數,并接受printf風格的格式化字符串void printf(……),在輸出窗口中打印每個參數的字符串表示形式void Warning(string fromat,……),在對話框中顯示一條格式化消息string AskStr(string default,string prompt),顯示一個輸入框,要求用戶輸入一個字符串值。如果操作成功,則返回用戶的字符串;如果對話框被取消,則返回0string AskFile(long doSave,string mask,String prompt),顯示一個文件選擇對話框,以簡化選擇文件的任務。你可以創建新文件保存數據(doSave=1),或選擇現有的文件讀取數據(doSave=0)。你可以根據mask(如*.*或*.idc)過濾顯示的文件列表。如果操作成功,則返回選定文件的名稱;如果對話框被取消,則返回0long AskYN(long deafult,string prompt),用一個答案為“是”或“否”的問題提示用戶,如初一個默認的答案(1為是,0為否,-1為取消)。返回值是一個表示選定答案的整數。long ScreenEA(),返回當前光標所在位置的虛擬地址bool Jump(long addr),跳轉到反匯編窗口的指定地址
因為idc沒有任何調試工具,可將Message作為主要調試工具,AskXXX函數用于處理更加專用的輸入,如整數輸入。如果希望創建一個根據光標位置調整其行為的腳本,這時,ScreenEA的函數就非常有用。如果腳本需要將用戶的注意力轉移到反匯編代碼的清單中的某個位置,也需要用到Jump函數
字符串操縱函數
簡單的字符串賦值和拼接操作可以直接通過idc 基本運算符實現,其它更加復雜操作需要用到以下函數:
string form(string format,…………)preIDA5.6,返回一個新字符串,該字符串根據所提供的格式化字符串和值進行格式化。這個函數基本等同于c中的sprintf函數string sprintf(string format,……)IDA5.6+,在IDA5.6中,sprintf用于替代formlong atol(string val),將十進制val轉換成對應的整數值long xtol(string val),將十六進制val(可選擇以0x開頭)轉換成對應的整數值string Itoa(long val,long radix),以指定的radix(2,8,10或16)返回val的字符串值long ord(string str),返回單字符字符串ch的ASCII值long strlen(string str),返回所提供字符串的長度long strstr(string str,string substr),返回str中substr 的索引,如果沒有發現子字符串,則返回-1string substr(string str,long start,long end),返回包含str中由start到end-1位置的字符的子字符串,如果使用分片(IAD5.6以及更高的版本),此函數等同于str[start:end]
IDC沒有任何字符數據類型,它也不支持任何數組語法,如果想要遍歷字符串的每個字符,必須把字符串中的每個字符當成連續的單字符子字符串處理
文件輸入/輸出函數
已經討論了AskFile函數要求用戶輸入文件名,但是AskFile僅僅返回一個包含文件名的字符串值
long fopen(string filename,string mode),返回一個整數文件句柄(如果發生錯誤,則返回0),供所以IDC文件輸入/輸出函數使用。mode參數與C語言的fopen函數使用的模式(r表示讀取,w表示寫入,等等)void fclose(long handle),關閉fopen中文件句柄指定的文件long filelength(long handle),返回指定文件的長度,如果發生錯誤,則返回-1long fgetc(long handle),從給定文件中讀取一個字節,如果發生錯誤,則返回-1long fputc(long val,long handle),寫入一個字節到給定文件中。如果操作成功,則返回0;如果發生錯誤,則返回-1long fprintf(long handle ,string fromat,……)將一個格式化字符串寫入到給定文件中long writestr(long handle ,string str),將指定的字符串寫入到給定文件中string/long readstr(long handle),從給定文件夾中讀取一個字符串,這個函數讀取到下一個換行符為止的所有字符(包括非ASCII字符),包括換行符本身(ASCII 0xA)。如果操作成功,則返回字符串;如果讀取到文件結尾,則返回-1long writelong(long handle,long val,long bigendian),使用大端(bigendian=1)或小端(bigendian=0)字節順序將一個4字節整數寫入到給定文件long readlong(long handle,long bigendian),使用大端(bigendian=1)或小端(bigendian=0)字節順序從給定的文件讀取一個4字節整數long writeshort(long handle,long val,long bigendian),使用 大端(bigendian=1)或小端(bigendian=0)字節順序將一個2字節整數寫入到給定文件long readshort(long handle,long bigendian),使用大端(bigendian=1)或小端(bigendian=0)字節順序從給定的文件讀取一個2字節整數bool loadfile(long handle,long pos ,long addr,long length),從給定文件的pos位置讀取length數量的字節,并將這些字節寫入到以addr地址開頭的數據庫中bool savefile(long handle,long pos,long addr,long length),將以addr數據庫地址開頭的length數量的字節寫入給定文件的pos位置
操縱數據庫名稱
下面的IDC函數用于處理IDA數據庫中已命名的位置:
string Name(long addr),返回與給定地址有關的名稱,如果該位置沒有名稱,則返回空字符串,如果名稱被標記為局部名稱,這個函數并不返回用戶定義的名稱string NameEx(long from,long addr),返回與addr有關的名稱,如果該位置沒有名稱,則返回空字符串,如果from是一個同樣包含addr 的函數中的地址,則這個函數返回用戶定義的局部名稱bool MakeNameEx(long addr,string name,long flags),將給定的名稱分配給給定的地址。該名稱使用flags為掩碼中指定的屬性創建而成。這些標志在幫助系統中的MakeNameEx文檔中有記載描述,可用于指定各種屬性,如名稱是局部名稱還是公共名稱,名稱是否應在名稱窗口中列出long LocByName(string name),返回一個位置(名稱已給定)的地址。如果數據庫中沒有這個名稱,則返回BADADDR(-1)long LocByNameEx(long funcaddr,string localname),在包含funcaddr 的函數中搜索給定的局部名稱,如果給定的函數中沒有這個名稱,則返回BADADDR(-1)
處理函數的函數
許多腳本專用于分析數據庫中的函數。IDA為經過反匯編的函數分配大量屬性,如函數局部變量區域的大小,函數的參數在運行時棧上的大小。下面的IDC函數可用于訪問與數據庫中的函數有關信息
long GetFunctionAttr(long addr,long attrib),返回包含給定地址的函數的被請求的屬性。例如,要查找一個函數的結束地址,可以使用GetFunctionAttr( addr,FUNCATTR_END)string GetFunctionName(long addr),返回包含給定地址的函數的名稱,如果給定的地址并不屬于一個函數,則返回一個空字符串long NextFunction(long addr),返回給定地址后的下一個函數的起始地址,如果數據庫中給地地址后沒有其他函數,則返回-1long PrevFunciton(long addr),返回給定地址之前距離最近的函數的起始地址,如果在給定函數之前沒有函數,則返回-1根據函數的名稱,使用LocByName 函數查找該函數的起始地址
代碼交叉引用函數
long Rfirst(long from),返回給定地址向其轉交控制權的第一個位置。如果給定的地址沒有引用其他地址,則返回BADADDR(-1)long Rnext(long from,long current),如果current已經在前一次調用Rfirst或Rnext時返回,則返回給定地址(from)轉交控制權的下一個位置,如果沒有其他交叉引用存在,則返回BADADDRlong XrefType(),返回一個常量,說明某個交叉引用查詢函數(如Rfirst)返回的最后一個交叉引用的類型。對于代碼交叉引用,這些常量包括fl_CN(近調用),fl_CF(遠調用),fl_JN(近跳轉),fl_JF(遠跳轉)和fl_F(普通順序流)long RfirstB(long to),返回轉交控制權到給定地址的第一個位置。如果不存在對給定地址的交叉引用,則返回BADADDR(-1)long RnextB(long to,long current),如果current已經在前一次調用RfirstB或RnextB時返回,則返回下一個轉交控制權到給定地址(to)的位置。如果不存在其他對給定位置的交叉引用,則返回BADADDR(-1)
每次調用一個交叉引用函數,IDA都會設置一個內部IDC狀態變量,指出返回的最后一個交叉引用的類型,如果需要知道你收到的交叉引用類型,那么在調用其他交叉引用查詢函數之前,必須調用XrefType函數
數據交叉引用函數
訪問數據交叉引用信息的函數與訪問代碼交叉引用信息的函數非常相似:
long Dfirst(long from),返回給定地址引用一個數據值的第一個位置,如果給定地址沒有引用其他地址,則返回BADADDR(-1)long Dnext(long from,long current),如果current已經在前一次調用Dfirst或Dnext時返回,則返回給定地址(from)向其引用一個數據值的下一個位置。如果沒有其他交叉引用存在,則返回BADADDRlong XrefType(),返回一個 常量,說明某個交叉引用查詢函數(如Dfirst)返回的最后一個交叉引用的類型,對于數據交叉引用,這些常量包括dr_0(提供的偏移量),dr_w(數據寫入)和dr_R(數據讀取)long DnextB(long to,long current),如果current已經在前一次調用DfirstB或DnextB時返回,則返回將給定地址(to)作為數據引用的下一次位置。如果沒有其他對給定地址的交叉引用存在,則返回BADADDR
和代碼交叉引用一樣,如果需要知道你收到的交叉引用的類型,那么在調用另一個交叉引用查詢函數之前,必須調用XrefType函數
數據庫操縱函數
大量函數用于對數據庫的內容進行格式化:
void MakeUnkn(long addr,long flags),取消位于指定位置的項的定義。這里的標志指出是否也取消隨后的項的定義,以及是否刪除任何與取消定義的項有關的名稱,相關函數MakeUnknown允許你取消大塊數據的定義long MakeCode(long addr),將位于指定地址的字節換成一條指令,如果操作成功,則返回指令的長度,否則返回0bool MakeByte(long addr),將位于指定地址的項目轉換成一個數據字節。類似的函數還包括MakeWord和MakeDwordbool MakeComm(long addr,string comment),在給定的地址添加一條常規注釋bool MakeFunction(long begin ,long end),將由begin到end的指令轉換成一個函數。如果end 被指定為BADADDR(-1),IDA會嘗試通過定位函數的返回指令,來自動確定該函數的結束地址bool MakeStr(long begin ,long end),創建一個當前字符串(由GetStringType返回)類型的字符串,涵蓋由begin到end-1之間的所有字節,如果end被指定為BADADDR,IDA會嘗試自動確定字符串的結束位置
還有許多MakeXXX函數可提供上述函數操作
數據庫搜索函數
long FindCode(long addr,long flags),從給定的地址搜索一條指令long FindData(long addr,long flags),從給定的地址搜索一個數據項long FindBinary(long addr,long flags,string binary),從給定的地址搜索一個字節序列,字符串binary指定一個十六進制字節序列值。如果沒有設置SEARCH_CASE,且一個字節值指定了一個大寫或小寫ASCII字母,則搜索仍然會匹配對應的互補值。例如.“41 42”將匹配“61 62”(和“61 42”),除非你設置SEARCH_CASElong FindText(long addr,long flags ,long row,long column,string text),在給定的地址,從給定行(row)的給定列搜索字符串text,注意,某個給定地址的反匯編文本可能會跨越幾行,因此,你需要指定搜索從哪一行開始的
注意:SEARCH_CASE并未定義搜索的方向,根據SEACH_DOWN標志,其方向可能向上也可能向下,此外,如果沒有設置SEACH_NEXT,且addr位置的項與搜索條件匹配,則FindXXX函數很可能會返回addr參數傳遞給該函數的地址
反匯編行組件
string GetDisasm(long addr),返回給定地址的反匯編文本,返回的文本包括任何注釋,但不包括地址信息string GetMnem(long addr),返回位于地址的指令助記符部分string GetOpnd(long addr,long opnum),返回指定地址的指定操作數的文本形式。IDA以零為起始編號,從左向右對操作數進行編號long GetOpType(long addr,long opnum),返回一個證書,指出給定地址的給定操作數的類型long GetOperandValue(long addr,long opnum),返回與給定地址的給定操作數有關的整數值,返回值的性質取決于GetOpType指定的給定操作數的類型string CommentEx(long addr,long type),返回給定地址處的注釋文本。如果type為0,則返回常規注釋文本;如果type為1,則返回可重復注釋的文本。如果給定地址處沒有注釋,則返回一個空字符串。
總結
以上是生活随笔為你收集整理的常用的IDC函数的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。