我正在对用托管 C++/C# 编写的 CrackMe 进行逆向工程。参数是“字符串”(在这种情况下是电子邮件)和“串行”。串行在某种程度上取决于字符串,我需要了解如何。
我使用 dnSpy 反汇编程序,发现 onClick 函数开始检查序列是否正确:button2_onClick
在这个函数的末尾,我们可以看到一个布尔函数 Check(),true如果序列是正确的,它会返回:Check()
因为我是逆向工程的新手(尤其是 .NET 应用程序的 RE),所以我需要一些关于我们可以在这两个函数中看到的反编译代码的解释:
1)具体做什么
md = <Module>.std.basic_string<char,std::char_traits<char>,std::allocator<char>\u0020>.{ctor}(ref basic_string<char,std::char_traits<char>,std::allocator<char>\u0020>4, ref basic_string<char,std::char_traits<char>,std::allocator<char>\u0020>2);
是指第 25 行button2_onClick吗?我知道这是某种类型的任务,但仅此而已。
2) 这些行(第 14、15 行等Check())是做什么的?
*(ref basic_string<char,std::char_traits<char>,std::allocator<char>\u0020>2 + 16) = 0;
*(ref basic_string<char,std::char_traits<char>,std::allocator<char>\u0020>2 + 20) = 0;
3) 数字(行尾附近的 5、6、7)是什么意思?
<Module>.std.basic_string<char,std::char_traits<char>,std::allocator<char>\u0020>._Tidy(ref basic_string<char,std::char_traits<char>,std::allocator<char>\u0020>5, true, 0u);
basic_string<char,std::char_traits<char>,std::allocator<char>\u0020> basic_string<char,std::char_traits<char>,std::allocator<char>\u0020>6;
basic_string<char,std::char_traits<char>,std::allocator<char>\u0020>* right2 = <Module>.md5(&basic_string<char,std::char_traits<char>,std::allocator<char>\u0020>7, str);
4)它只是变相的两个字符串的比较吗?
result =(<Module>.std.basic_string<char,std::char_traits<char>,std::allocator<char>\u0020>.compare(ref basic_string<char,std::char_traits<char>,std::allocator<char>\u0020>, 0u, (uint)(*(ref basic_string<char,std::char_traits<char>,std::allocator<char>\u0020> + 16)), ptr, count) == 0);
5)也许有一种我不知道的更简单的方法来解决这个问题?我首先尝试像往常一样使用 IDA,但这在这种情况下并没有真正的帮助。

