我一直遇到IDA不能自动处理的编译模式。考虑下面的示例:在本示例中,似乎IDA失去了rbp的状态作为堆栈帧的偏移量的跟踪,大概是因为其他间接。 (我们将rsp复制到rax复制到rbp,而不仅仅是从rsp复制到rbp

我希望上面的示例看起来像这样: />
但是,正如人们期望的那样,如果将3Fh的类型更改为堆栈偏移量,则会得到以下信息:

mov rax, rsp       ; Set rax at the start of the function
...
lea rbp, [rax-5Fh] ; Shortly afterward, set rbp as the frame pointer at a nonstandard offset
...
mov [rbp+3Fh], rcx ; Reference all stack offsets from rbp for the rest of the function
...


显然是不正确的。我有两个问题:


是否可以生成所需的输出?
如果没有,通常如何处理?

解决方案我知道:


我可以为堆栈框架创建一个结构并指定偏移量增量(有时还针对负偏移量进行调整)。缺点是我必须为我分析的每个堆栈框架创建一个结构,并且也没有交叉引用。
我只能在堆栈框架中使用不正确的偏移量。这将为我提供交叉引用,但我希望在触摸存储返回地址的偏移量r时,事情会中断。

也相关:我正在使用IDA Pro 6.2。 br />

评论

您可以分享/链接到二进制样本的任何机会,想亲自检查一下:)

#1 楼

Alt+P将显示Edit function屏幕。

确保选中BP based frame,然后在标有0x5F的框中输入值Frame pointer delta

评论


做到了,谢谢!正数0x5F是正确的增量。

–user1354557
14-10-23在15:41