反向代码检查

逆向工程 C#
2021-06-16 09:51:43

我目前只修补此代码以返回 true,你们知道我如何开始制作生成器来制作有效代码吗?我无法理解这里的逻辑。

  public static bool ValidateQrCode(string code)
    {
        if (code.Substring(0, 2) != "DC")
        {
            return false;
        }
        if (code.Length != 0x1a)
        {
            return false;
        }
        string s = code.Substring(2, 14);
        byte[] buffer1 = new SHA256Managed().ComputeHash(Encoding.UTF8.GetBytes(s));
        string str2 = ConvertToB36(Convert.ToInt32(buffer1[13])).PadLeft(2, '0');
        string str3 = ConvertToB36(Convert.ToInt32(buffer1[10])).PadLeft(2, '0');
        string str4 = ConvertToB36(Convert.ToInt32(buffer1[5])).PadLeft(2, '0');
        string str5 = ConvertToB36(Convert.ToInt32(buffer1[0x11])).PadLeft(2, '0');
        string str6 = ConvertToB36(Convert.ToInt32(buffer1[0x19])).PadLeft(2, '0');
        return ((((code.Substring(0x10, 2) == str2) && (code.Substring(0x12, 2) == str3)) && ((code.Substring(20, 2) == str4) && (code.Substring(0x16, 2) == str5))) && (code.Substring(0x18, 2) == str6));
    }
    public static string ConvertToB36(int value)
    {
        string str = "";
        while (value > 0)
        {
            str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[value % 0x24].ToString() + str;
            value /= 0x24;
        }
        return str;
    }
1个回答

好吧,算法很简单,让我们尝试分解它:

if (code.Substring(0, 2) != "DC")

它必须从DC开始

如果(代码。长度!= 0x1a)

并且长度为 26 个字符

string s = code.Substring(2, 14);

byte[] buffer1 = new SHA256Managed().ComputeHash(Encoding.UTF8.GetBytes(s));

然后从第三个(跳过 DC)开始取 14 个字符并在其上计算 SHA256。

之后,支票是(提取)

string str2 = ConvertToB36(Convert.ToInt32(buffer1[13])).PadLeft(2, '0');

code.Substring(0x10, 2) == str2

所以 13 索引的值SHA必须等于(转换为BASE36)到从 pos 16 开始的输入中的 2 个字符。

其余检查类似。

因此,您的注册机将仅包含您在代码中已有的功能。

所以一般的key就是这种形式(伪代码)

input = ""
sha = SHA256(input)
print "DC"+input+sha[13].encode('base36')+sha[10].encode('base36')+sha[5].encode('base36')+sha[17].encode('base36')+sha[25].encode('base36')