国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

聊一聊 .NET高級調(diào)試 中必知的符號表

這篇具有很好參考價值的文章主要介紹了聊一聊 .NET高級調(diào)試 中必知的符號表。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

一:背景

1. 講故事

在高級調(diào)試的旅行中,發(fā)現(xiàn)有不少人對符號表不是很清楚,其實(shí)簡而言之符號表中記錄著一些程序的生物特征,比如哪個地址是函數(shù)(簽名信息),哪個地址是全局變量,靜態(tài)變量,行號是多少,數(shù)據(jù)類型是什么 等等,目的就是輔助我們可視化的調(diào)試,如果沒有這些輔助我們看到的都是一些無意義的匯編代碼,逆向起來會非常困難,這一篇我們就來系統(tǒng)的聊一聊。

二:程序編譯的四個階段

1. 案例代碼

要想理解符號表,首先需要理解 代碼文件 是如何變成 可執(zhí)行文件 的,即如下的四個階段。

  • 預(yù)處理階段
  • 編譯階段
  • 匯編階段
  • 鏈接階段

為了能夠看到每一個階段,用 gcc 的相關(guān)命令手工推進(jìn),并用 chatgpt 寫一段測試代碼,包含全局變量,靜態(tài)變量,函數(shù)等信息。


#include <stdio.h>
#define PI 3.1415926

int global_var = 10;

void func() {

    static int static_var = 5;

    printf("global_var = %d, static_var = %d PI=%f\n", global_var, static_var,PI);

    global_var++;
    static_var++;
}

int main() {
    func();
    func();

    return 0;
}

接下來用 gcc --help 命令查看下需要使用的命令列表。


[root@localhost data]# gcc --help
Usage: gcc [options] file...
Options:
  -E                       Preprocess only; do not compile, assemble or link
  -S                       Compile only; do not assemble or link
  -c                       Compile and assemble, but do not link
  -o <file>                Place the output into <file>
  ...

2. 預(yù)編譯階段

預(yù)處理主要做的就是代碼整合,比如將 #include 文件導(dǎo)入,將 #define 宏替換等等,接下來使用 gcc -E 進(jìn)行預(yù)處理。


[root@localhost data]# gcc main.c -E -o main.i
[root@localhost data]# ls
main.c  main.i

聊一聊 .NET高級調(diào)試 中必知的符號表

可以看到這個 main.c 文件已經(jīng)膨脹到了 858 行了。

3. 編譯階段

前面階段是把代碼預(yù)處理好,接下來就是將C代碼編譯成匯編代碼了,使用 gcc -S 即可。


[root@localhost data]# gcc main.c -S -o main.s -masm=intel
[root@localhost data]# ls
main.c  main.i  main.s

聊一聊 .NET高級調(diào)試 中必知的符號表

從圖中可以看到匯編代碼中也有很多輔助信息,比如 global_var 是一個 @object 變量,類型為 int,在 .rodata 只讀數(shù)據(jù)段中,目的就是給匯編階段打輔助。

4. 匯編階段

有了匯編代碼之后,接下來就是將 匯編代碼 轉(zhuǎn)成 機(jī)器代碼,這個階段會產(chǎn)生二進(jìn)制文件,并且會構(gòu)建 section 信息以及符號表信息,可以使用 gcc -c 即可。


[root@localhost data]# gcc main.c -c -o main.o -masm=intel
[root@localhost data]# ls
main.c  main.i  main.o  main.s

二進(jìn)制文件模式默認(rèn)是不能可視化打開的,可以借助于 objdump 工具。


[root@localhost data]# objdump
  -h, --[section-]headers  Display the contents of the section headers
  -t, --syms               Display the contents of the symbol table(s)

[root@localhost data]# objdump -t main.o

main.o:     file format elf64-x86-64

SYMBOL TABLE:
0000000000000000 l    df *ABS*	0000000000000000 main.c
0000000000000000 l    d  .text	0000000000000000 .text
0000000000000000 l    d  .data	0000000000000000 .data
0000000000000000 l    d  .bss	0000000000000000 .bss
0000000000000000 l    d  .rodata	0000000000000000 .rodata
0000000000000004 l     O .data	0000000000000004 static_var.2179
0000000000000000 l    d  .note.GNU-stack	0000000000000000 .note.GNU-stack
0000000000000000 l    d  .eh_frame	0000000000000000 .eh_frame
0000000000000000 l    d  .comment	0000000000000000 .comment
0000000000000000 g     O .data	0000000000000004 global_var
0000000000000000 g     F .text	0000000000000058 func
0000000000000000         *UND*	0000000000000000 printf
0000000000000058 g     F .text	000000000000001f main

在上面的符號表中看到了 func函數(shù)以及 static_varglobal_var 以及所屬的 section。

5. 鏈接階段

