ptrace頭文件 如何使用ptrace函數(shù)來(lái)獲得多線程的一致看法?
如何使用ptrace函數(shù)來(lái)獲得多線程的一致看法?有一天,我在Mac下調(diào)試了一個(gè)應(yīng)用程序。我剛掛了GDB,在網(wǎng)上找到的。似乎應(yīng)用程序添加了ptrace()函數(shù)來(lái)阻止調(diào)試。網(wǎng)上有一種突破的方法。加載程序后
如何使用ptrace函數(shù)來(lái)獲得多線程的一致看法?
有一天,我在Mac下調(diào)試了一個(gè)應(yīng)用程序。我剛掛了GDB,在網(wǎng)上找到的。似乎應(yīng)用程序添加了ptrace()函數(shù)來(lái)阻止調(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打開(kāi)動(dòng)態(tài)鏈接庫(kù)時(shí),它都會(huì)相應(yīng)地維護(hù)進(jìn)程的一個(gè)鏈接,并在進(jìn)程中添加新加載庫(kù)地址空間的基本信息,然后更新符號(hào)。因此,只要遍歷鏈接找出要查找的項(xiàng)的地址范圍,就可以找到動(dòng)態(tài)庫(kù)的名稱,然后減去進(jìn)程加載的起始地址,得到動(dòng)態(tài)庫(kù)中的相對(duì)地址。這就是dladdr的原理。雖然工作中遇到的操作系統(tǒng)不是Linux,但是glibc的實(shí)現(xiàn)是相似的。因?yàn)樗乔度胧降?,所以更?jiǎn)單。鏈接的第一個(gè)地址保存在老蘇而且這個(gè)鏈接也是一個(gè)記錄動(dòng)態(tài)庫(kù)信息的特殊結(jié)構(gòu),比Linux下的hodgepodge要簡(jiǎn)單得多:)所以我用ptrace直接掛載目標(biāo)進(jìn)程,peek保存鏈接第一個(gè)地址的數(shù)據(jù)更方便,然后一個(gè)接一個(gè)地查詢~~~這樣我就不用再擔(dān)心了我已經(jīng)厭倦了遠(yuǎn)程調(diào)試。找到相對(duì)地址后,我直接使用GDB中的Infoline,