亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(biāo)題: 匯編語言(長(zhǎng)了一點(diǎn),想了解的慢慢看) [打印本頁(yè)]

作者: 51黑tt    時(shí)間: 2016-3-6 00:18
標(biāo)題: 匯編語言(長(zhǎng)了一點(diǎn),想了解的慢慢看)
本帖最后由 51黑tt 于 2016-3-6 00:22 編輯

我們前面提到匯編語言是破解的基礎(chǔ),這里我們簡(jiǎn)單介紹一些匯編的知識(shí):
匯編語言用一些助記符來代替0和1的多種組合,也就是各個(gè)指令,這樣的話,從一定程度上來說,比機(jī)器語言方便了許多,但是,匯編也同樣不方便,同樣寫起來不方便,而且后期維護(hù)同樣不方便,再加上人們慢慢地需要寫一些更大的程序,在這樣的情況下,高級(jí)語言就被人發(fā)明了出來,就是我們今天用的Basic、pascal、C、C++等等等等,這些語言的出現(xiàn),一下了使程序的開發(fā)難度大大減低了,以前用匯編要很長(zhǎng)時(shí)間才能開發(fā)出來的程序,現(xiàn)在只需要很短的時(shí)間且很輕松的就可以完成了,但是匯編還是有它先天的優(yōu)勢(shì)的,因?yàn)槠渑cCPU內(nèi)部的指令一一對(duì)應(yīng),所以在一些特殊的場(chǎng)合,必須由匯編來實(shí)現(xiàn),比如訪問硬件的端口、寫病毒等等。而且生成的可執(zhí)行文件效率巨高,且生成的可執(zhí)行文件很小,寫小程序是很方便的,而且用匯編寫注冊(cè)機(jī),是件很輕松的事。
我們知道計(jì)算機(jī)只識(shí)別0和1,那么,所有存儲(chǔ)在計(jì)算機(jī)上的文件,也都是以二進(jìn)制的形式存放的,當(dāng)然也包括可執(zhí)行文件了。 所以,我們只要找一個(gè)十六進(jìn)制編輯器比如Ultra Edit什么的,就可直接打開并查看可執(zhí)行文件了,當(dāng)然,其中就包括可執(zhí)行文件的代碼了。但是這些東西看起來很難看明白,但是我們可以利用相應(yīng)的軟件,可以將這些十六進(jìn)制數(shù)值轉(zhuǎn)換為相應(yīng)的匯編代碼,這樣的話,我們就可以對(duì)別人的軟件進(jìn)行分析了。這就是所謂的逆向分析了。


所以,如果我們找到軟件計(jì)算注冊(cè)碼的部分,并對(duì)其進(jìn)行分析,弄懂它的計(jì)算方法,那么我們就破解成功了。當(dāng)然,你也可以將此計(jì)算過程還原為任意一個(gè)你所熟悉的編程語言,那么,編譯后的這個(gè)程序,就叫做注冊(cè)機(jī),它的功能就是計(jì)算某一特定軟件的注冊(cè)碼。


上面提到的分析方法,就是所謂的靜態(tài)分析,此類分析常用的工具有W32DASM、IDA和HIEW等。靜態(tài)分析,顧名思義,就是只通過查看軟件的反匯編代碼來對(duì)軟件進(jìn)行分析。一般如果只是想暴破軟件,只進(jìn)行靜態(tài)分析就夠了。但要想真正的弄清注冊(cè)算法,一般還是要進(jìn)行動(dòng)態(tài)分析的,即能過調(diào)試器來一邊執(zhí)行程序一邊進(jìn)行分析。


我們?cè)賮砜纯碈PU的構(gòu)成,CPU的任務(wù)就是執(zhí)行存放在存儲(chǔ)器里的指令序列。為此,除要完成算術(shù)邏輯操作外,還需要擔(dān)負(fù)CPU和存儲(chǔ)器以及I/O之間的數(shù)據(jù)傳送任務(wù)。早期的CPU芯片只包括運(yùn)算器和控制器兩大部分。到了后來,為了使存儲(chǔ)器速度能更好地與運(yùn)算器的速度相匹配,又在芯片中引入了高速緩沖存儲(chǔ)器。除了高速緩沖存儲(chǔ)器之外的組成,