這個階段主要是將多個二進(jìn)制代碼文件進(jìn)一步整合變成可在操作系統(tǒng)上運(yùn)行的可執(zhí)行文件,可以使用 gcc -o 。


[root@localhost data]# gcc main.c -o main
[root@localhost data]# ls
main  main.c  main.i  main.o  main.s
[root@localhost data]# ./main
global_var = 10, static_var = 5 PI=3.141593
global_var = 11, static_var = 6 PI=3.141593
[root@localhost data]# objdump -t main

main:     file format elf64-x86-64

SYMBOL TABLE:
...
0000000000601034 g     O .data	0000000000000004              global_var
0000000000601034 g     O .data	0000000000000004              global_var
...
000000000040052d g     F .text	0000000000000058              func
...

相比匯編階段,這個階段的 符號表 中的第一列都是有地址值的,是相對模塊的偏移值,比如說: module+0x000000000040052d 標(biāo)記的是 func 函數(shù)。

上面是 linux 上的可執(zhí)行文件的符號表信息,有些朋友說我是 windows 平臺上的,怎么看符號表信息呢?

三:Windows 上的 pdb 解析

1. 觀察 pdb 文件

上一節(jié)我們看到的是 linux 上 elf格式 的可執(zhí)行文件,這一節(jié)看下 windows 平臺上的PE文件 的符號表信息是什么樣的呢?有了前面四階段編譯的理論基礎(chǔ),再聊就比較簡單了。

在 windows 平臺上 符號表信息 是藏在 pdb 文件中的,這種拆開的方式是有很大好處的,如果需要調(diào)試代碼,windbg 會自動加載 pdb 文件,無調(diào)試的情況下就不需要加載 pdb 了,減少了可執(zhí)行文件的大小,也提升了性能。

接下來用 SymView.exe 這種工具去打開 pdb 文件,截圖如下:

聊一聊 .NET高級調(diào)試 中必知的符號表

從圖中可以看到,符號表信息高達(dá) 10968 個,并且 func 函數(shù)的入口地址是在 module +0x11870 處,相當(dāng)于做了一個標(biāo)記,接下來我們拿這個func做一個測試。

2. 有 pdb 的 func 函數(shù)

首先說一下為什么通過 exe 可以找到 pdb,這是因?yàn)?PE 頭的 DIRECTORY_ENTRY_DEBUG 節(jié)中記錄了 pdb 的地址。

聊一聊 .NET高級調(diào)試 中必知的符號表

只要這個路徑有 pdb 就可以在 windbg 運(yùn)行中按需加載了,然后通過 u MySample.exe+0x11870 觀察,截圖如下:

聊一聊 .NET高級調(diào)試 中必知的符號表

圖中顯示的非常清楚,地址 00fd1870 就是 func 的入口地址,讓一個無意義的地址馬上有意義起來了,哈哈~~~

3. 無 pdb 的 func 函數(shù)

這一小節(jié)是提供給好奇的朋友的,如果沒有 pdb,那匯編上又是一個什么模樣,為了找到 func 的入口地址,我們內(nèi)嵌一個 int 3 ,然后把 pdb 給刪掉,代碼如下:


int main() {

	__asm {
		int 3;
	}
	func();
	func();

	return 0;
}

聊一聊 .NET高級調(diào)試 中必知的符號表

從圖中可以看到,func 標(biāo)記已經(jīng)沒有了,取而代之的都是 module+0xxx,這就會給我們逆向調(diào)試帶來巨大的障礙。

三: 總結(jié)

總而言之,符號表就是對茫茫內(nèi)存進(jìn)行標(biāo)記,就像百度地圖一樣,讓我們知道某個經(jīng)緯度上有什么建筑,讓無情的地理坐標(biāo)更加有溫度,讓世界更美好。文章來源地址http://www.zghlxwxcb.cn/news/detail-750747.html

聊一聊 .NET高級調(diào)試 中必知的符號表

