Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Декомпилятор С++
Форум программистов > Системное программирование > C, С++ и С Builder > MS Visual C++
Vam
В стадии разработки находится проект "Декомпилятор С++", представляющий плагин к IDA. Расписывать не буду, что он может делать, а что нет. Приведу промежуточный результат автоматического декомпилирования произвольной функции.
Вариант IDA:
CODE
.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


Результат после четвертого прохода декомпилятора:
CODE
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;
}


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

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

Если кого-то заинтересовал этот проект и у него есть желание, свободное время и способности, то добро пожаловать в команду для реализации этапа 3.
Ockonal
Вы бы показали подробней что smile.gif Есть ли сайт? Как лучше связаться...
Vam
Ockonal
Цитата
Вы бы показали подробней что Есть ли сайт? Как лучше связаться...

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

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

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

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

Цитата
Или Ваша задача получить более читаемый код, чем ассемблер?

Это промежуточная задача.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.