逆向工程方法

逆向工程 职能
2021-06-20 22:35:54

我是逆向工程的新手,我正在学习opensecurity.info站点提供的在线课程
作者提供了逆向工程的方法论。他建议找到一个感兴趣的函数并对其进行伪代码。
从使用的措辞来看,听起来我应该从头到尾颠倒整个函数。
这真的是推荐的做法吗?
如果我的问题不够清楚,这里有一个假设案例:假设我想了解用于在恶意软件与命令和控制服务器之间交换数据的通信协议。假设我找到了 recv 调用,并且该调用位于未知函数的中间。
我真的应该从一开始就反转这个未知函数,还是应该关注这个函数内部调用“recv”的代码区域并从那里开始?

2个回答

我真的应该从一开始就逆转这个未知的功能吗

免责声明:这只是我的意见。也就是说,我的回答是:,除非你真的需要那样做,否则不要那样做。当我教授逆向工程时,我总是对我的学生说的第一件事实际上是:永远不要尝试逐行逆向工程一个函数,除非你真的需要这样做(我的经验表明,大多数时候你不需要这样做)。

我的建议有点不同:

  • 查找“工件”可以让您对函数的作用有一个抽象的概念:调用/引用的函数名称(即 API)、常量等......
  • 在对函数的作用有了一个抽象的概念后,确定是否需要从中获取更多信息。
  • 如果是这样,请尝试确定分组基本块,但不要逐行分析,一组基本块的作用,尝试关注您不了解的内容或需要回答的内容。
  • 如果您仍然需要更多细节或仍有不清楚的地方,请按照流程从不清楚的点或您开始关心的点开始,按照每个基本块执行基本块。
  • 如果仍然需要更多信息或仍然不清楚,请逐条说明,尝试专门关注您不理解的内容或需要回答的内容,并且只有在您仍然无法回答您的问题时,才将整个过程颠倒过来逐行函数。

当我们真的不需要这样做时,尝试逐条指令或反转整个功能,更容易迷失/困惑,因为我们将专注于一些晦涩的指令做了什么或它改变了哪些标志,而不是专注于回答真正的问题。然而,这在很大程度上取决于你为什么要逆向工程那个东西。您是在尝试模仿/复制/扩展算法(即解密算法)还是恢复二进制文件的源代码?然后,是的,您将需要逐条说明。您是否对某个软件/功能进行逆向工程以确定它的作用?一般来说,不,您不需要逐条指令。

我的 2 美分。

我建议你也看看其余的代码。找到特定的东西绝对是一个突破,但是一行代码——尤其是在汇编中——不能单独做很多事情。看你举的例子。您找到了恶意软件的通信方式。够了吗?可能不是。这种交流的性质是什么?是反向shell吗?是用来传输文件的吗?有许多不同的问题需要回答,而且——相信我——如果你能在代码的同一点找到它们,你将非常幸运。始终查看您感兴趣的领域周围的代码。您可能会发现调用其他函数的函数,这些函数使用通信通道做有趣的事情。一件事带来另一件事,归根结底,它将为您带来恶意软件的完整结构和功能。

PS 在从一个函数转到另一个函数时总是使用断点。

狩猎快乐!