到了這里,關(guān)于聊一聊 .NET高級調(diào)試 中必知的符號表的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 聊一聊 tcp/ip 在.NET故障分析的重要性

    聊一聊 tcp/ip 在.NET故障分析的重要性

    這段時間分析了幾個和網(wǎng)絡(luò)故障有關(guān)的 .NET程序 之后,真的越來越體會到計(jì)算機(jī)基礎(chǔ)課的重要,比如 計(jì)算機(jī)網(wǎng)絡(luò) 課,如果沒有對 tcpip協(xié)議 的深刻理解,解決這些問題真的很難,因?yàn)槟阒荒茉诟邔幼龊诤袦y試,你無法看到 tcp 層面的握手和psh通訊。 這篇我們通過兩個小例子來

    2024年02月05日
    瀏覽(16)
  • 安全從業(yè)人員必知的法律法規(guī)解讀

    目錄 一、我國法律體系及主要監(jiān)管機(jī)構(gòu) 二、《網(wǎng)絡(luò)安全法》相關(guān)解讀

    2024年02月14日
    瀏覽(19)
  • 網(wǎng)絡(luò)安全工程師必知的WEB知識

    作為一名網(wǎng)絡(luò)安全工程師,尤其是WEB滲透測試工程師,必須掌握一些WEB相關(guān)的基礎(chǔ)知識,下面重點(diǎn)從WEB服務(wù)架構(gòu)、瀏覽器請求過程、服務(wù)器操作系統(tǒng)、WEB應(yīng)用服務(wù)器、數(shù)據(jù)庫系統(tǒng)、動態(tài)網(wǎng)站腳本語言、WEB前端框架等。 Web服務(wù)架構(gòu) Web服務(wù)主要分為C/S架構(gòu)和B/S架構(gòu)。下面做一下

    2024年02月04日
    瀏覽(17)
  • 后端開發(fā)必知的11個線程安全小技巧

    后端開發(fā)必知的11個線程安全小技巧

    ? 對于從事后端開發(fā)的同學(xué)來說,線程安全問題是我們每天都需要考慮的問題。 ? 線程安全問題通俗地講主要是在多線程的環(huán)境下,不同線程同時讀和寫公共資源(臨界資源)導(dǎo)致的數(shù)據(jù)異常問題。 ? 比如:變量a=0,線程1給該變量+1,線程2也給該變量+1。此時,線程3獲取

    2024年02月15日
    瀏覽(21)
  • 測試人員必知的軟件測試文檔有哪些?

    測試人員必知的軟件測試文檔有哪些? 軟件測試文檔一般是提供測試信息的一組文檔,可以是測試人員的工具,也可以是項(xiàng)目開發(fā)團(tuán)隊(duì)的開發(fā)輔助工具。 一般情況下,項(xiàng)目相關(guān)的測試文檔主要有以下幾個 : 1.測試計(jì)劃 。測試計(jì)劃由測試小組編寫完成后,需同項(xiàng)目中相關(guān)人員

    2024年02月04日
    瀏覽(23)
  • 聊一聊 TLS/SSL

    聊一聊 TLS/SSL

    哈嘍大家好,我是咸魚 當(dāng)我們在上網(wǎng)沖浪的時候,會在瀏覽器界面頂部看到一個小鎖標(biāo)志,或者網(wǎng)址以 \\\"https://\\\" 開頭 這意味著我們正在使用 TLS/SSL 協(xié)議進(jìn)行安全通信。雖然它可能看起來只是一個小小的鎖圖標(biāo)和一個 “https” ,但實(shí)際上,這個協(xié)議在保護(hù)我們的在線隱私和安

    2024年02月08日
    瀏覽(30)
  • 聊一聊大模型

    事情還得從ChatGPT說起。 2022年12月OpenAI發(fā)布了自然語言生成模型ChatGPT,一個可以基于用戶輸入文本自動生成回答的人工智能體。它有著趕超人類的自然對話程度以及逆天的學(xué)識。一時間引爆了整個人工智能界,各大巨頭也紛紛跟進(jìn)發(fā)布了自家的大模型,如:百度-文心一言、科

    2024年02月05日
    瀏覽(32)
  • 聊一聊synchronized

    在 Java 中, synchronized 可以用于實(shí)現(xiàn)線程同步,有以下幾種常見的使用方式: 修飾代碼塊:將 synchronized 放在代碼塊的前面, 例如: 在這種方式下,會為給定的對象 obj 獲取鎖,在代碼塊執(zhí)行期間,只有持有該鎖的線程才能進(jìn)入代碼塊執(zhí)行。 修飾方法:將 sync

    2024年01月22日
    瀏覽(27)
  • 聊一聊AIGC

    聊一聊AIGC

    “UGC不存在了”——借鑒自《三體》 ChatGPT 的橫空出世將一個全新的概念推上風(fēng)口——AIGC( AI Generated Content)。 GC即創(chuàng)作內(nèi)容(Generated Content),和傳統(tǒng)的UGC、PGC,OGC不同的是,AIGC的創(chuàng)作主體由人變成了人工智能。 xGC PGC:Professionally Generated Content,專業(yè)生產(chǎn)內(nèi)容 UGC:User G

    2024年02月10日
    瀏覽(23)
  • 聊一聊模板方法模式

    聊一聊模板方法模式

    統(tǒng)一抽取,制定規(guī)范; 模板方法模式,又叫模板模式,屬于23種設(shè)計(jì)模式中的 行為型模式 。在抽象類中公開定義了執(zhí)行的方法,子類可以按需重寫其方法,但是要以抽象類中定義的方式調(diào)用方法。總結(jié)起來就是: 定義一個操作的算法結(jié)構(gòu),而將一些步驟延遲到子類中。在不

    2024年02月04日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包