我不断遇到 IDA 不能自动处理的编译模式。考虑以下示例:
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
...
在这个例子中,IDA 似乎已经失去了对rbp
's state 的跟踪,作为堆栈帧的偏移量,大概是因为额外的间接性。(我们将复制rsp
到rax
到rbp
,而不是仅仅从rsp
到rbp
)
我希望上面的例子看起来更像这样:
var_20= qword ptr -20h
...
mov [rbp+5Fh+var_20], rcx
然而,正如人们所期望的,如果我将 的类型更改3Fh
为堆栈偏移量,我会得到以下信息:
arg_37= qword ptr 3Fh
...
mov [rbp+arg_37], rcx
这显然是不正确的。我有两个问题:
- 是否可以生成所需的输出?
- 如果没有,通常会如何处理?
我知道的解决方案:
- 我可以为堆栈帧创建一个结构并指定偏移量增量(有时也会调整为负偏移量)。缺点是我必须为我分析的每个堆栈帧创建一个结构,而且我也没有交叉引用。
- 我可以在堆栈帧中使用不正确的偏移量。这会给我交叉引用,但我希望在触摸 时事情会中断
r
,偏移量存储返回地址。
同样相关:我正在使用 IDA Pro 6.2。