如果我想弄清楚程序是如何完成特定任务的,或者它如何与未知的数据结构或格式一起工作,我可以采用哪些技术和工具来快速有效地找到感兴趣的二进制部分,以开始回答这些问题?

作为一个具体的例子,假设我试图弄清楚游戏客户端如何计算和验证校验和。我观察到以下属性,没有进行任何初始拆卸:


该校验和用于验证游戏中物品的统计数据是否合法。
客户端。
这是一个2字节的校验和。我拆开它。一旦在内存中找到该位置,就可以在每次访问它时在其上设置一个内存断点。从那里我回溯到控制流的来源。并成功地重新创建了执行此操作的C程序。

我使用的方法的另一个问题是,可能存在很多“误报”。程序的各个部分都可以访问我正在监视的内存位置,而该部分与校验和的计算无关-因此,反复试验的位置。问题是,有没有更简单的方法来解决这个问题?如果我想确定程序正在使用的关键数据结构怎么办?如何识别不那么容易观察的功能和计算呢?并非所有程序中使用的值都可以使用作弊引擎之类的内存扫描仪轻松隔离。

#1 楼

与通过白盒确定(即比较缓冲区及其校验和)来确定校验和算法相比,确定校验和算法要容易得多且可靠。 >



尽快在可能是校验和值(结尾?)的那部分数据上设置一个内存读取断点,然后执行进一步
滚动检查IDA中的每个功能,以标记可能是校验和的功能-复杂的功能通常具有非常不同的ASM。一个-您可能要搜索移位/异或/ rol序列




评论


诸如findcrypt之类的插件和类似的插件可以帮助识别何时使用了众所周知的加密散列,尽管在Greatwolf的目标中显然并非如此。

–百老汇
13年4月12日在18:17

没错,但是众所周知的哈希值很容易手动发现恕我直言-最好还有一种通用方法-如果存在混淆,findcrypt也将失败。

–天使
13年4月12日在18:25