xorvoid

这是一篇关于逆向一个神秘函数的文章,主要内容如下:

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