www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]逆向,是安全領(lǐng)域必備的技能之一。但凡有編程經(jīng)驗(yàn)的人都應(yīng)該熟知高級(jí)語言源代碼從編譯鏈接到執(zhí)行的過程,逆向就是把這個(gè)過程反了過來,反病毒人員捕獲到樣本,需要對(duì)其逆向才能分析出該樣本的行為,才能開發(fā)出有效的專殺工具。

逆向,是安全領(lǐng)域必備的技能之一。但凡有編程經(jīng)驗(yàn)的人都應(yīng)該熟知高級(jí)語言源代碼從編譯鏈接到執(zhí)行的過程,逆向就是把這個(gè)過程反了過來,反病毒人員捕獲到樣本,需要對(duì)其逆向才能分析出該樣本的行為,才能開發(fā)出有效的專殺工具。

在開始真正接觸逆向之前,首先要具備一些匯編的基礎(chǔ)知識(shí),之所以說匯編的基礎(chǔ)知識(shí),是說搞逆向沒有必要精通匯編,因?yàn)椴⒉皇且笪覀兂蔀閰R編程序員;學(xué)習(xí)匯編的道路晦澀難懂,最好的方式是在學(xué)習(xí)逆向破解的過程中去根據(jù)實(shí)際需要去學(xué)習(xí),那么本文主要介紹的是逆向基礎(chǔ)的寄存器和內(nèi)存方面的信息,首先介紹的是逆向主要是做什么的,其次對(duì)編程和機(jī)器架構(gòu)做了個(gè)簡介,最后詳細(xì)的闡述了逆向基礎(chǔ)的寄存器和內(nèi)存。

逆向主要是做什么的

1、逆向分析已經(jīng)編譯好的軟件,然后使用高級(jí)語言重現(xiàn),可以模仿已有的比較好的軟件,供自己創(chuàng)業(yè)使用。

2、用于分析病毒,提取出特征碼,便于開發(fā)殺毒程序。

3、高級(jí)代碼審計(jì),在匯編層面調(diào)試程序,寫出來的代碼更加安全。

4、外掛,游戲的外掛就是這樣產(chǎn)生的,具體就不詳細(xì)介紹的,畢竟不是光彩的事。

5、分析嵌入式設(shè)備中的漏洞。

6、開發(fā)嵌入式設(shè)備的軟件。

匯編語言的位置

為什么要學(xué)習(xí)匯編語言呢?就像學(xué)習(xí)美國文化要先懂英語一樣,如果不了解計(jì)算機(jī)的語言,又何談懂計(jì)算機(jī)呢?我們知道,計(jì)算機(jī)執(zhí)行的語言,或者稱之為命令序列或數(shù)據(jù),都是以“1和0”的二進(jìn)制語言,物理上則表現(xiàn)為電信號(hào)的高低電平。雖然我們現(xiàn)在有C/C++、Java、Python等一系列強(qiáng)大的高級(jí)語言,但是其真正落實(shí)到計(jì)算機(jī)的執(zhí)行時(shí)還是需要編譯或解釋成計(jì)算機(jī)懂的機(jī)器語言。最早的時(shí)候計(jì)算機(jī)編程就是在紙帶上打孔表示1或0,以此作為編程指令,不僅難于操作,而且很難查錯(cuò),記憶也很困難。于是人們發(fā)明了機(jī)器語言的“人性化”表示:匯編語言(Assembly language),每條匯編指令都對(duì)應(yīng)著一條機(jī)器二進(jìn)制串,但是卻更加容易理解和記憶:

雖然我們現(xiàn)在有許多的高級(jí)語言可以用來編程,但是如果想真的理解代碼執(zhí)行的實(shí)際過程,還是需要我們?nèi)ザ﹨R編語言,從本質(zhì)上理解機(jī)器的行為。因此當(dāng)今IT的各位童鞋們學(xué)習(xí)匯編語言還是十分重要的,逆向就更不用說了。

機(jī)器架構(gòu)

計(jì)算機(jī)的核心是CPU,負(fù)責(zé)各種運(yùn)算,其中又包括運(yùn)算器和寄存器,寄存器中也用來存儲(chǔ)數(shù)據(jù),但是一般較小,讀寫速度快,是運(yùn)算器直接操作的對(duì)象;CPU之外有存儲(chǔ)器,存儲(chǔ)器一般指內(nèi)存,分為可讀寫的RAM和只可讀的ROM;其余各種外設(shè)比如顯卡、網(wǎng)卡等都通過主板上的總線與CPU相連,CPU通過總線同存儲(chǔ)器以及各種外設(shè)中的芯片(進(jìn)而同外設(shè)中的存儲(chǔ)器)進(jìn)行數(shù)據(jù)通信。

