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

  • Автор темы Vam
  • Дата начала
V

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.
 
O

Ockonal

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

Vam

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

Cycle

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

Vam

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

2. Полученный код можно потом скомпилировать и получить работоспособную программу?
Это конечная задача.

Или Ваша задача получить более читаемый код, чем ассемблер?
Это промежуточная задача.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!