IDApython 命令

来源:https://www.cnblogs.com/0xHack/archive/2018/08/01/9399321.html
-Advertisement-
Play Games

因為網上對於IDApython的介紹太少,所以在這裡列舉了一些常用函數: ScreenEA() 獲取 IDA 調試視窗中,游標指向代碼的地址。通過這個函數,我們就能夠從一個已知 的點運行我們的腳本。 GetInputFileMD5() 返回 IDA 載入的二進位文件的 MD5 值,通過這個值能夠判斷 ...


因為網上對於IDApython的介紹太少,所以在這裡列舉了一些常用函數:

 

ScreenEA()
  獲取 IDA 調試視窗中,游標指向代碼的地址。通過這個函數,我們就能夠從一個已知 的點運行我們的腳本。

GetInputFileMD5()
  返回 IDA 載入的二進位文件的 MD5 值,通過這個值能夠判斷一個文件的不同版本是否 有改變。

FirstSeg()
  訪問程式中的第一個段。

NextSeg()
  訪問下一個段,如果沒有就返回 BADADDR。

SegByName( string SegmentName )
  通過段名字返回段基址,舉個例子,如果調用.text 作為參數,就會返回程式中代碼段的開始位置。

SegEnd( long Address )
  通過段內的某個地址,獲得段尾的地址。

SegStart( long Address )
  通過段內的某個地址,獲得段頭的地址。

SegName( long Address )
  通過段內的某個地址,獲得段名。

Segments()
  返回目標程式中的所有段的開始地址。

Functions( long StartAddress, long EndAddress )
  返回一個列表,包含了從 StartAddress 到 EndAddress 之間的所有函數。

Chunks( long FunctionAddress )
  返回一個列表,包含了函數片段。每個列表項都是一個元組(chunk start, chunk end)

LocByName( string FunctionName )
  通過函數名返回函數的地址。

GetFuncOffset( long Address )
  通過任意一個地址,然後得到這個地址所屬的函數名,以及給定地址和函數的相對位移。 然後把這些信息組成字元串以"名字+位移"的形式返回。

GetFunctionName( long Address )
  通過一個地址,返回這個地址所屬的函數。

CodeRefsTo( long Address, bool Flow )
  返回一個列表,告訴我們 Address 處代碼被什麼地方引用了,Flow 告訴 IDAPython 是否要 跟蹤這些代碼。

CodeRefsFrom( long Address, bool Flow )
  返回一個列表,告訴我們 Address 地址上的代碼引用何處的代碼。

DataRefsTo( long Address )
  返回一個列表,告訴我們 Address 處數據被什麼地方引用了。常用於跟蹤全局變數。

DataRefsFrom( long Address )
  返回一個列表,告訴我們 Address 地址上的代碼引用何處的數據。

Heads(start=None, end=None)
  得到兩個地址之間所有的元素

GetDisasm(addr)
  得到addr的反彙編語句

GetMnem(addr)
  得到addr地址的操作碼

BADADDR
  驗證是不是錯誤地址

GetOpnd(addr,long n)
  第一個參數是地址,第二個long n是操作數索引。第一個操作數是0和第二個是1。

idaapi.decode_insn(ea)
  得到當前地址指令的長度

idc.FindFuncEnd(ea)
  找到當前地址的函數結束地址

Entries()
  入口點信息

Structs()
  遍歷結構體

StructMembers(sid)
  遍歷結構體成員

DecodePrecedingInstruction(ea) 獲取指令結構
DecodePreviousInstruction(ea)
DecodeInstruction(ea)

Strings(object) 獲取字元串
GetIdbDir() 獲取idb目錄
GetRegisterList() 獲取寄存器名錶
GetInstructionList 獲取彙編指令表

atoa(ea) 獲取所在段
Jump(ea) 移動游標
Eval(expr) 計算表達式
Exec(command) 執行命令行
MakeCode(ea) 分析代碼區
MakeNameEx(ea, name, flags) 重命名地址
MakeArray(ea, nitems) 創建數組
MakeStr(ea, endea) 創建字元串
MakeData(ea, flags, size, tid) 創建數據
MakeByte(ea)
MakeWord(ea)
MakeDWord(ea)
MakeQWord(ea)
MakeOWord(ea)
MakeYWord(ea)
MakeFlot(ea)
MakeDouble(ea)
MakePackReal(ea)
MakeTbyte(ea)
MakeStructEx(ea)
MakeCustomDataEx(ea)

