Декомпиляция C/C++
От: nixxxin  
Дата: 16.01.08 08:53
Оценка:
Народ, чем декомпильнуть утилитку небольшую? За несколько лет исходники потерял, щас есть интерес их восстановить. Видел уже ветки на эту тему. Народ смеется/стебется над авторами что это невозможно Но я не верю
Попробовал RecStudio, структуру программы видно, видны вызовы системных функций, но много ассемблерного мусора про возню на стеке. По идее можно было бы это разобрать в локальные переменные.

Тут еще ничего, понятно, что это sprintf
        GetLocalTime(ebp - 0x30);
        ecx = *(ebp - 0x24);
        edx = *(ebp - 0x26);
        eax = *(ebp - 0x28);
        ecx = ecx & 65535;
        edx = edx & 65535;
        (save)ecx;
        ecx = *(ebp - 0x30);
        eax = eax & 65535;
        (save)edx;
        edx = *(ebp - 0x2e);
        (save)eax;
        eax = *(ebp - 0x2a);
        ecx = ecx & 65535;
        edx = edx & 65535;
        (save)ecx;
        (save)edx;
        (save)eax & 65535;
        (save)"%02d_%02d_%02d-%02d_%02d_%02d";
        (save)ebp + -1024;
        L00401BF4();


А это уже тяжко
        al = *(ebp + 0x13);
        if(al == 0) {
            ecx = *(ebp - 0xc);
            *fs:0x0] = ecx;
            (restore)edi;
            (restore)esi;
            (restore)ebx;
            (restore)ebp;
            return 1;
        }
        if(*(ebp + -764) == 0x22) {
            edi = ebp + -764;
            ecx = ecx | -1;
            eax = 0;
            edx = ebp + -763;
            asm("repne scasb");
            ecx = !ecx - 1;
            *(ebp + 8) = edx;
            *(ebp + ecx + -765) = al;
        } else {
            edx = *(ebp + 8);
        }


Еще пробовал Boomerang — эта зараза падает на стадии декомпиляции
Скачал Neuron PE Disassembler — вообще не понял как пользоваться, и никакого хелпа нет

Что еще можно попробовать? Не охота долго возиться с ассемблером...
Re: Декомпиляция C/C++
От: Bell Россия  
Дата: 16.01.08 08:55
Оценка:
Здравствуйте, nixxxin, Вы писали:

N>Что еще можно попробовать? Не охота долго возиться с ассемблером...


SoftICE ?
Любите книгу — источник знаний (с) М.Горький
Re[2]: Декомпиляция C/C++
От: nixxxin  
Дата: 16.01.08 09:03
Оценка:
Здравствуйте, Bell, Вы писали:

B>SoftICE ?


А он уже умеет в C декомпилировать? Или ты предлагаешь в дебаге походить и увидеть как и что там делается на уровне ассемблера?
Re[3]: Декомпиляция C/C++
От: Bell Россия  
Дата: 16.01.08 09:10
Оценка:
Здравствуйте, nixxxin, Вы писали:

N>А он уже умеет в C декомпилировать? Или ты предлагаешь в дебаге походить и увидеть как и что там делается на уровне ассемблера?

Не знаю — сам не пользовался. Сказал потому, что знакомые очень хорошо о нем отзывались.
Любите книгу — источник знаний (с) М.Горький
Re[4]: Декомпиляция C/C++
От: nixxxin  
Дата: 16.01.08 09:22
Оценка:
Здравствуйте, Bell, Вы писали:

N>>А он уже умеет в C декомпилировать? Или ты предлагаешь в дебаге походить и увидеть как и что там делается на уровне ассемблера?

B>Не знаю — сам не пользовался. Сказал потому, что знакомые очень хорошо о нем отзывались.

Я им с 2001-го года не пользовался, но раньше это был просто навороченный дебаггер. Дебаггер — это запасной аэродром Хочется все же получить что-то более-менее читаемое автоматически.
Re[5]: Декомпиляция C/C++
От: Conr Россия  
Дата: 16.01.08 09:54
Оценка: 3 (1)
Здравствуйте, nixxxin, Вы писали:

N>>>А он уже умеет в C декомпилировать? Или ты предлагаешь в дебаге походить и увидеть как и что там делается на уровне ассемблера?

B>>Не знаю — сам не пользовался. Сказал потому, что знакомые очень хорошо о нем отзывались.

N>Я им с 2001-го года не пользовался, но раньше это был просто навороченный дебаггер. Дебаггер — это запасной аэродром Хочется все же получить что-то более-менее читаемое автоматически.

