Декомпилятор С++

Тема в разделе "MS Visual C++", создана пользователем Vam, 18 июл 2008.

  1. Vam

    Vam Гость

    В стадии разработки находится проект "Декомпилятор С++", представляющий плагин к IDA. Расписывать не буду, что он может делать, а что нет. Приведу промежуточный результат автоматического декомпилирования произвольной функции.
    Вариант IDA:
    [codebox].text:00680C50 zQUEUE_zSTRING___Push proc near ; CODE XREF: j_zQUEUE_zSTRING___Pushj
    .text:00680C50
    .text:00680C50 var_64 = byte ptr -64h
    .text:00680C50 var_24 = dword ptr -24h
    .text:00680C50 var_20 = dword ptr -20h
    .text:00680C50 var_1C = dword ptr -1Ch
    .text:00680C50 var_18 = dword ptr -18h
    .text:00680C50 var_14 = dword ptr -14h
    .text:00680C50 var_10 = dword ptr -10h
    .text:00680C50 var_C = dword ptr -0Ch
    .text:00680C50 var_4 = dword ptr -4
    .text:00680C50 arg_0 = dword ptr 8
    .text:00680C50
    .text:00680C50 push ebp
    .text:00680C51 mov ebp, esp
    .text:00680C53 push 0FFFFFFFFh
    .text:00680C55 push offset unknown_libname_1738 ; Microsoft VisualC 2-8/net runtime
    .text:00680C5A mov eax, large fs:0
    .text:00680C60 push eax
    .text:00680C61 mov large fs:0, esp
    .text:00680C68 sub esp, 58h
    .text:00680C6B push ebx
    .text:00680C6C push esi
    .text:00680C6D push edi
    .text:00680C6E push ecx
    .text:00680C6F lea edi, [ebp+var_64]
    .text:00680C72 mov ecx, 16h
    .text:00680C77 mov eax, 0CCCCCCCCh
    .text:00680C7C rep stosd
    .text:00680C7E pop ecx
    .text:00680C7F mov [ebp+var_10], ecx
    .text:00680C82 mov eax, [ebp+var_10]
    .text:00680C85 mov ecx, [eax+8]
    .text:00680C88 mov edx, [ebp+var_10]
    .text:00680C8B mov eax, [ecx+8]
    .text:00680C8E cmp eax, [edx+4]
    .text:00680C91 jnz short loc_680CFB
    .text:00680C93 mov ecx, [ebp+var_10]
    .text:00680C96 mov edx, [ecx+8]
    .text:00680C99 mov [ebp+var_14], edx
    .text:00680C9C mov [ebp+var_18], 0
    .text:00680CA3 jmp short loc_680CAE
    .text:00680CA5 ; ---------------------------------------------------------------------------
    .text:00680CA5
    .text:00680CA5 loc_680CA5: ; CODE XREF: zQUEUE_zSTRING___Push+A9j
    .text:00680CA5 mov eax, [ebp+var_18]
    .text:00680CA8 add eax, 1
    .text:00680CAB mov [ebp+var_18], eax
    .text:00680CAE
    .text:00680CAE loc_680CAE: ; CODE XREF: zQUEUE_zSTRING___Push+53j
    .text:00680CAE cmp [ebp+var_18], 0Bh
    .text:00680CB2 jge short loc_680CFB
    .text:00680CB4 push 10h ; unsigned int
    .text:00680CB6 call ??2@YAPAXI@Z ; operator new(uint)
    .text:00680CBB add esp, 4
    .text:00680CBE mov [ebp+var_20], eax
    .text:00680CC1 mov [ebp+var_4], 0
    .text:00680CC8 cmp [ebp+var_20], 0
    .text:00680CCC jz short loc_680CDF
    .text:00680CCE mov ecx, [ebp+var_14]
    .text:00680CD1 push ecx
    .text:00680CD2 mov ecx, [ebp+var_20]
    .text:00680CD5 call j_zQUEUE_ITEM_zSTRING___zQUEUE_ITEM_zSTRING_
    .text:00680CDA mov [ebp+var_24], eax
    .text:00680CDD jmp short loc_680CE6
    .text:00680CDF ; ---------------------------------------------------------------------------
    .text:00680CDF
    .text:00680CDF loc_680CDF: ; CODE XREF: zQUEUE_zSTRING___Push+7Cj
    .text:00680CDF mov [ebp+var_24], 0
    .text:00680CE6
    .text:00680CE6 loc_680CE6: ; CODE XREF: zQUEUE_zSTRING___Push+8Dj
    .text:00680CE6 mov edx, [ebp+var_24]
    .text:00680CE9 mov [ebp+var_1C], edx
    .text:00680CEC mov [ebp+var_4], 0FFFFFFFFh
    .text:00680CF3 mov eax, [ebp+var_1C]
    .text:00680CF6 mov [ebp+var_14], eax
    .text:00680CF9 jmp short loc_680CA5
    .text:00680CFB ; ---------------------------------------------------------------------------
    .text:00680CFB
    .text:00680CFB loc_680CFB: ; CODE XREF: zQUEUE_zSTRING___Push+41j
    .text:00680CFB ; zQUEUE_zSTRING___Push+62j
    .text:00680CFB mov ecx, [ebp+var_10]
    .text:00680CFE mov edx, [ecx+8]
    .text:00680D01 cmp dword ptr [edx], 0
    .text:00680D04 jnz short loc_680D15
    .text:00680D06 mov eax, [ebp+var_10]
    .text:00680D09 mov ecx, [eax+8]
    .text:00680D0C mov edx, [ebp+var_10]
    .text:00680D0F mov eax, [ecx+8]
    .text:00680D12 mov [edx+8], eax
    .text:00680D15
    .text:00680D15 loc_680D15: ; CODE XREF: zQUEUE_zSTRING___Push+B4j
    .text:00680D15 mov ecx, [ebp+var_10]
    .text:00680D18 mov edx, [ecx+8]
    .text:00680D1B mov dword ptr [edx], 0
    .text:00680D21 mov eax, [ebp+var_10]
    .text:00680D24 mov ecx, [eax+8]
    .text:00680D27 mov edx, [ebp+arg_0]
    .text:00680D2A mov [ecx+4], edx
    .text:00680D2D mov eax, [ebp+var_10]
    .text:00680D30 mov ecx, [eax]
    .text:00680D32 add ecx, 1
    .text:00680D35 mov edx, [ebp+var_10]
    .text:00680D38 mov [edx], ecx
    .text:00680D3A mov ecx, [ebp+var_C]
    .text:00680D3D mov large fs:0, ecx
    .text:00680D44 pop edi
    .text:00680D45 pop esi
    .text:00680D46 pop ebx
    .text:00680D47 add esp, 64h
    .text:00680D4A cmp ebp, esp
    .text:00680D4C call __chkesp
    .text:00680D51 mov esp, ebp
    .text:00680D53 pop ebp
    .text:00680D54 retn 4
    .text:00680D54 zQUEUE_zSTRING___Push endp[/codebox]

    Результат после четвертого прохода декомпилятора:
    [codebox]void zQUEUE<zSTRING>::push(zSTRING* obj)
    {
    memset(var64, -858993460, 0x16);
    this = this;
    if(m_pCurrentItem->m_pPrev == m_pEndItem)
    pItem = m_pCurrentItem;
    for(i = 0; i < 11; i = i + 1)
    var20 = operator new(16);
    if(var20)
    var24 = ((zQUEUE_ITEM<zSTRING>*)var20)->zQUEUE_ITEM<zSTRING>(pItem);
    else
    var24 = 0;
    var1C = var24;
    pItem = var1C;
    if(!m_pCurrentItem->m_bEmpty)
    m_pCurrentItem = m_pCurrentItem->m_pPrev;
    m_pCurrentItem->m_bEmpty = 0;
    m_pCurrentItem->m_pData = obj;
    m_nSize = m_nSize + 1;
    }[/codebox]

    Ограничения на сегодняшний день:
    - Присутствие полной дебаг информации в любом виде и формате.
    - Декомпилируются только файлы, созданные VisualStudio.

    Следующие этапы разработки:
    1. Адаптация декомпилятора к минимальной дебаг информации.
    2. Адаптация декомпилятора к полному отсутствию дебаг информации.
    3. Интерактивный интерфейс с IDA.

    Если кого-то заинтересовал этот проект и у него есть желание, свободное время и способности, то добро пожаловать в команду для реализации этапа 3.
     
  2. Ockonal

    Ockonal Гость

    Вы бы показали подробней что :) Есть ли сайт? Как лучше связаться...
     
  3. Vam

    Vam Гость

    Ockonal
    Подробнее что? Кое-что можно посмотреть здесь.
    Сайта пока нет, это вопрос будущего.
    Связаться можно и через личку, если есть интерес.
     
  4. Cycle

    Cycle Гость

    Есть 2 вопроса:
    1. Что это за шаблон zQUEUE_ITEM<zSTRING>?
    2. Полученный код можно потом скомпилировать и получить работоспособную программу? Или Ваша зада получить более читаемый код, чем ассемблер?
     
  5. Vam

    Vam Гость

    Cycle
    Это конкретная реализация (тело) функции шаблона для параметра zSTRING, т.е. декларация шаблона будет - template<class T>..., где Т в данном случае есть zSTRING.
    Как известно, после компиляции шаблона в исполняемый код программы включаются все его реализации для конкретных параметров. Декомпилятор сначала получает эти реализации, затем планируется провести их анализ и создать общую шаблонную функцию.

    Это конечная задача.

    Это промежуточная задача.
     
Загрузка...

Поделиться этой страницей