大體上可以分為3個(gè)部分:


1.算術(shù)邏輯部件ALU(arithmetic logic unit)用來進(jìn)行算術(shù)和邏輯運(yùn)算。這部分與我們的關(guān)系不太大,我們沒必要管它。
2.控制邏輯。同樣與我們的關(guān)系不大。

3.這個(gè)才是最最重要的。工作寄存器,它在計(jì)算機(jī)中起著重要的作用,每一個(gè)寄存器相當(dāng)于運(yùn)算器中的一個(gè)存儲(chǔ)單元,但它的存取速度卻賊快賊快,比存儲(chǔ)器要快很多了。它用來存放計(jì)算過程中所需要的或所得到的各種信息,包括操作數(shù)地址、操作數(shù)及運(yùn)算的中間結(jié)果等。下面我們專門的介紹這些寄存器。

在介紹之前,有必要說點(diǎn)兒基礎(chǔ)性的知識(shí)。現(xiàn)在的寄存器一般是32位的,在CPU中,一個(gè)二進(jìn)制位被看作是一位,八位就是一個(gè)字節(jié),在內(nèi)存中,就是以字節(jié)為單位來在存儲(chǔ)信息的,每一個(gè)字節(jié)單元給以一唯一的存儲(chǔ)器地址,稱為物理地址,到時(shí)候訪問相應(yīng)的內(nèi)存,就是通過這個(gè)地址。八個(gè)二進(jìn)制位都能表達(dá)些什么呢?可以表達(dá)所有的ASCII碼,也就是說一個(gè)內(nèi)存單元可以存儲(chǔ)一個(gè)英文字符或數(shù)字什么的,而中文要用Unicode碼來表示,也就是說兩個(gè)內(nèi)存單元,才能裝一個(gè)漢字。十六位就是兩個(gè)字節(jié)這不難理解吧,當(dāng)然,也有三十二位六十四位的,三十二位叫做雙字,六十四位就叫做四字。 63/a 0Yn  
首先,介紹通用寄存器。 一共八個(gè),分別是EAX、EBX、ECX、EDX、ESP、EBP、EDI、ESI。 其中,EAX—EDX這四個(gè)寄存器又可稱為數(shù)據(jù)寄存器,你除了直接訪問外,還可分別對(duì)其高十六位和低十六位進(jìn)行訪問。它們的低十六位就是把它們前邊兒的E去掉,即EAX的低十六位就是AX。而且它們的低十六位又可以分別進(jìn)行八位訪問,也就是說,AX還可以再進(jìn)行分解,即AX還可分為AH(高八位)AL(低八位)。其它三個(gè)寄存器請(qǐng)自行推斷。這樣的話,你就可以應(yīng)付各種情況,如果你想操作的是一個(gè)八位數(shù)據(jù),那么可以用 MOV AL (八位數(shù)據(jù))或MOV AH (八位數(shù)據(jù)),如果你要操作的是一個(gè)十六位數(shù)據(jù),可以用MOV AX (十六位數(shù)據(jù))三十二位的話,就用MOV EAX (三十二位數(shù)據(jù))。這四個(gè)寄存器,主要就是用來暫時(shí)存放計(jì)算過程中所用的操作數(shù)、結(jié)果或其它信息。 而ESP、EBP、EDI、ESI這四個(gè)呢,就只能用字來訪問,它們的主要用途就是在存儲(chǔ)器尋址時(shí),提供偏移地址。因此,它們可以稱為指針或變址寄存器。這就是說此時(shí)EBX中裝的是一個(gè)內(nèi)存地址,而真正要訪問的,就是那那個(gè)內(nèi)存單元中所存儲(chǔ)的值。在這幾個(gè)寄存器中,ESP稱為堆棧指針寄存。堆棧是一個(gè)很重要的概念,它是以“后進(jìn)先出“方式工作的一個(gè)存儲(chǔ)區(qū),它必須存在于堆棧段中,因而其段地址存放于SS寄存器中。它只有一個(gè)出入口,所以只有一個(gè)堆棧指針寄存器。ESP的內(nèi)容在任何時(shí)候都指向當(dāng)前的棧頂。堆棧時(shí)候,它的基址開始于一個(gè)高地址,然后每當(dāng)有數(shù)據(jù)入棧,它就向低地址的方向進(jìn)行存儲(chǔ)。相應(yīng)的入棧指令是PUSH。每當(dāng)有數(shù)據(jù)入棧,ESP就跟著改變,總之,它永遠(yuǎn)指向最后一個(gè)壓入棧的數(shù)據(jù)。之后,如果要用壓入堆棧的數(shù)據(jù),就用出棧指令將其取出。相應(yīng)的指令是POP,POP指令執(zhí)行后,ESP會(huì)加上相應(yīng)的數(shù)據(jù)位數(shù)。

  
特別是現(xiàn)在到了Win32系統(tǒng)下面,堆棧的作用更是不可忽視,API所用的數(shù)據(jù),均是靠堆棧來傳送的,即先將要傳送的數(shù)據(jù)壓入堆棧,然后CALL至API函數(shù),API函數(shù)會(huì)在函數(shù)體內(nèi)用出棧指令將相應(yīng)的數(shù)據(jù)出棧。然后進(jìn)行操作。以后你就會(huì)知道這點(diǎn)的重要性了。許多明碼比較的軟件,一般都是在關(guān)鍵CALL前,將真假兩個(gè)注冊(cè)碼壓入棧。然后在CALL內(nèi)出棧后進(jìn)行比較。所以,只要找到個(gè)關(guān)鍵CALL,就能在壓棧指令處,下d命令來查看真正的注冊(cè)碼。
另外還有EBP,它稱為基址指針寄存器,它們都可以與堆棧段寄存器SS聯(lián)用來確定堆棧中的某一存儲(chǔ)單元的地址,ESP用來指示段頂?shù)钠频刂罚鳨BP可作為堆棧區(qū)中的一個(gè)基地址以便訪問堆棧中的信息。ESI(源變址寄存器)和EDI(目的變址寄存器)一般與數(shù)據(jù)段寄存器DS聯(lián)用,用來確定數(shù)據(jù)段中某一存儲(chǔ)單元的地址。這兩個(gè)變址寄存器有自動(dòng)增量和自動(dòng)減量的功能,可以很方便地用于變址。在串處理指令中,ESI和EDI作為隱含的源變址和目的變址寄存器時(shí),ESI和DS聯(lián)用,EDI和附加段ES聯(lián)用,分別達(dá)到在數(shù)據(jù)段和附加段中尋址的目的。