Автоматически — это утопия Имхо, лучшее что есть — Hex-Rays (http://www.hex-rays.com/decompiler.shtml)
Re: Декомпиляция C/C++
От: Sergey Россия  
Дата: 16.01.08 09:54
Оценка:
"nixxxin" <44513@users.rsdn.ru> wrote in message news:2798185@news.rsdn.ru...
> Народ, чем декомпильнуть утилитку небольшую? За несколько лет исходники потерял, щас есть интерес их восстановить. Видел уже ветки на эту тему. Народ смеется/стебется над авторами что это невозможно Но я не верю
> Попробовал RecStudio, структуру программы видно, видны вызовы системных функций, но много ассемблерного мусора про возню на стеке. По идее можно было бы это разобрать в локальные переменные.
>

> Еще пробовал Boomerang — эта зараза падает на стадии декомпиляции

> Скачал Neuron PE Disassembler — вообще не понял как пользоваться, и никакого хелпа нет
>
> Что еще можно попробовать? Не охота долго возиться с ассемблером...

Из дизассемблеров безусловный лидер (IMHO) IDA. Можно вручную определять локальные переменные (кнопка k вроде) — если функция с ebp-frame'ом. От того же автора есть декомпилятор HexRays, но как он в деле — х.з.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Декомпиляция C/C++
От: Plague Россия 177230800
Дата: 16.01.08 10:05
Оценка:
Как правильно сказал выше Sergey, IDA — это твой случай. Интерактивный дизассемблер все-таки.
Декомпиляцию произвести не возможно, но какие-то алгоритмы и прочее вычерпать можно.

Очень удобно выделять и именовать функции, переменные локальные и глобальные, комментировать.. видеть структуру кода...
Очень удобная штука для реверс-инжиниринга.
... << RSDN@Home 1.2.0 alpha rev. 787>>
Re[6]: Декомпиляция C/C++
От: nixxxin  
Дата: 16.01.08 10:41
Оценка:
Здравствуйте, Conr, Вы писали:

C>Автоматически — это утопия Имхо, лучшее что есть — Hex-Rays (http://www.hex-rays.com/decompiler.shtml)


Почему же утопия, если этот Hex-Rays как раз это и делает. Судя по примерам — то что доктор прописал (http://www.hex-rays.com/compare.shtml). Все локальные переменные восстановлены, просто супер!
Но за $2300 (+еще лицензия на IDA) мою утилитку можно 10 раз заново написать
Re[7]: Декомпиляция C/C++
От: Conr Россия  
Дата: 16.01.08 11:24
Оценка:
Здравствуйте, nixxxin, Вы писали:

C>>Автоматически — это утопия Имхо, лучшее что есть — Hex-Rays (http://www.hex-rays.com/decompiler.shtml)

N>Почему же утопия, если этот Hex-Rays как раз это и делает. Судя по примерам — то что доктор прописал (http://www.hex-rays.com/compare.shtml). Все локальные переменные восстановлены, просто супер!
В сложных случаях приходится ему помогать. А в легких нет особого смысла им пользоваться из-за цены

N>Но за $2300 (+еще лицензия на IDA) мою утилитку можно 10 раз заново написать

Значит случай легкий
Re: Декомпиляция C/C++
От: MShura  
Дата: 16.01.08 12:00
Оценка:
N>Тут еще ничего, понятно, что это sprintf
<skip>


  SYSTEMTIME st;
  char local_buffer[1024-48];

  GetLocalTime( &st);
  sprintf( local_buffer, "%02d_%02d_%02d-%02d_%02d_%02d",
           st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond );


N>А это уже тяжко

N>
N>        al = *(ebp + 0x13);
N>        if(al == 0) {
N>            ecx = *(ebp - 0xc);
N>            *fs:0x0] = ecx;
N>            (restore)edi;
N>            (restore)esi;
N>            (restore)ebx;
N>            (restore)ebp;
N>            return 1;
N>        }
N>        if(*(ebp + -764) == 0x22) {
N>            edi = ebp + -764;
N>            ecx = ecx | -1;
N>            eax = 0;
N>            edx = ebp + -763;
N>            asm("repne scasb");
N>            ecx = !ecx - 1;
N>            *(ebp + 8) = edx;
N>            *(ebp + ecx + -765) = al;
N>        } else {
N>            edx = *(ebp + 8);
N>        }
N>


Примерно так.
Чтобы писать более конкретно нужно видеть всю функцию, а не фрагмент.

    func( char* end,....., char hz, ... )
   {
    char buffer[766];
    __try{
     ....
     if ( 0 == hz )
     {
        return 1;
     }
     if ( 0x22 == buffer[764] )
     {
       len = strlen( buffer + 1 );
       edx = buffer + len;
       *end = edx;
       buffer[len-1] = hz;
     } else {
       edx = *end;
     }
     .....
   }


N>Что еще можно попробовать? Не охота долго возиться с ассемблером...

Только голову, вернее мозг.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.