我的源码,GitHub链接:https://github.com/coNgY1/XqDisassembler
参考资料:https://www.pediy.com/kssd/pediy12/128411.html
写着写着忘了自己写的初衷,变成了真的只能打印反汇编语句了。写这个的时候还没有用过udis8等反汇编引擎,所以对于需求理解不到位,没有把结构中添加分析出来的MODR/M,SIB,以及PARMARY OPCODE部分
最近有点浮躁,花了几天时间写一个反汇编引擎,到现在除了SSE指令集还没有支持,浮点数和X86的常见的都支持了,看手册写表有点太累了~~~如果以后有SSE的需求再补上吧。。。
写的时候记录的一些东西,以后需要增加SSE时候看看:
ONEBYTE 特殊部分:
0x60:PUSHAD PUSHA
0x61:POPAD POPA
0x6D:INSD INSW
0x6E:OUTSD OUTSW
0xA5:MOVSD MOVSW
0xA7:CMPSD CMPSW
0x98:CWDE CBW
0x99:CDQ CWD
0x9C:PUSHFD PUSHF
0x9D:POPFD POPF
0xAB:STOSD STOSW
0xAD:LODSD LODSW
0xAF:SCASD SCASW
0xCF:IRETD IRET
0x9A这个CALL FAR指令
0xF3+0x90 = PAUSE
LOCK前缀没处理
LES/LDS-C4/C5指令的FWORD和DWORD转换
66前缀: 寄存器32->16
ModRM的disp32还是disp32,只是要加上word ptr
imm32变为imm16 ->Iz变为Iw
67前缀:
ModRM的E表更换一下为16位的寄存器
只影响寻址,不影响立即数imm
浮点数指令的大小描述
single-real dword ptr,有St(x) --66不影响
double-inter dword ptr,有st(x) --66不影响
double-real qword ptr,有st(x) --66不影响
2BYTES word ptr 没有St(x) --66不影响
extended-read tword,有st(x) --66不影响
14/28bytes m28/m14没有st(x) --66会变成m14
interger64 qword ptrE表,st(x) --66不影响
98/108bytes no
word-inter word ptr,st(x) --66不影响
packed-BCD tword ptr --66不影响
qword-inter qword ptr --66不影响