接下來,介紹一下專用寄存器,所謂的專用寄存器,有兩個(gè),一個(gè)是EIP,一個(gè)是FLAGS。 我們先來說這個(gè)EIP,可以說,EIP算是所有寄存器中最重要的一個(gè)了。它的意思就是指令指針寄存器,它用來存放代碼段中的偏移地址。在程序運(yùn)行的過程中,它始終指向下一條指令的首地址。它與段寄存器CS聯(lián)用確定下一條指令的物理地址。當(dāng)這一地址送到存儲(chǔ)器后,控制器可以取得下一條要執(zhí)行的指令,而控制器一旦取得這條指令就馬上修改EIP的內(nèi)容,使它始終指向下一條指令的首地址。可見,計(jì)算機(jī)就是用EIP寄存器來控制指令序列的執(zhí)行流程的。


那些跳轉(zhuǎn)指令,就是通過修改EIP的值來達(dá)到相應(yīng)的目的的。再接著我們說一下這個(gè)FLAGS,標(biāo)志寄存器,又稱PSW(program status word),即程序狀態(tài)寄存器。這一個(gè)是存放條件標(biāo)志碼、控制標(biāo)志和系統(tǒng)標(biāo)志的寄存器。


其實(shí)我們根本不需要太多的去了解它,你目前只需知道它的工作原理就成了,我們來看個(gè)例子:
Cmp EAX,EBX ;用EAX與EBX相減
JNZ 00470395 ;不相等的話,就跳到這里;


