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中的示例 ...