目前(截至8.1版本),Hex-Rays反编译器并不尝试进行完整的类型恢复,但会根据对变量的操作或使用来自类型库的API调用的类型信息来推导一些类型。
反编译器执行的一种简单类型推导是当变量被解引用时创建类型化指针,例如:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
_QWORD *__fastcall sub_140006C94(_QWORD *a1)
{
a1[2] = 0i64;
a1[1] = "bad array new length";
*a1 = &std::bad_array_new_length::`vftable';
return a1;
}
不幸的是,这样的转换并不总是正确的,如例子所示:我们在一个数组中混合了整数和指针元素,所以更可能是一个结构体。此外,由于C语言的数组索引规则,数组索引会乘以元素大小(例如,a1[2]
实际上对应字节偏移16)。如果你更喜欢看到“原始”偏移,可以将变量的类型更改为普通整数。当然,这可以通过手动更改变量类型来实现,但在上下文菜单中有一个便捷命令可以快速完成:
重置后,变量变为简单的整数类型,所有解引用现在使用显式字节偏移和类型转换:
现在,你可以创建一个与这些访问对应的结构体,或选择一个现有的结构体。
学习资源
立即关注【二进制磨剑】公众号
原文始发于微信公众号(二进制磨剑):IDA技巧(117)重置指针类型
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论