为什么API GetMnem 不能处理IDA Pro 中的“stosd”、“movsd”等指令?

逆向工程 艾达
2021-06-30 07:35:31

所以基本上我使用IDC脚本使用IDA Pro 6.1,windows 32位一一转储指令。PE文件格式

我使用尝试转储一个操作码指令,例如

stosd
stosb
stosq
movsd

这样:

for (addr = funcStart; addr != BADADDR; addr = NextHead(addr, funcEnd)) {
 ......
auto code;
line = GetDisasm(addr);
mnem = GetMnem(addr);
.......
if (strstr(line, mnem) != 0) {
        mnem = line;
}
line = form("%-8s", mnem);

但令我惊讶的是,当遇到这样的操作码指令时,mnem会得到类似的东西

stos
stos
stos
movs
movs
movs

通过检查直接转储的 asm 文件 ** File->Produce File->Create ASM File...**,我发现那些错误说明应该是

stosd
stosd
stosd
movsd
movsd
movsd

这意味着 API GetMnem 生成的结果是错误的...

谁能给我一些帮助?谢谢!

1个回答

如果您查看这些指令的特定操作码,它们是相同的。更准确地说,“stos m8”和 stob 与“STOS m16”、“STOS m32”、“STOSW”和“STOSD”(0xAB)具有相同的操作码(0xAA)。引用手册:

在汇编代码级别,该指令的两种形式是允许的:“显式操作数”形式和“无操作数”形式。显式操作数形式(使用 STOS 助记符指定)允许显式指定目标操作数。这里,目标操作数应该是一个表示目标值大小和位置的符号。然后自动选择源操作数以匹配目标操作数的大小(AL 寄存器用于字节操作数,AX 用于字操作数,EAX 用于双字操作数)。提供此显式操作数形式以允许记录;但是,请注意,此表格提供的文件可能会产生误导。也就是说,目标操作数符号必须指定正确的操作数类型(大小)(字节、字或双字),但它不必指定正确的位置。该位置始终由 ES:(E)DI 寄存器指定,在执行存储字符串指令之前必须正确加载这些寄存器。

GetMnem文档中:

注意:此函数可能不会返回与您在屏幕上看到的完全相同的助记符。