weisuolong 发表于 2020-8-14 17:34

请问这段ida代码怎么反汇编呢

下面这段代码。怎么能想个办法,运行一下,看下参数啥的,方便看算法 具体是啥样的呢? 多谢各位了
__int64 __fastcall main(int argc, char** argv)
{
        signed __int64 v2; // r15
        char* array1; // rsi
        signed __int64 endPtrOfArray1; // rdi
        _DWORD* vectorInt2; // r14
        _DWORD* v6; // rbx
        _DWORD* v7; // rbx
        signed __int64 v8; // r15
        int* v9; // rdx
        int v10; // eax
        signed int v11; // eax
        int* v12; // rcx
        std::basic_ostream<char, std::char_traits<char> >* v13; // rax
        int* v14; // rcx
        unsigned __int64 v15; // rdx
        unsigned __int64 v16; // rdx
        unsigned __int64 v20; // rdi
        std::basic_ostream<char, std::char_traits<char> >* v25; // rax
        int v26; //
        __int128 Src; //
        int v28; //
        std::vector<int, std::allocator<int> > vectorInt1; //
        __int128 v30; //
        char* v31; //
        __int128 v32; //
        char* v33; //

        v30 = 0i64;
        _mm_storeu_si128((__m128i*) & Src, _mm_load_si128((const __m128i*) & _xmm));
        v2 = 5i64;
        v28 = 5;
        array1 = (char*)operator new(20ui64);
        *(_QWORD*)&v30 = array1;
        endPtrOfArray1 = (signed __int64)(array1 + 20);
        v31 = array1 + 20;
        memmove_0(array1, &Src, 0x14ui64);
        *((_QWORD*)&v30 + 1) = array1 + 20;
        v32 = 0i64;
        vectorInt2 = operator new(0x14ui64);
        *(_QWORD*)&v32 = vectorInt2;
        v33 = (char*)(vectorInt2 + 5);
        *(_OWORD*)vectorInt2 = 0i64;
        vectorInt2 = 0;
        *((_QWORD*)&v32 + 1) = vectorInt2 + 5;
        _mm_storeu_si128((__m128i*) & vectorInt1, (__m128i)0i64);
        vectorInt1._Mypair._Myval2._Myend = 0i64;
        v6 = vectorInt2;
        do
        {
                std::basic_istream<char, std::char_traits<char>>::operator>>(*(_QWORD*)std::cin.gap0, v6);
                ++v6;
                --v2;
        } while (v2);
        v7 = array1;
        if (array1 != (char*)endPtrOfArray1)
        {
                v8 = (char*)vectorInt2 - array1;
                v9 = vectorInt1._Mypair._Myval2._Mylast;
                do
                {
                        v10 = *v7 * *(_DWORD*)((char*)v7 + v8);
                        v26 = *v7 * *(_DWORD*)((char*)v7 + v8);
                        if (v9 == vectorInt1._Mypair._Myval2._Myend)
                        {
                                std::vector<int, std::allocator<int>>::_Emplace_reallocate<int>(&vectorInt1, v9, &v26);
                                v9 = vectorInt1._Mypair._Myval2._Mylast;
                        }
                        else
                        {
                                *v9 = v10;
                                v9 = vectorInt1._Mypair._Myval2._Mylast + 1;
                                ++vectorInt1._Mypair._Myval2._Mylast;
                        }
                        ++v7;
                } while (v7 != (_DWORD*)endPtrOfArray1);
        }
        v11 = 2;
        v12 = vectorInt1._Mypair._Myval2._Myfirst;
        do
        {
                if (*v12 != v11)
                {
                        v25 = std::operator<<<std::char_traits<char>>(
                                *(std::basic_ostream<char, std::char_traits<char> >**)std::cout.gap0,
                                "You failed!");
                        std::basic_ostream<char, std::char_traits<char>>::operator<<(v25, std::endl<char, std::char_traits<char>>);
                        exit(0);
                }
                v11 += 2;
                ++v12;
        } while (v11 < 12);
        v13 = std::operator<<<std::char_traits<char>>(
                *(std::basic_ostream<char, std::char_traits<char> >**)std::cout.gap0,
                "You win!");
        std::basic_ostream<char, std::char_traits<char>>::operator<<(v13, std::endl<char, std::char_traits<char>>);
        system("pause");
        v14 = vectorInt1._Mypair._Myval2._Myfirst;
        if (vectorInt1._Mypair._Myval2._Myfirst)
        {
                v15 = 4i64
                        * ((_QWORD)((char*)vectorInt1._Mypair._Myval2._Myend - (char*)vectorInt1._Mypair._Myval2._Myfirst) >> 2);
                if (v15 >= 0x1000)
                {
                        v15 += 39i64;
                        v14 = (int*)*((_QWORD*)vectorInt1._Mypair._Myval2._Myfirst - 1);
                        if ((unsigned __int64)((char*)vectorInt1._Mypair._Myval2._Myfirst - (char*)v14 - 8) > 0x1F)
                                _invalid_parameter_noinfo_noreturn();
                }
                operator delete(v14, v15);
                _mm_storeu_si128((__m128i*) & vectorInt1, (__m128i)0i64);
                vectorInt1._Mypair._Myval2._Myend = 0i64;
        }
        if (vectorInt2)
        {
                v16 = 20i64;
                operator delete(vectorInt2, v16);
        }
        if (array1)
        {
                v20 = 20i64;
                operator delete(array1, v20);
        }
        return 0i64;
}

weisuolong 发表于 2020-8-14 18:02

qzhsjz 发表于 2020-8-14 18:00
这就已经是反出来的C代码了,你还想要啥……

您看。我就想放到vs里能跑。这样我不是能看看。每一步怎么执行的,参数变化是啥。我能给点参数把算法逆向出来是不。哥,给瞧瞧成不

Deuez 发表于 2020-8-15 13:03

qzhsjz 发表于 2020-8-14 18:00

这就已经是反出来的C代码了,你还想要啥……

Deuez 发表于 2020-8-14 20:10

weisuolong 发表于 2020-8-15 09:12

Deuez 发表于 2020-8-14 20:10
IDA只能反编译成这样
这样的c语言伪代码已经够好看了的。



ida 可以动态调试 一段 伪代码? 能看传参啥的之类的么?

Deuez 发表于 2020-8-15 13:05

m8024936 发表于 2020-8-22 14:28

Deuez 发表于 2020-8-14 20:10
IDA只能反编译成这样
这样的c语言伪代码已经够好看了的。



兄弟怎么样联系

Deuez 发表于 2020-8-22 17:03

m8024936 发表于 2020-8-22 17:12

Deuez 发表于 2020-8-22 17:03
咋了?????

有个问题请教一下
页: [1] 2
查看完整版本: 请问这段ida代码怎么反汇编呢