PatchByte(ea, value) 修改程式位元組
PatchWord(ea, value)
PatchDword(ea, value)
PatchByte(ea, value)
PatchByte(ea, value)

Byte(ea) 將地址解釋為Byte
Word(ea)
DWord(ea)
QWord(ea)
GetFloat(ea)
GetDouble(ea)
GetString(ea, length = -1, strtype = ASCSTR_C) 獲取字元串
GetCurrentLine() 獲取游標所在行反彙編

ItemSize(ea) 獲取指令或數據長度

FindText(ea, flag, y, x, searchstr)查找文本
FindBinary(ea, flag, searchstr, radix=16) 查找16進位

GetEntryPointQty() 獲取入口點個數
GetEntryOrdinal(index) 獲取入口點地址
GetEntryName(ordinal) 入口名


idc.GetFunctionAttr(ea, attr) //得到當前地址所在函數的數據
(
FUNCATTR_START = 0 # function start address
FUNCATTR_END = 4 # function end address
FUNCATTR_FLAGS = 8 # function flags
FUNCATTR_FRAME = 10 # function frame id
FUNCATTR_FRSIZE = 14 # size of local variables
FUNCATTR_FRREGS = 18 # size of saved registers area
FUNCATTR_ARGSIZE = 20 # number of bytes purged from the stack
FUNCATTR_FPD = 24 # frame pointer delta
FUNCATTR_COLOR = 28 # function color code
FUNCATTR_OWNER = 10 # chunk owner (valid only for tail chunks)
FUNCATTR_REFQTY = 14 # number of chunk parents (valid only for tail chunks)
)


class DbgHook(DBG_Hooks):
# Event handler for when the process starts
def dbg_process_start(self, pid, tid, ea, name, base, size)
return
# Event handler for process exit
def dbg_process_exit(self, pid, tid, ea, code):
return
# Event handler for when a shared library gets loaded def
dbg_library_load(self, pid, tid, ea, name, base, size):
return
# Breakpoint handler
def dbg_bpt(self, tid, ea):
return

這個類包含了我們在創建調試腳本時,會經常用到的幾個調試事件處理函數。安裝 hook 的方式如下:
debugger = DbgHook()
debugger.hook()
現在運行調試器,hook 會捕捉所有的調試事件,這樣就能非常精確的控制 IDA 調試器。 下麵的函數在調試的時候非常有用:
AddBpt( long Address )
在指定的地點設置軟體斷點。
GetBptQty()
返回當前設置的斷點數量。
GetRegValue( string Register )
通過寄存器名獲得寄存器值。
SetRegValue( long Value, string Register )

 

這個是用IDApytohon編寫的查找strcpy函數以及他的參數是否在棧區域

 1 def is_stack_buffer(addr, idx):
 2     inst = DecodeInstruction(addr)
 3 
 4     # IDA < 7.0
 5     try:
 6         ret = get_stkvar(inst[idx], inst[idx].addr) != None
 7     # IDA >= 7.0
 8     except:
 9         from ida_frame import *
