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

Cryptography 使用给定的.exe GUI反转解密算法,cryptography,reverse-engineering,decompiling,analyzer,Cryptography,Reverse Engineering,Decompiling,Analyzer,我正在使用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是一个函数) 我对它的加密算法感兴趣 有没有办法对算法进行反向工程 我想到了两种方法: 反编译。我用过,但是输出太污染了。反编译的代码可能包含不相关

我正在使用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
    是一个函数)

    我对它的加密算法感兴趣

    有没有办法对算法进行反向工程

    我想到了两种方法:

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

  • 正如您所提到的,使用snowman或其他一些反编译工具可能是一个不错的选择

    我怀疑你仅仅通过观察输入输出组合就能够确定算法,因为它可以编写任何类型的任意算法,可以以任何方式运行


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

    除非是非常简单的算法,否则我会排除你的选项2,即通过查看输入和输出对来找出它

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

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

    如果应用程序不是.NET应用程序,您可以尝试Ghidra和/或Cutter,它们都内置了非常出色的反编译器:

    如果静态代码分析还不够,可以向其中添加调试器。Ghidra和x64dbg配合得非常好,可以通过安装在两者中的插件进行同步

    如果您是新手,我建议您研究一下x86平台的基本汇编程序,以便对CPU的工作原理有一个大致的了解。另一种开始的方式是来自CTF比赛的“crackme”式挑战。通常会有关于解决方案的精彩文章,这样你就有了问题和答案


    祝你好运

    输入p1和p2。扫描进程以查找该字节字符串。然后在其上放置一个用于内存访问的硬件断点。生成密钥时,它将命中该硬件断点。然后您就有了访问它的地址,并在Ghidra中从那里开始反转(别忘了使用BASE+OFFSET),因为Ghidra的输出不会与正在运行的应用程序具有相同的基址。相关代码必须访问输入。所以你知道算法在哪里。因为它要么直接访问它,要么在调用链中的某个地方访问速度相对较快。没有人能在没有实际看到可执行文件的情况下知道。您能提供更多关于该应用程序的信息吗?对于
    p1
    p2
    的相同输入是否生成相同的键?可以设置密钥大小,或者密钥的大小是多少?密钥看起来像什么,是否有特定的格式/编码?如果没有应用程序的文档,可能只有您提到的选项。对于第二种选择:您可以将结果与用于密钥推导的常用算法进行比较(但这里有很多可能性,如果开发人员自己提出了一些建议,这种方法也会失败)。@Topaco,我编辑了这个问题,提供了您所需的信息。关于逆向工程,这有一个专门的网站。你不能只确定算法,但是,通过实现一些候选算法,并使用给定的输入集测试它们,比较输出,直到找到匹配的算法,您可以轻松地测试一个或多个关于其工作原理的假设。在reverseeengineering.stackexchange.com/上发布相同的问题合法吗?