這兩條指令很簡(jiǎn)單,就是用EAX寄存器裝的數(shù)減去EBX寄存器中裝的數(shù)。來比較這兩個(gè)數(shù)是不是相等,當(dāng)Cmp指令執(zhí)行過后,就會(huì)在FLAGS的ZF(zero flag)零標(biāo)志位上置相應(yīng)值,如果結(jié)果為0,也就是他們兩個(gè)相等的話,ZF置1,否則置0。其它還有OF(溢出標(biāo)志)SF(符號(hào)標(biāo)志)CF(進(jìn)位標(biāo)志)AF(輔助進(jìn)位標(biāo)志)PF(奇偶標(biāo)志)等。


最后要介紹的就是段寄存器了。這部分寄存器一共六個(gè),分別是CS代碼段,DS數(shù)據(jù)段,ES附加段,SS堆棧段,F(xiàn)S以及GS這兩個(gè)還是附加段。 其實(shí)現(xiàn)在到了Win32環(huán)境下,段寄存器以經(jīng)不如DOS時(shí)代那樣重要了。


相信現(xiàn)在大家對(duì)CPU已經(jīng)有了個(gè)大概的了解了。我們接下來就再講一講一些常用的匯編指令。


CMP A,B 比較A與B其中A與B可以是寄存器或內(nèi)存地址,也可同時(shí)是兩個(gè)寄存器,但不能同都是內(nèi)存地址。這個(gè)指令太長(zhǎng)見了,許多明碼比較的軟件,就用這個(gè)指令。
MOV A,B 把B的值送給A其中,A與B可是寄存器或內(nèi)存地址,也可同時(shí)是兩個(gè)寄存器,但不能同都是內(nèi)存地址。


Xor a,a異或操作,主要是用來將a清空
LEA裝入地址,例如LEA DX,string 將字符的地址裝入DX寄存器 :
PUSH 壓棧
POP 出棧  
ADD 加法指令 格式:ADD DST,SRC 執(zhí)行的操作:(DST)<-(SRC)+(DST)  
SUB 減法指令 格式:SUB DST,SRC 執(zhí)行的操作:(DST)<-(DST)-(SRC)  
MUL 無符號(hào)乘法指令 格式: MUL SRC 執(zhí)行的操作:字節(jié)操作(AX)<-(AL)*(SRC);   
操作(DX,AX)<-(AX)*(SRC);雙字操作:(EDX,EAX)<-(EAX)*(SRC)
DIV 無符號(hào)除法指令 格式:DIV SRC 執(zhí)行的操作:字節(jié)操作:16們被除數(shù)在AX中,
位除數(shù)為源操作數(shù),結(jié)果的8位商在AL中,8位余數(shù)在AH中。表示為:
(AL)<-(AX)/(SRC)的商,(AH)<-(AX)/(SRC)的余數(shù)。字操作:32位被除數(shù)在DX,AX中。其中DX為高位字,16位除數(shù)為源操作數(shù),結(jié)果的16位商在AX中,16位余數(shù)在D中。表示為:(AX)<-(DX,AX)/(SRC)的商,(DX)<-(DX,AX)/
(SRC)的余數(shù)。 雙字操作:64位的被除數(shù)在EDX,EAX中。其中EDX為高位雙字;32位除數(shù)為源操作數(shù),結(jié)果的32位商在EAX中,32位余數(shù)在EDX中。表示為:(EAX)<-(EDX,EAX)/(SRC)的商,(EDX)<-(EDX,EAX)/(SRC)的余數(shù)。 NOP 無作用,可以用來抹去相應(yīng)的語句,這樣的話, CALL調(diào)用子程序,你可以把它當(dāng)作高級(jí)語言中的過程來理解。


控制轉(zhuǎn)移指令:
JE 或JZ 若相等則跳
JNE或JNZ 若不相等則跳
JMP 無條件跳
JB 若小于則跳
JA 若大于則跳
JG 若大于則跳  
JGE 若大于等于則跳
JL 若小于則跳
JLE 若小于等于則跳
總的來說,以上幾個(gè),都是比較常見的,需要掌握,但需要掌握的絕不止這幾個(gè),其它的指令希望你能在私下里再了解一下,可以找相應(yīng)的教程來看。









歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1