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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...