python代码执行过程记录_[原创]IDAPython+OdbgScript动态获取程序执行流程
題記: 最近知道了有一種方法,可以獲取到程序的執(zhí)行流程,具體做法是先獲取程序中每一個(gè)函數(shù)的地址,在這些地址上設(shè)置斷點(diǎn),然后讓程序運(yùn)行起來,hook調(diào)試器,斷點(diǎn)中斷時(shí),不要停下來繼續(xù)執(zhí)行,并記錄命中的斷點(diǎn),這樣就得到了程序的執(zhí)行流程。
這個(gè)方法是利用IDA的一個(gè)插件IDAPython實(shí)現(xiàn)的,這個(gè)插件可以hook IDA內(nèi)置的調(diào)試器,通過調(diào)用一個(gè)py腳本實(shí)現(xiàn)以上功能,執(zhí)行腳本時(shí)IDA提示窗口會(huì)不停的輸出HIT * 0x0000000,這些地址便是程序執(zhí)行過的函數(shù)。可是他的速度實(shí)在是讓人蛋疼,程序基本上算是卡死了。
于是本人進(jìn)行了一些修改,把IDA里面調(diào)試器做的事讓OD去做,這樣就不會(huì)有卡死的情況。于是,首先要從IDA里把函數(shù)的地址導(dǎo)出,py腳本如下
from idaapi import *
current_addr = ScreenEA()
i=0
#保存斷點(diǎn)文件的完整路徑,這里需要自己修改
filePath=” F:\\Users\\Administrator\\Desktop\\bp_Func.txt”
myfile = open(filePath, 'w')
for function in Functions(SegStart( current_addr ), SegEnd( current_addr )):
str_f=str(hex(function))
myfile.write("bp 0"+ str_f[2:]+ '\n') #以bp xxxxxxx的形式輸出斷點(diǎn)信息
i=i+1
print "Out Put bp number %d" % i
myfile.close()
導(dǎo)出函數(shù)地址保存到指定路徑的bp_Func.txt中
打開IDA,載入目標(biāo)程序,安裝好了IDAPython插件以后IDA IDAPython的菜單項(xiàng)目,有的是版本IDA點(diǎn)文件能看到,有的是編輯---plugins 下面。這里以一個(gè)小程序ipMsg為例,點(diǎn)擊IDAPython菜單項(xiàng),選擇剛才編寫的py腳本文件,運(yùn)行成功后,IDA提示窗口會(huì)顯示導(dǎo)出斷點(diǎn)的數(shù)量,這時(shí)候bp_Func.txt里面就保存有斷點(diǎn)的信息。
執(zhí)行結(jié)果
Out Put bp number 566
打開bp_Func.txt 會(huì)看到有很多行bp xxxxxxx
接下來再編寫OdbgScript腳本:
//bc
//msg "是否允許腳本"
var _bp_nub
#INC " bp_Func.txt " //導(dǎo)入斷點(diǎn)信息
msg "斷點(diǎn)設(shè)置完畢!"
wrta "out.txt","-----------------------------"
continue:
add _bp_nub,1
//msg _bp_nub
wrta "out.txt","\r\n"
wrta "out.txt",_bp_nub
wrta "out.txt","-->"
wrta "out.txt",eip
run
jmp continue
OdbgScript腳本的功能是通過#INC導(dǎo)入bp_Func.txt執(zhí)行里面的bp指令,然后就不停執(zhí)行run指令,run相當(dāng)于F9,沒運(yùn)行一次記錄EIP的信息到out.txt中。當(dāng)然這里的2個(gè)txt文件需要在同一個(gè)目錄下。
好了,再用od載入ipMsg.exe,按工具欄上的”B”,顯示斷點(diǎn)信息。
插件--->OdbgScript--->運(yùn)行腳本,等上一會(huì)所有的斷點(diǎn)設(shè)置完畢后會(huì)彈出一個(gè)框顯示”斷點(diǎn)設(shè)置完畢!”
先不確認(rèn),也不要取消,那個(gè)框先放一邊
我們知道,window有消息驅(qū)動(dòng)機(jī)制,程序需要去處理消息循環(huán)這些代碼由開放工具幫我們實(shí)現(xiàn),找到那些函數(shù)先把那些斷點(diǎn)取消掉,要不然會(huì)一直在那個(gè)地方浪費(fèi)時(shí)間,Ctrl+N 找到這些函數(shù)PostMessage、PeekMessage、TranslateMessage,在這些函數(shù)上按回車找到調(diào)用的代碼,F2把這些地方的斷點(diǎn)取消掉。也可以在運(yùn)行到這些斷點(diǎn)的時(shí)候按F2。
現(xiàn)在點(diǎn)確認(rèn)運(yùn)行腳本,會(huì)看到,od在哪里像抽風(fēng)了一樣,有的地方會(huì)不停的執(zhí)行,通過剛才的方法處理消息的地方并沒有被完全排除掉,可以再按F2將一些反復(fù)執(zhí)行的斷點(diǎn)去掉。這里有個(gè)麻煩就是要不停的按F2,因?yàn)樘嗟牡胤皆O(shè)置了斷點(diǎn)。
過一段時(shí)間od就會(huì)穩(wěn)定下來,程序正常的運(yùn)行起來了。這個(gè)時(shí)候只有把鼠標(biāo)移到程序的圖標(biāo)會(huì)發(fā)現(xiàn)od又會(huì)瘋狂的中斷,這當(dāng)然還是消息循環(huán)啦,手動(dòng)刪除那些斷點(diǎn)。獲取焦點(diǎn)時(shí)od就沒有反應(yīng)了,如果你對(duì)獲取焦點(diǎn)的事件感興趣,可以關(guān)注這個(gè)地方,od有Run跟蹤的功能,打開它,獲取焦點(diǎn)時(shí)執(zhí)行的代碼就會(huì)被記錄下來。
下面簡(jiǎn)單分析一下這個(gè)程序的按鈕事件,我這里干擾的斷點(diǎn)基本上已經(jīng)去掉了,顯示界面,拖動(dòng)窗體,點(diǎn)擊窗體OD都不會(huì)有動(dòng)靜,附加中有我經(jīng)過篩選的斷點(diǎn)文件bp_Func.txt。
先打開OD的Run跟蹤,調(diào)試---->打開或清除Run跟蹤,查看--->Run跟蹤,確認(rèn)記錄是空的。切換到ipMsg的界面用戶列表里不用選任何人,直接點(diǎn)”發(fā)送”,回到OD 查看--->Run跟蹤,會(huì)發(fā)現(xiàn)幾條記錄,00411F6F就是發(fā)送按鈕的單擊事件。
0041200C |. FFD3 call ebx ; \IsDlgButtonChecked
//這里很顯然就是判斷界面上發(fā)送按鈕后面的復(fù)選框有沒有選上。
用通樣方法可以得到”關(guān)于”按鈕的單擊事件就,還有關(guān)于對(duì)話框上點(diǎn)擊顯示網(wǎng)頁(yè)那個(gè)按鈕,00409BF7 是打開網(wǎng)站的按鈕的事件,往下看我們知道 004210C4這個(gè)地址是存放網(wǎng)址的字符串。
好了,以上簡(jiǎn)單分析了一下,其他的各位自己實(shí)驗(yàn)吧。
有了這樣的方法我們便可不通過提示信息也能找到程序中的關(guān)鍵代碼。
5.29 補(bǔ)充,見16樓
上傳的附件:
瘋狂的斷點(diǎn).rar
(85.91kb,165次下載)
IPMSG2007.rar
(72.52kb,160次下載)
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的python代码执行过程记录_[原创]IDAPython+OdbgScript动态获取程序执行流程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基金认购超额等比例分配 新基金投资注意
- 下一篇: python小屋_Python小屋——P