其他
怎么让 IDA 的 F5 支持一种新指令集?
一
引言
二
已有方法
IDA 处理器模块 与 Ghidra 插件
wasm 反编译
三
方法
四
实践例子
例子 1 直接转换成 x64 汇编
getchar
从标准输入读取一个字符,putchar
向标准输出输出一个字符,putInt
向标准输出输出一个整数,这些指令都是 x64 指令集没有的。_0x21: leave
_0x22: mov rax, rdi
ret
_0x23: call func
mov rdi, rax
例子 2 栈机反编译
case Add(addr):
a = stack.pop()
b = stack.pop()
code.append("v{}={}+{};".format(variable, a, b))
{
// ...... 变量定义 略
putc(73, stdout);
putc(110, stdout);
putc(112, stdout);
putc(117, stdout);
putc(116, stdout);
putc(58, stdout);
putc(32, stdout);
v3 = getc(stdin);
// ....
v4 = getc(stdin) + (v3 << 8);
v5 = getc(stdin) + (v4 << 8);
v6 = getc(stdin) + (v5 << 8);
v7 = getc(stdin) + (v6 << 8);
// ....
Check(v10 ^ '734f1698');
Check(v19 ^ 0x5606035104535A0ALL);
// ....
Check(v28 ^ v36 ^ 0x451505A50075C58LL);
// ....
putc(82, stdout);
putc(105, stdout);
putc(103, stdout);
putc(104, stdout);
}
例子 3 控制流与正确性
_2: Z = 1;
_3: R = R + Z;
_4: R = R + Z;
_5: if(!R) goto _38; else goto _6;
_6: R = R + Z;
_7: if(!R) goto _59; else goto _8;
_8: R = R + Z;
_9: if(!R) goto _59; else goto _10;
_10: bug();
_11: goto end;
_12: X = 1;
_13: Y = 0;
_14: if(!X) goto _22; else goto _15;
例子 4 复杂的表达式
{
a0 += (a1 + ((a1 >> 5) ^ (16 * a1))) ^ 0x7B7CC140;
a1 += (a0 + ((a0 >> 5) ^ (16 * a0))) ^ 0x2105B8C9;
a0 += (a1 + ((a1 >> 5) ^ (16 * a1))) ^ 0xFEA4FB66;
a1 += (a0 + ((a0 >> 5) ^ (16 * a0))) ^ 0x7D1AE6C0;
a0 += (a1 + ((a1 >> 5) ^ (16 * a1))) ^ 0x2775177E;
a1 += (a0 + ((a0 >> 5) ^ (16 * a0))) ^ 0x925FBD3;
// .....
五
总结
参考
题外话
https://www.kanxue.com/book-section_list-156.htm
看雪ID:无名侠
https://bbs.kanxue.com/user-home-617255.htm
# 往期推荐
球分享
球点赞
球在看
点击阅读原文查看更多