久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 匯編語言(長了一點,想了解的慢慢看) [打印本頁]

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

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


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


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


我們再來看看CPU的構成,CPU的任務就是執行存放在存儲器里的指令序列。為此,除要完成算術邏輯操作外,還需要擔負CPU和存儲器以及I/O之間的數據傳送任務。早期的CPU芯片只包括運算器和控制器兩大部分。到了后來,為了使存儲器速度能更好地與運算器的速度相匹配,又在芯片中引入了高速緩沖存儲器。除了高速緩沖存儲器之外的組成,


大體上可以分為3個部分:


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

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

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

  
特別是現在到了Win32系統下面,堆棧的作用更是不可忽視,API所用的數據,均是靠堆棧來傳送的,即先將要傳送的數據壓入堆棧,然后CALL至API函數,API函數會在函數體內用出棧指令將相應的數據出棧。然后進行操作。以后你就會知道這點的重要性了。許多明碼比較的軟件,一般都是在關鍵CALL前,將真假兩個注冊碼壓入棧。然后在CALL內出棧后進行比較。所以,只要找到個關鍵CALL,就能在壓棧指令處,下d命令來查看真正的注冊碼。
另外還有EBP,它稱為基址指針寄存器,它們都可以與堆棧段寄存器SS聯用來確定堆棧中的某一存儲單元的地址,ESP用來指示段頂的偏移地址,而EBP可作為堆棧區中的一個基地址以便訪問堆棧中的信息。ESI(源變址寄存器)和EDI(目的變址寄存器)一般與數據段寄存器DS聯用,用來確定數據段中某一存儲單元的地址。這兩個變址寄存器有自動增量和自動減量的功能,可以很方便地用于變址。在串處理指令中,ESI和EDI作為隱含的源變址和目的變址寄存器時,ESI和DS聯用,EDI和附加段ES聯用,分別達到在數據段和附加段中尋址的目的。


接下來,介紹一下專用寄存器,所謂的專用寄存器,有兩個,一個是EIP,一個是FLAGS。 我們先來說這個EIP,可以說,EIP算是所有寄存器中最重要的一個了。它的意思就是指令指針寄存器,它用來存放代碼段中的偏移地址。在程序運行的過程中,它始終指向下一條指令的首地址。它與段寄存器CS聯用確定下一條指令的物理地址。當這一地址送到存儲器后,控制器可以取得下一條要執行的指令,而控制器一旦取得這條指令就馬上修改EIP的內容,使它始終指向下一條指令的首地址?梢,計算機就是用EIP寄存器來控制指令序列的執行流程的。


那些跳轉指令,就是通過修改EIP的值來達到相應的目的的。再接著我們說一下這個FLAGS,標志寄存器,又稱PSW(program status word),即程序狀態寄存器。這一個是存放條件標志碼、控制標志和系統標志的寄存器。


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


這兩條指令很簡單,就是用EAX寄存器裝的數減去EBX寄存器中裝的數。來比較這兩個數是不是相等,當Cmp指令執行過后,就會在FLAGS的ZF(zero flag)零標志位上置相應值,如果結果為0,也就是他們兩個相等的話,ZF置1,否則置0。其它還有OF(溢出標志)SF(符號標志)CF(進位標志)AF(輔助進位標志)PF(奇偶標志)等。


最后要介紹的就是段寄存器了。這部分寄存器一共六個,分別是CS代碼段,DS數據段,ES附加段,SS堆棧段,FS以及GS這兩個還是附加段。 其實現在到了Win32環境下,段寄存器以經不如DOS時代那樣重要了。


相信現在大家對CPU已經有了個大概的了解了。我們接下來就再講一講一些常用的匯編指令。


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


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


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









歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 成人精品国产一区二区4080 | 麻豆视频在线免费看 | 亚洲品质自拍视频 | 久久五月婷 | 天堂资源 | 雨宫琴音一区二区在线 | 亚洲视频欧美视频 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 成人午夜性成交 | av大片| 爱爱综合网 | 久久手机在线视频 | 精品丝袜在线 | 在线不卡一区 | 亚洲视频 欧美视频 | 国产成人精品a视频一区www | 欧美日韩精品影院 | 日韩成人影院在线观看 | 嫩草视频在线看 | 婷婷激情在线 | 成年免费大片黄在线观看一级 | 国产乱码精品一区二区三区忘忧草 | 99久久久无码国产精品 | 国产片侵犯亲女视频播放 | 九一国产精品 | 97精品超碰一区二区三区 | 99亚洲综合| 日韩精品一区二区不卡 | 完全免费在线视频 | 亚洲视频一区 | www.狠狠操 | 日韩视频成人 | 欧美三级成人理伦 | 九九精品久久久 | 免费成人高清 | 国产精品大片 | 国产激情三区 | 久草.com| 91精品成人久久 | 亚洲国产精品一区二区第一页 | 伊人精品|