关于IDA与od 相同机器码显示不同情况该如何分辨?
萌新初学逆向和汇编在做题的时候发现,IDA汇编代码可能更”精简“,
比如如下两行代码
在IDA中是
lea esi,
mov dl,
而在OD(X32dbg)中是
lea esi,dword ptr ds:
mov dl,byte ptr ds:
我的主要问题是 ida中省略了dword ptr和Byte ptr这种关键字,那如何分辨他赋值多少个字节呢?
翻了会汇编语言书,大概想到:
32位程序,dx是16位,dl是是8位,所以默认取1个字节,因为dl只能容纳一个字节
lea赋值的是地址,地址是8个16进制数=4个字节=双字,esi是32位寄存器,正好能存放四个字节(双字),所以是dword ptr。
如果这样想,那么可以猜测是因为“正好”,所以IDA就给精简显示了?
不知道我的想法对不对,感谢解答! 本帖最后由 jixun66 于 2021-4-13 23:56 编辑
一样的,只是写法(字节码反汇编产生的对应指令)不同。
movsx - BYTE 扩展到 DWORD
lea - 地址计算,与大小无关。
mov dl, - dl 是字节,右边若是引用地址只能用 byte[...] 写法。
另外这个是 INTEL 汇编语法,还有个 AT&T 的写法和这个有很大不同。 默认的od的反编译的结果才是标准写法,地址操作数指明大小,这个也可以在od的调试设置里设置成不显示操作数大小,自己写汇编还是坚持标准写法,不容易出错,特别是在64位编程的时候。对照看一下intel的机器指令集就明白了,每个指令对操作数的大小都是有规定的, jixun66 发表于 2021-4-13 23:53
一样的,只是写法(字节码反汇编产生的对应指令)不同。
movsx - BYTE 扩展到 DWORD
请教一下,你们都是怎么学习汇编的? 怎么学习汇编? 看接收的地址或寄存器位数不是一样吗?比如dl,al jixun66 发表于 2021-4-13 23:53
一样的,只是写法(字节码反汇编产生的对应指令)不同。
movsx - BYTE 扩展到 DWORD
感谢!!! Gordon_c 发表于 2021-4-14 00:16
请教一下,你们都是怎么学习汇编的?
我是先看王爽的汇编语言书 然后边看边找点re题一步步调试熟悉 badboybilly 发表于 2021-4-14 01:59
怎么学习汇编?
我是先看王爽的汇编语言书 然后边看边找点re题一步步调试熟悉 无闻无问 发表于 2021-4-14 06:55
看接收的地址或寄存器位数不是一样吗?比如dl,al
但64位程序的话,那地址就是八个字节了,主要考虑到这点 Ollydbg/x32dbg/x64dbg同步调试插件帮助你,我们都是一家人,只是“代号”不一样。{:301_987:}
页:
[1]
2