存儲(chǔ)器按字節(jié)大小分為存儲(chǔ)單元,例如一個(gè)字節(jié)是一個(gè)存儲(chǔ)單元。CPU訪問存儲(chǔ)器時(shí)必須完成三件任務(wù):1. 存儲(chǔ)單元的地址(地址信息);2. 器件的選擇,讀或?qū)懙拿?控制信息);3. 讀或?qū)懙臄?shù)據(jù)(數(shù)據(jù)信息);因此,CPU同各種存儲(chǔ)器之間自然而然存在三種總線:地址總線、控制總線與數(shù)據(jù)總線。

控制總線決定了命令的種類,數(shù)據(jù)總線決定了一次處理的數(shù)據(jù)最大位數(shù),8位數(shù)據(jù)總線處理16位數(shù)據(jù)時(shí)要分兩次進(jìn)行,而16位數(shù)據(jù)總線一次就能解決問題。地址總線則決定了CPU的尋址能力,即內(nèi)存的大小,比如8位的地址總線最大只有256個(gè)單元,即256字節(jié),而32位的地址總線最多有2的32次冪bit,即4GB,這也是x86最多支持4G內(nèi)存的原因。

既然說到了4G內(nèi)存的由來,那么就可以趁熱打鐵說說內(nèi)存地址空間了,CPU認(rèn)識(shí)的每個(gè)存儲(chǔ)單元默認(rèn)為1字節(jié),因此可以定位的所有內(nèi)存單元最大就是2的N次冪,N為地址總線長度,因此這個(gè)內(nèi)存地址也就構(gòu)成了計(jì)算機(jī)的內(nèi)存地址空間,即所有可讀寫的存儲(chǔ)器單元必須在這其中,否則就無法為CPU所定位檢索。一般的架構(gòu)是這樣的:

這里0x9ffff是655539,0xbffff是786431,0xfffff是1048575,這樣認(rèn)識(shí)的會(huì)更清楚些(感謝Python的計(jì)算機(jī)功能,果然方便)。主存儲(chǔ)器地址空間即內(nèi)存,如果直接操作這個(gè)地址空間內(nèi)的數(shù)據(jù),效果就是直接讀寫內(nèi)存數(shù)據(jù);顯存地址空間指的的是顯存中的RAM部分。

逆向基礎(chǔ)之寄存器和內(nèi)存

CPU中的主要結(jié)構(gòu)是運(yùn)算器、控制器與寄存器,這些器件通過CPU的內(nèi)部總線相連,其中運(yùn)算器負(fù)責(zé)信息處理,寄存器負(fù)責(zé)信息存儲(chǔ),控制器控制各種器件進(jìn)行工作,內(nèi)部總線連接各種器件,在它們之間進(jìn)行數(shù)據(jù)的傳送。對(duì)于匯編程序員來說,主要部件是寄存器,因?yàn)橹挥屑拇嫫魇俏覀兛梢跃幊讨苯硬僮鞯摹2煌腃PU架構(gòu)不同,8086CPU共有14個(gè)寄存器,分別是AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW,今天我們先來學(xué)習(xí)基礎(chǔ)的通用寄存器,其余的寄存器在用到時(shí)會(huì)給予說明。

一、通用寄存器

AX、BX、CX和DX是四個(gè)通用寄存器,通常用來存放一般性的數(shù)據(jù),后面的分析都在8086CPU中進(jìn)行。每個(gè)通用寄存器是16位,即一次可以處理一個(gè)字(2個(gè)字節(jié))的數(shù)據(jù),但是為了與8086CPU之前的CPU相容,也支持一個(gè)字節(jié)的寄存器,即AH與AL,類似的還有BH和BL等,CPU操作時(shí)會(huì)降A(chǔ)H和AL當(dāng)作獨(dú)立的寄存器,運(yùn)算進(jìn)位時(shí)會(huì)直接丟棄,因?yàn)镃PU認(rèn)為只有一個(gè)8位的寄存器而已:

二、物理地址

