使用给定的 .exe GUI 反转解密算法

Posted

技术标签:

【中文标题】使用给定的 .exe GUI 反转解密算法【英文标题】:Reverse a decryption algorithm with a given .exe GUI 【发布时间】:2021-02-11 14:12:33 【问题描述】:

我正在使用 Keygen 应用程序 (.exe)。它的 GUI 中有两个输入字段:

    p1 - 至少 1 位,最多 10 位 - ^[0-9]1,10$ p2 - 最多 12 个字符 - 大写字母/数字/下划线 - ^[A-Z0-9_]0,12$

按下generate按钮产生一个键x

x - 精确到 20 位 - ^[0-9]20$

对于每一对(p1,p2),只有一个x(换句话说:f(p1,p2) = x是一个函数)

我对它的加密算法很感兴趣。

有没有办法对算法进行逆向工程?

我想到了两种方法:

    反编译。我用了snowman,但是输出太污染了。反编译的代码可能包含不相关的部分,例如 GUI。 输入输出分析。我想知道是否有任何选项可以通过分析一组f(p1,p2) = x 结果来确定使用的加密算法。

【问题讨论】:

你能提供更多关于应用程序的信息吗? p1p2 的相同输入是否生成相同的密钥?可以设置密钥大小,或者密钥的大小是多少?密钥是什么样子的,它是否具有某种格式/编码?如果没有该应用程序的文档,则可能只有您提到的选项。对于第二个选项:您可以将结果与用于密钥派生的常用算法进行比较(但这里有很多可能性,如果开发人员应该提出自己的想法,这种方法也会失败)。 @Topaco,我编辑了问题,提供了您要求的信息 关于逆向工程,这个reverseengineering.stackexchange.com有专门的站点。 您不能只确定算法,但您可以通过实现一些候选算法并对其进行测试,轻松测试一个或多个关于其工​​作原理的假设使用给定的输入集并比较输出,直到找到匹配的算法。 在 reverseengineering.stackexchange.com/ 中发布相同的问题是否合法? 【参考方案1】:

正如你所提到的,使用雪人或其他一些反编译工具可能是要走的路。

我怀疑您是否能够仅通过查看输入输出组合来确定算法,因为可以编写任何类型的任意算法,可以以任何方式运行。

也许你可以问作者他们使用的是什么算法?

【讨论】:

【参考方案2】:

除非它真的很简单,否则我会排除您的选项 2,即通过查看输入和输出对来找出答案。

对于静态二进制文件的反编译/逆向工程,您应该首先确定它是 .NET 应用程序还是其他东西。如果它是用 .NET 编写的,你可以试试这个进行反编译:

https://www.jetbrains.com/decompiler/

它真的很容易使用,除非二进制文件被混淆了。

如果应用程序不是 .NET 应用程序,您可以尝试 Ghidra 和/或 Cutter,它们都内置了令人印象深刻的反编译器:

https://ghidra-sre.org/

https://cutter.re/

如果静态代码分析还不够,可以添加调试器。 Ghidra 和 x64dbg 可以很好地协同工作,并且可以通过安装在两者中的插件进行同步。

如果您是新手,我可以建议您研究 x86 平台的基本汇编程序,以便您大致了解 CPU 的工作原理。另一种入门方式是来自 CTF 比赛的“crackme”风格挑战。解决方案通常有很棒的文章,因此您可以同时获得问题和答案。

祝你好运!

【讨论】:

【参考方案3】:

输入 p1 和 p2。扫描该字节字符串的进程。然后在其上放置一个用于内存访问的硬件断点。生成密钥,它将命中该硬件断点。然后你有访问它的地址并从那里开始在 Ghidra 中反转(不要忘记使用 BASE + OFFSET),因为 ghidra 的输出不会与正在运行的应用程序具有相同的基础。相关代码必须访问输入。所以你知道算法在哪里。因为它要么直接访问它,要么访问该调用链中的某处相对较快。没有实际看到可执行文件,没有人会知道。

【讨论】:

以上是关于使用给定的 .exe GUI 反转解密算法的主要内容,如果未能解决你的问题,请参考以下文章

语音加密基于混沌算法的语音信号加密解密matlab源码

使用 7zip 命令行实用程序解密加密的 7zip 存档文件

关于RSA算法

(蓝桥杯)试题 算法训练 数字反转

算法模板

Java字符串--给定一个字符串,将其整个字符串反转