欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1876|回復: 0
打印 上一主題 下一主題
收起左側

匯編語言(長了一點,想了解的慢慢看)

[復制鏈接]
跳轉到指定樓層
樓主
ID:107189 發表于 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 若小于等于則跳
總的來說,以上幾個,都是比較常見的,需要掌握,但需要掌握的絕不止這幾個,其它的指令希望你能在私下里再了解一下,可以找相應的教程來看。




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表