ptrace頭文件 如何使用ptrace函數(shù)來獲得多線程的一致看法?
如何使用ptrace函數(shù)來獲得多線程的一致看法?有一天,我在Mac下調(diào)試了一個(gè)應(yīng)用程序。我剛掛了GDB,在網(wǎng)上找到的。似乎應(yīng)用程序添加了ptrace()函數(shù)來阻止調(diào)試。網(wǎng)上有一種突破的方法。加載程序后
如何使用ptrace函數(shù)來獲得多線程的一致看法?
有一天,我在Mac下調(diào)試了一個(gè)應(yīng)用程序。我剛掛了GDB,在網(wǎng)上找到的。似乎應(yīng)用程序添加了ptrace()函數(shù)來阻止調(diào)試。網(wǎng)上有一種突破的方法。加載程序后,在ptrace方法的頂部和底部斷點(diǎn)處中斷ptrace,然后運(yùn)行它。然后我將詳細(xì)介紹ptrace方法并查看堆棧。然后我將在這里輸入return并輸入C繼續(xù)運(yùn)行
您可以使用指針指向函數(shù),如下所示:
int func(int x)/*聲明函數(shù)*/
int(*f)(int x)/*聲明函數(shù)指針*/
f=func/*在Linux中將func函數(shù)的第一個(gè)地址分配給指針f,每當(dāng)進(jìn)程調(diào)用dlopen打開動(dòng)態(tài)鏈接庫時(shí),它都會(huì)相應(yīng)地維護(hù)進(jìn)程的一個(gè)鏈接,并在進(jìn)程中添加新加載庫地址空間的基本信息,然后更新符號。因此,只要遍歷鏈接找出要查找的項(xiàng)的地址范圍,就可以找到動(dòng)態(tài)庫的名稱,然后減去進(jìn)程加載的起始地址,得到動(dòng)態(tài)庫中的相對地址。這就是dladdr的原理。雖然工作中遇到的操作系統(tǒng)不是Linux,但是glibc的實(shí)現(xiàn)是相似的。因?yàn)樗乔度胧降?,所以更簡單。鏈接的第一個(gè)地址保存在老蘇而且這個(gè)鏈接也是一個(gè)記錄動(dòng)態(tài)庫信息的特殊結(jié)構(gòu),比Linux下的hodgepodge要簡單得多:)所以我用ptrace直接掛載目標(biāo)進(jìn)程,peek保存鏈接第一個(gè)地址的數(shù)據(jù)更方便,然后一個(gè)接一個(gè)地查詢~~~這樣我就不用再擔(dān)心了我已經(jīng)厭倦了遠(yuǎn)程調(diào)試。找到相對地址后,我直接使用GDB中的Infoline,