CPU訪問內(nèi)存需要知曉存儲(chǔ)單元的地址,由于8086CPU地址總線為20位,但是寄存器卻只有16位,即一次處理的地址最多只有2的16次冪,遠(yuǎn)小于2的20次冪。為了彌補(bǔ)這個(gè)問題,8086CPU采用了一種特殊的方式通過16位的寄存器來構(gòu)造20位的訪問地址,簡單來說,即:段地址*16+偏移地址。從計(jì)算的位數(shù)上來說,段地址和偏移地址存儲(chǔ)在CPU寄存器中,都是16位的;段地址*16,即整體在右邊添加4個(gè)二進(jìn)制位,成為了20位;20位與16位相加,得到了20位的實(shí)際內(nèi)存地址。這里雖然是8086CPU中的方法,但是其實(shí)確實(shí)現(xiàn)在所有CPU中的實(shí)際尋址算法,即一個(gè)基地址加上一個(gè)偏移量得到一個(gè)實(shí)際地址。由此我們可以得到段的概念,內(nèi)存本身不分段,但是由于CPU的特殊尋址方式,我們可以將內(nèi)存看作最大64KB的一個(gè)個(gè)段(16位的最大值正好是64KB),因此我們可以在匯編中人為的指定段的起始和結(jié)束。當(dāng)然,這里的段地址和偏移量實(shí)際上存儲(chǔ)在CPU的寄存器中,比如獲取指令的CS:IP,其中CS為代碼段寄存器,其中存儲(chǔ)代碼段的基地址,IP寄存器則存儲(chǔ)著當(dāng)前要執(zhí)行的指令的指針,即一個(gè)偏移量,因此CS:IP指定了接下來CPU要執(zhí)行的指令的位置。這里需要說明的是,內(nèi)存中的數(shù)據(jù)對(duì)于CPU來說都是二進(jìn)制位,能夠區(qū)分?jǐn)?shù)據(jù)和指令的唯一標(biāo)準(zhǔn)就是指令曾經(jīng)或者正在被CS:IP指定;每執(zhí)行完一條指令,IP會(huì)累加上條指令的長度,從而指向下調(diào)指令。

我們是否可以修改控制CS:IP的值呢?答案是肯定的,只不過我們不能使用mov等傳送指令,而應(yīng)當(dāng)使用jmp這類轉(zhuǎn)移指令,基本的用法是:

-1. 修改CS:IP: jmp 2AE3:3 執(zhí)行后:CS=2AE3H, IP=0003H;

-2. 僅修改IP:jmp ax(ie. move ip, ax)即用寄存器中的值修改IP;

三、內(nèi)存訪問

CPU訪問內(nèi)存除了獲取指令,還要獲取數(shù)據(jù),那么數(shù)據(jù)部分如何定位的呢?同指令的CS:IP一樣,8086CPU使用DS:[。。。]來獲取內(nèi)存數(shù)據(jù)地址,其中段寄存器存儲(chǔ)內(nèi)存數(shù)據(jù)段的基地址,而[。。。]表示一個(gè)內(nèi)存偏移量指向的內(nèi)存單元,如[0]表示偏移量為0的內(nèi)存單元,這里使用時(shí)要注意,8086CPU不支持直接對(duì)DS傳送值,因此mov ds, 1000H是非法的,正確地是通過寄存器來實(shí)現(xiàn),即:mov ax, 1000H; mov ds, ax;

這部分我們要學(xué)習(xí)基本的匯編指令,如mov、sub、add等,都可以操作寄存器,操作完之后將數(shù)據(jù)放入第一個(gè)參數(shù)表示的寄存器中。CPU中的內(nèi)存數(shù)據(jù)一種特殊的結(jié)果就是棧,即只能從一端讀寫數(shù)據(jù)的結(jié)構(gòu),其基本指令是push ax;將寄存器ax的值入棧;和pop ax;從棧中取出棧頂元素放入寄存器ax中;下面是movaddsub命令的一個(gè)簡單示例:

然后我們來看看PUSH命令的執(zhí)行過程:

然后是POP命令:

可以看出,棧的操作關(guān)鍵是棧頂位置的確定,因此CPU專門使用SS:SP來獲取當(dāng)前內(nèi)存中棧頂?shù)奈恢?。值得一提的是,CPU本身并沒有對(duì)棧的大小進(jìn)行檢查,因此實(shí)際中會(huì)出現(xiàn)棧頂越界的問題(上限超出-PUSH;下限超出-POP),這也就要求我們必須人為進(jìn)行檢查,否則就會(huì)出現(xiàn)程序的漏洞。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