10         v = inst[idx].addr
11         if sys.maxint < v:
12             v = twos_compl(v)
13         ret = get_stkvar(inst, inst[idx], v)
14     return ret
15 
16 def find_arg(addr,arg_num):                ##This is x86
17     function_h=LocByName(GetFunctionName(addr))
18     step=0
19     arg_cou=0
20     while step<0 :
21         step=step+1
22         addr=idc.PrevHead(addr)
23         op=GetMnem(addr).lower()
24         if op in ("ret","jmp","retn","b") or addr<function_h:
25             return
26         if op =="push":
27             arg_count=arg_count+1
28             if arg_count==arg_num:
29                 return GetOpnd(addr,0)
30 
31 for functionaddr in Functions():
32     if "strcpy" in GetFunctionName(functionaddr):
33         xref=CodeRefsTo(functionaddr,0)
34         for xxx in xref:
35             if GetMnem(xxx).lower()=="call":
36                 oped= find_arg(xxx,1)
37                 function_h=LocByName(GetFunctionName(xxx))
38                 addr_=xxx
39                 lalal=xxx
40                 while True:
41                     __add=idc.PrevHead(addr_)
42                     __op=GetMnem(__add).lower()
43                     
44                     if __op in ("ret", "retn", "jmp", "b") or __add < function_h:
45                         break
46                     if __op == "lea" and GetOpnd(__add,0)==oped:
47                         if is_stack_buffer(addr_,1):
48                             prinf "STACK at 0x%X"%lalal
49                             break
50                     if __op == "mov" and GetOpnd(addr_,0)==oped:
51                         op_type = GetOpType(addr_, 1)
52                         if op_type == o_reg:
53                             oped = GetOpnd(addr_, 1)
54                             lalal = addr_
55                         else:
56                             break

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、React初探 es6寫法 "code" es5寫法(遺憾的是現在最新版本的react,已經不再能使用createClass去創建react組件了 "code" ) 核心思想:封裝組件,各個組件維護自己的狀態(state, prop)和UI,當狀態變更,自動重新渲染組件,數據流向是單向的。 需要 ...
  • 最近的幾個項目都用到了localStrage來存儲用戶的相關登錄信息,本來想繼續深入學習下localStrage的相關內容,逐漸衍生到了用戶登錄的相關邏輯 先整理下localStrage的相關知識點 1、http跟hppts不互通, 2、localStrage 存儲在 C:\Users\xxx\Ap ...
  • 看鬥魚有些時間了,也寫了不少輔助的js,但是昨天不小心把硬碟分區表搞沒了,自己寫了好久的代碼不見了,DiskGenius 也沒恢覆成功,所以要重寫一次,大家要引以為鑒,常備份代碼,github是個不錯的選擇。 先通過一個簡單的程式, 來認識下 Chrome 擴展,通過最簡單的2個文件,就能組成一個C ...
  • 空杯心態,從零開始。 應用運維->實操最重要。 每個業務至少有一種解決方案;每個方案至少會一個軟體實現。 系統架構師實際是軟體架構師。 系統運維架構師。 架構師主要是架構思想,不是某一個軟體個體。 製造子彈->系統開發級別。 組裝坦克飛機->鳳毛麟角。 Linux系統架構師->一期 軟體架構師->二 ...
  • RockBrain USB Server- 雲計算虛擬化USB設備集中管理、遠程共用解決方案(涉及銀企直聯) 技術需求: 1.企業員工的大量USB Key,需要將key接入USB Server虛擬池,進行集中管理。 2.設置USB Key最高管理員,本管理員許可權:在Server端可以對Key的埠進 ...
  • Date類: 類 Date 表示特定的瞬間,精確到毫秒。 毫秒概念:1000毫秒=1秒 毫秒的0點: System.currentTimeMillis() 返回值long類型參數 用於獲取當前日期的毫秒值 時間的原點:公元1970年 一月一日,午夜0:00:00 對應的毫秒值就是0 註意:時間和日期 ...
  • 簡單工廠模式是一個工廠類根據工廠方法的參數創建不出不同的產品, 工廠方法模式是每一個產品都有一個一一對應的工廠負責創建該產品。那麼今天要講的抽象工廠模式是一個工廠能夠產生關聯的一系列產品。抽象工廠模式相對於簡單工廠和工廠方法模式來著更具抽象性。 一、抽象工廠模式演繹 我們先來看一個簡單的需求: 甲方 ...
  • 前言 最近懶成一坨屎,學不動系列一波接一波,大多還都是底層原理相關的。上周末抽時間重讀了周志明大濕的 JVM 高效併發部分,每讀一遍都有不同的感悟。路漫漫,藉此,把前段時間搞著玩的秒殺案例中的分散式鎖深入瞭解一下。 案例介紹 在嘗試瞭解分散式鎖之前,大家可以想象一下,什麼場景下會使用分散式鎖? 單機 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...