使用给定的 .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
结果来确定使用的加密算法。
【问题讨论】:
你能提供更多关于应用程序的信息吗?p1
和 p2
的相同输入是否生成相同的密钥?可以设置密钥大小,或者密钥的大小是多少?密钥是什么样子的,它是否具有某种格式/编码?如果没有该应用程序的文档,则可能只有您提到的选项。对于第二个选项:您可以将结果与用于密钥派生的常用算法进行比较(但这里有很多可能性,如果开发人员应该提出自己的想法,这种方法也会失败)。
@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 反转解密算法的主要内容,如果未能解决你的问题,请参考以下文章