Перейти к содержанию

Объясните код


Рекомендуемые сообщения

Решаю CrackMe с помощью .NET Reflector, нашел функцию, которая проверяет правильность, но не знаю C#. Времени погружаться в язык пока что нет. Не подскажете, как работает данная функция? 

 

Скрытый текст

[return: MarshalAs(UnmanagedType.U1)]
internal static unsafe bool modopt(CallConvCdecl) Check(basic_string<char,std::char_traits<char>,std::allocator<char> > modreq(IsCopyConstructed)* MD5, basic_string<char,std::char_traits<char>,std::allocator<char> > modreq(IsCopyConstructed)* Email)
{
    bool flag;
    try
    {
        try
        {
            basic_string<char,std::char_traits<char>,std::allocator<char> > local7;
            std.basic_string<char,std::char_traits<char>,std::allocator<char> >.{ctor}(&local7, &??_C@_00CNPNBAHC@?$AA@);
            try
            {
                sbyte modopt(IsSignUnspecifiedByte) modopt(IsConst)* numPtr;
                basic_string<char,std::char_traits<char>,std::allocator<char> > local;
                basic_string<char,std::char_traits<char>,std::allocator<char> > modopt(IsConst) local2;
                basic_string<char,std::char_traits<char>,std::allocator<char> > local3;
                basic_string<char,std::char_traits<char>,std::allocator<char> > local4;
                basic_string<char,std::char_traits<char>,std::allocator<char> > local5;
                basic_string<char,std::char_traits<char>,std::allocator<char> > modopt(IsConst) local6;
                int start = GetStart();
                basic_string<char,std::char_traits<char>,std::allocator<char> > modopt(IsConst)* localPtr7 = &local6;
                *((int*) (&local6 + 16)) = 0;
                *((int*) (&local6 + 20)) = 0;
                std.basic_string<char,std::char_traits<char>,std::allocator<char> >._Tidy(&local6, false, 0);
                std.basic_string<char,std::char_traits<char>,std::allocator<char> >.assign(&local6, Email, 0, uint.MaxValue);
                basic_string<char,std::char_traits<char>,std::allocator<char> >* localPtr4 = md5(&local5, &local6);
                try
                {
                    std.basic_string<char,std::char_traits<char>,std::allocator<char> >.=(Email, localPtr4);
                }
                fault
                {
                    ___CxxCallUnwindDtor(std.basic_string<char,std::char_traits<char>,std::allocator<char> >.{dtor}, (void*) &local5);
                }
                std.basic_string<char,std::char_traits<char>,std::allocator<char> >._Tidy(&local5, true, 0);
                basic_string<char,std::char_traits<char>,std::allocator<char> >* localPtr6 = &local4;
                *((int*) (&local4 + 0x10)) = 0;
                *((int*) (&local4 + 20)) = 0;
                std.basic_string<char,std::char_traits<char>,std::allocator<char> >._Tidy(&local4, false, 0);
                std.basic_string<char,std::char_traits<char>,std::allocator<char> >.assign(&local4, Email, 0, uint.MaxValue);
                basic_string<char,std::char_traits<char>,std::allocator<char> >* localPtr3 = GetString(&local3, (basic_string<char,std::char_traits<char>,std::allocator<char> > modreq(IsCopyConstructed)*) &local4, start);
                try
                {
                    std.basic_string<char,std::char_traits<char>,std::allocator<char> >.=(&local7, localPtr3);
                }
                fault
                {
                    ___CxxCallUnwindDtor(std.basic_string<char,std::char_traits<char>,std::allocator<char> >.{dtor}, (void*) &local3);
                }
                std.basic_string<char,std::char_traits<char>,std::allocator<char> >._Tidy(&local3, true, 0);
                basic_string<char,std::char_traits<char>,std::allocator<char> > modopt(IsConst)* localPtr5 = &local2;
                basic_string<char,std::char_traits<char>,std::allocator<char> >* modopt(IsConst) modopt(IsConst) str = std.basic_string<char,std::char_traits<char>,std::allocator<char> >.{ctor}(&local2, (basic_string<char,std::char_traits<char>,std::allocator<char> > modopt(IsConst)* modopt(IsImplicitlyDereferenced)) &local7);
                basic_string<char,std::char_traits<char>,std::allocator<char> >* localPtr = md5(&local, str);
                try
                {
                    std.basic_string<char,std::char_traits<char>,std::allocator<char> >.=(&local7, localPtr);
                }
                fault
                {
                    ___CxxCallUnwindDtor(std.basic_string<char,std::char_traits<char>,std::allocator<char> >.{dtor}, (void*) &local);
                }
                std.basic_string<char,std::char_traits<char>,std::allocator<char> >._Tidy(&local, true, 0);
                uint num = *((uint*) (MD5 + 16));
                if (16 <= *(((int*) (MD5 + 20))))
                {
                    numPtr = *((sbyte modopt(IsSignUnspecifiedByte) modopt(IsConst)**) MD5);
                }
                else
                {
                    numPtr = MD5;
                }
                flag = std.basic_string<char,std::char_traits<char>,std::allocator<char> >.compare((basic_string<char,std::char_traits<char>,std::allocator<char> > modopt(IsConst)* modopt(IsConst) modopt(IsConst)) &local7, 0, *((uint*) (&local7 + 16)), numPtr, num) == 0;
            }
            fault
            {
                ___CxxCallUnwindDtor(std.basic_string<char,std::char_traits<char>,std::allocator<char> >.{dtor}, (void*) &local7);
            }
            std.basic_string<char,std::char_traits<char>,std::allocator<char> >._Tidy(&local7, true, 0);
        }
        fault
        {
            ___CxxCallUnwindDtor(std.basic_string<char,std::char_traits<char>,std::allocator<char> >.{dtor}, MD5);
        }
        std.basic_string<char,std::char_traits<char>,std::allocator<char> >._Tidy(MD5, true, 0);
    }
    fault
    {
        ___CxxCallUnwindDtor(std.basic_string<char,std::char_traits<char>,std::allocator<char> >.{dtor}, Email);
    }
    std.basic_string<char,std::char_traits<char>,std::allocator<char> >._Tidy(Email, true, 0);
    return flag;
}

 

Изменено пользователем Dejavu
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.