作者提供了逆向工程的方法。他建议找到感兴趣的函数并将其伪编码。
从所使用的措辞来看,听起来我应该将整个功能从其开始到结束都颠倒过来。这真的是推荐的做法吗?
如果我的问题还不够清楚,这里是一个假设的情况:
假设我想了解用于在恶意软件与命令和控制之间交换数据的通信协议服务器。假设我找到了recv调用,而此调用位于一个未知函数的中间。我应该从一开始就真正扭转这个未知函数,还是应该专注于该函数中调用“ recv”并从那里转到那里的代码区域?
#1 楼
我真的应该从一开始就扭转这个未知的功能吗?
免责声明:这只是我的观点。就是说,我的回答是:不,除非您确实需要这样做,否则请不要这样做。实际上,当我教授逆向工程时,我总是对学生说的第一件事是:除非真正需要,否则不要尝试逐行对功能进行逆向工程(而且我的经验表明,大多数时候不需要这样做。)
我的建议有些不同:
查找“工件”,比可以给您一个抽象的概念函数的作用:调用/引用的函数名称(即API),常量等...
对函数的作用有一个抽象的了解之后,确定是否需要从中获取更多信息。
如果是这样,请尝试确定基本块的分组,但不逐行分析一组基本块的作用,并着眼于您不了解或需要回答的内容。
如果您仍然需要更多详细信息或尚不清楚的地方,请从不清楚的地方或您开始关心的角度开始,按照流程对每个基本块进行基本划分。需要更多信息或尚不清楚,请逐条进行操作,尝试着重于您不了解的内容或需要回答的内容,并且,即使在您仍然无法回答问题的情况下,也要逐行逆转整个功能行。
当我们真的不需要这样做时,尝试逐条指令执行指令或反转整个功能,容易迷失/困惑,因为我们将专注于某些晦涩的指令所执行的操作或标志的更改,而不是专注于回答真正的问题。但是,这很大程度上取决于您为什么要对该产品进行逆向工程。您是要模仿/复制/扩展算法(即解密算法)还是恢复二进制文件的源代码?然后,是的,您将需要逐条说明。您是对软件/功能进行反向工程以确定其功能吗?一般而言,不需要,您无需逐一讲解。
我的2美分。
#2 楼
我建议您也看一下其余的代码。找到特定的东西绝对是一项突破,但是一行代码(尤其是在汇编中)不能独自完成很多工作。看你给的例子。您发现了恶意软件的通信方式。够了吗?可能不会。这种交流的本质是什么?它是反向壳吗?它用于传输文件吗?有许多不同的问题需要回答,并且-相信我-如果您能在代码的同一位置找到所有问题,您将非常幸运。始终查看您感兴趣的区域周围的代码。您可能会发现使用通信通道调用其他功能的有趣功能的函数。一件事带来了另一件事,总而言之,它将带给您恶意软件的完整结构和功能。P.S.从函数到函数时,请始终使用断点。
狩猎愉快!
评论
没有“方法论”,只有随机的人写下的虚构。如果有一种软件工程方法论,您可以相反地应用它:
–维塔利·奥西波夫(Vitaly Osipov)
16年5月19日在6:36