反彙編引擎的工作原理

2021-08-29 16:15:12 字數 1298 閱讀 8743

ollydbg和ida都有乙個很重要的功能:反彙編

在x86平台下使用的彙編指令對應的二進位制機器碼為intel 指令集一opcode,intel指令手冊中描述的指令由6部分組成:

irsinucton prefixes 指令字首

opcode 指令操作碼

mode r/m 運算元型別

sib displacement 輔助mode r/m,計算偏移位址

immedate 立即數 

instuction prefixes:指令字首

指令字首是可選的,作為指令的補助說明資訊存在,主要用於以下4種情況。

重複指令:如rep、repe\repz

跨段指令:如mov dword ptr fs:[***x], 0

將運算元從32位轉為16位:如mov ax,word ptr ds:[eax]

將位址從16位轉為32位:如mov eax,dword ptr ds:[bx+si]

opcode:指令操作碼

opcode為機器碼中的操作符部分,用來說明指令語句執行什麼樣的操作,如某條彙編語句是mov、jmp還是call。opcode為彙編指令語句的主要組成部分,是必不可少的。對opcode的解析也是反彙編引擎的主要工作。

彙編指令助記符與opcode是--一對應的關係。每一條彙編指令助記符都會對應一條opcode碼,但由於運算元型別不同,所佔長度也不相同,因此對於非單位元組指令來說,解析一條彙編指令單憑opcode是不夠的,還需要mode r/m、sib、 displacement 的幫助,才能夠完整地解析出彙編資訊。

mode rim:運算元型別

mode r/m是輔助opcode解釋彙編指令助記符後的運算元型別. r表示暫存器, m表示記憶體単元。mode r/m佔乙個位元組的固定長度,第6、7位可以描述4種狀戀,分別用來描述第0、1、 2位是暫存器還是記憶體單元,以及3種定址方式.第3、4、5位用於輔助opeode.

sib:輔助mode r/m,計算位址偏移

sib的定址方式為基址+變址,如mov eax,dword ptr ds:ebx+ecx*2],其中的ecx、乘數乘數2都是由sib來指定的。sib佔 i個位元組大小,第0、i、2位用於指定作為基址的暫存器;第3、4、5位用於指定作內變址的暫存器;第6、7位用於指定乘數,由幹只有兩位,因此可以表示4種狀志,這4種狀態分別表示乘數為1、2、4、8.

displacement:輔助mode r/m,計算位址偏移

displacment用於輔助sib,如mov eax.dword ptr ds(ebx+ec*2+3]這條指令,其中的「+3」是由displacement來指定的.

immediate:立即數

微機原理 反彙編例項01 02

例項2 secret01.exe 第乙個字元的ascii碼減一等於58,故該字元的ascii碼是59,該字元是y 第二個字元的ascii碼加一等於50,故該字元的ascii碼是4f,該字元是o 第三個字元的ascii碼加一等於56,故該字元的ascii碼是55,該字元是u。截圖如下 例項3 secr...

微機原理 反彙編例項5

例項6 secret5.exe 將di中儲存的字元 y 賦值給al,再加一 得到z 與07 二進位制是00000111 做與運算,與30 二進位制是00110000 做或運算。解密過程如下 z 7a,二進位制是01111010 跟07做與運算的結果是00000010 02 將該結果跟30做或運算,結...

BeaEngine反彙編引擎在C中的使用

beaengine是乙個開源的反編譯引擎,官網為 支援多種語言,比如 python vc masm32 delphi 等。由於我在使用的時候遇到了很多問題,所以在這裡介紹一下它在vs中的具體應用及問題解決方法。beaengine的所有 布局安排同這個示例 在cpp檔案中貼上examples中的示例 ...