IDAPython第三講 搜索功能 與交叉引用功能
一丶搜索函數簡介
在IDAPython中如果我們想查詢某些 數據 代碼 二進制 都可以用都搜索函數.
搜索函數可以是向上搜索 也可以是向下搜索. 搜索失敗就會返回-1 也就是BADADDR
而搜索功能也常常用於去除花指令當中.
在官網中可以點擊此鏈接進行觀看學習:
flag的取值如下:
flag取值有:
SEARCH_DOWN 向下搜索
SEARCH_UP 向上搜索
SEARCH_NEXT 獲取下一個找到的對象。
SEARCH_CASE 指定大小寫敏感度
SEARCH_UNICODE 搜索 Unicode 字符串。
常見的函數如下: (IDA7.5之前版本與IDA7.5改版后的高級支持版本)
| 老函數 | 作用 | 新函數 |
|---|---|---|
| idc.FindBinary | 查找二進制找到返回地址沒找到返回-1(BADADDR) | idc.find_binary(ea, flag, searchstr, radix=16, from_bc695=False) |
| idc.FindData | 從ea還是返回查找的數據 | idc.find_data 或者ida_search.find_data |
| idc.FindCode | 查找代碼找到指定地址的代碼 | idc.find_code 可以使用 ida_search.find_code 也可以使用 |
| idc.Jump | 跳轉到ea位置 | ida_kernwin.jumpto(ea) |
例子:
ea = here()
value = idc.find_binary(ea,SEARCH_DOWN,'8B 4D 08') 從ea位置向下查找 查找的二進制為8B 4D 08 返回查找到的地址
value1 = idc.find_code(ea,SEARCH_DOWN) 從ea還是查找找到ea下的第一行code代碼地址
value2 = idc.find_data(ea,SEARCH_DOWN)
其中常見的就是上方表示的幾個函數
IDA升級之后其查找函數都變為了 ida_search.find_xxx了. 擇優選擇去官網學習.
而后可以使用 is_code is_data is_xxx函數來判斷獲取的值是否是對的.
二丶數據校驗函數
數據校驗函數就是isxxx 但是它的參數是一個flag所以我們要先使用函數來獲取flag 然后在將獲取的值傳入isxxx 來進行判斷.
| 老函數 | 作用 | 新函數 |
|---|---|---|
| idc.GetFlags(ea) | 獲取標志 | ida_bytes.get_full_flags |
| idc.isCode(f) | 判斷是否是代碼傳入標志 根據標志返回True or False | ida_bytes.is_code(f) |
| idc.isData(f) | 同上 只不過是判斷是否是數據 | ida_bytes.is_data(f) |
示例如下:
import idc
ea = here()
value1 = idc.find_code(ea,SEARCH_DOWN)
print(hex(value1))
flag = ida_bytes.get_full_flags(value1)
print(flag)
print(ida_bytes.is_code(flag))
三丶交叉引用功能
在我們實際在IDA的操作中 我們常常會對一個函數按X快捷鍵來查看誰引用了. 或者對數據看看誰引用了他. 這些在IDAPython中都給我們提供了函數功能. 下面來看看如何操作吧.
這里只介紹如何對引用做操作. 至於添加引用刪除引用 可以觀看文檔.
| 函數 | 作用 |
|---|---|
| CodeRefsTo( long Address, bool Flow ) | 獲取地址處引用位置 A調用B 對B函數地址使用此函數則找到A調用 返回列表.遍歷列表則可以找出所有引用位置. 參數1是ea也就是地址,參數2告訴IDA是否跟蹤這些代碼. |
| CodeRefsFrom( long Address, bool Flow ) | 返回address的代碼引用了何處的代碼. 返回一個列表 |
| DataRefsTo( long Address ) | 返回一個列表告訴address位置的數據被誰引用了 |
| DataRefsFrom( long Address ) | 同上 告訴我們address引用了誰. |
代碼如下:
import idc
ea = here()
for i in CodeRefsTo(ea,False):
print(hex(i))
# DataRefsTo(ea):
#DataRefsTo(ea)
