这是一篇关于逆向一个神秘函数的文章,主要内容如下:
- 爱好与工具:作者爱好逆向旧二进制文件,还编写了自定义反编译器这里。逆向工程像做填字游戏,从少量线索逐步推导整个画面。
- 机器码展示:给出一段奇怪的 x86 - 16 机器码,包含一系列“入口存根”和不同的跳转与操作,如
pop cx
、push cs
、xor cx,cx
等,还介绍了近调用和远调用的相关序列。 - 入口存根分析:有一系列“入口存根”形式,如
pop cx
、push cs
等,此外还有不同的调用,这些存根是核心例程的不同入口点,近调用和远调用是 x86 - 16 特有的。 - 核心实现检查:核心例程从
0000:03cf
到0000:0460
,经检查像是手工编码或优化的汇编例程,有一些特殊之处,如参数传递方式、使用帧指针等,还发现一些有趣的指令序列和检查。 - 反编译与清理:用dis86将机器码反编译为 C 代码,经过手动清理,代码更清晰,展示了函数的详细实现过程,包括参数加载、除法运算、循环移位等操作。
- 代码重构:进一步清理代码,保留与寄存器和机器级状态转移的联系,使代码更易理解,如定义宏函数进行除法和移位操作等。
- 功能解释:神秘函数在
x86 - 16
机器上实现 32 位的除法和取余运算,利用DIV
指令和循环移位来实现,通过示例详细说明了除法算法的过程。 - 核心算法:函数的核心算法是通过循环移位来逐步处理除法运算,每次循环将最高位移入暂存寄存器,判断是否大于除数,若大于则进行减法和商加一操作。
- 特殊情况:特殊情况是当除数为 0 或被除数和除数都为 16 位时使用
DIV
指令,分别处理除数为 0 触发除零异常和两者都为 16 位的情况。 - 模式讨论:函数有不同的“模式”,通过位运算来控制除法的类型(有符号或无符号)、返回商或余数以及是否取反结果等,入口存根根据模式进行不同的计算。
- 结论:对函数有了全面理解,作者享受剖析函数的过程,认为古老二进制文件中隐藏着有趣的技巧,还提供了博客和捐赠渠道。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。