使用 OllyDbg 识别按下按钮时发生的情况

逆向工程 ollydbg 快手
2021-07-09 00:34:47

我对逆向工程完全陌生,但尽管如此,我还是收到了一位朋友的挑战,要求破解他编写的计算机程序。以前从未这样做过,我的在线研究建议我使用 OllyDbg 来搜索当我尝试给出无效代码时给出的错误消息。问题在于,如果代码无效,则永远不会启用提交它的按钮。我可以使用 OllyDbg 来找出如果我单击按钮然后以某种方式覆盖它会发生什么吗?

以下是我对这个程序的了解:

  • 我无权访问源代码,也不知道它是用什么语言编写的。
  • 该程序可以激活,因为我的朋友向我证明了他输入了一个密钥来激活它,但将它覆盖起来所以我看不到它。

鉴于我以前从未涉足过逆向工程,我最好的攻击计划是什么,我将如何进行?

4个回答

如果您在二进制 RE 方面的经验很少,我建议您从准备大量“扔”到您身上的未知信息开始,时间和耐心:-)。

现在进入主题。要完成您正在谈论的工作,您将需要工具并且您需要很好地了解它们:

  • Olly - 做二进制的动态分析。您已经拥有的那个,我希望已经打开它以获取该工具。
  • IDA - 做静态分析。它将帮助您浏览二进制文件。您可以从提供的链接下载免费版本,这足以完成您的任务。
  • CFF 资源管理器 - 了解二进制文件的类型并查看其依赖项、资源。

接下来,据说二进制文件没有被混淆:

  • 尝试执行二进制文件并研究它的一些行为并做笔记 - 字符串(标题、消息)、按钮名称。给它一些输入并寻找结果。
  • 基于二进制类型:
    • 。网
    • 本国的
      • 将其加载到 IDA 并检查是否可以从注释中找到/验证二进制文件中的数据。
      • 由于这是GUI应用程序,我将与MSDN检查的区域GetMessageTranslateMessageCreateWindow并查找窗口过程负责处理窗口消息。

在上述之后,我还建议,正如@Dominik 所做的那样,阅读 Lena 的第一个教程,以涵盖您的二进制类型所需的所有信息。

我认为上述内容几乎可以让您找到正在寻找的密钥。从正在进行的分析中添加更多信息,我们将尝试提供其他帮助。

祝你好运!

我假设您的朋友没有将反调试和打包二进制文件等技巧用作您的第一个挑战。假设是不正确的答案,因此您下次应该提供更多详细信息:) 我将如何处理此问题:

  1. 阅读 Lena 的教程。

  2. 确定应用程序是用什么编写的。

    为此有多种工具,例如:

  3. 所以,从它的声音来看,你的朋友有这样的东西:

    void onEachKeyPress() // meaning each time you type a character into
                          // the text box, this function will be called
    {
       if(txtBoxInput == "secretKey123#")
       {
         EnableButton();
         MessageBox("You did it!");
       }
    }
    

    所以,我们知道如果文本框包含右键,按钮将被激活。也可能在输入右键并按下按钮后有一个祝贺信息。由此您可以假设将有一个用于启用按钮或消息框窗口的功能。

    最终,应用程序中的某处会有一个条件,它决定您是否拥有正确的密钥,如果不涉及任何技巧,密钥本身将在应用程序中的某个地方。

    Olly 将向您展示机器语言,条件 ( if) 将转换为跳转操作数 ( je, jz, jne, ...)。

    如果 secretKey123# 不符合您的输入

    (在这种情况下的操作是启用按钮并显示一条消息)

  4. 所以现在你知道了所有这些,是时候环顾四周了运行应用程序,附加 Olly,或者您可以从 olly 启动您的应用程序,并将其设置为在 main 函数上中断。这很方便,因为您可以从那里一步一步地遵循应用程序的执行流程。您现在知道要查找哪些函数了。放置一些断点并观察。列出二进制文件中的所有字符串。看看是否有任何看起来像硬编码的密码。

    如果您找到决定您的输入是否正确的代码段,您可以修补它,或者只是简单地找到硬编码的密码并输入它而不修改(修补)二进制文件。

    如果您没有什么可以破解的,并想继续进行更高级的挑战,请前往crackmes.de

以下解释仅适用于本机应用程序:如果您想了解如何找出按钮事件发生的位置,我建议您学习这些语言的编码:ASM、C++ 和 Delphi(至少对它们有一个大致的了解) . 然后,尝试在编译后的文件中查找代码发生事件的位置。

这个页面使用谷歌翻译,我写过一次关于这个东西:http : //www.at4re.com/f/showthread.php?11276

在该函数的开头设置一个断点,点击该断点,然后逐步查看会发生什么。这真的是最简单的答案。