2016-10-16 18 views
2

Я компиляция файла сборки TASM (будут работать в защищенном режиме) с этой функцией, которая использует глобальные переменные:Hex-лучи неудовлетворительных декомпилировать код сборки с использованием массива

array dd 0,29535,29535,29096,27889,35168,39271,24798,29855,29772,38197,22395 
dd 56219,56131,56121,56133,24256,24229,24412,51616,37038,28755,29069,28107,46700,31766,30517,35050,33790,00000,0000,64000,64000,64000,64000,64000 
dd 32190,10299,64000,25841,9185,25203,24473,25203,39396,64000,64000,64000,64000,64000,64000,64000,64000,15266,50285,25477,64000,64000 
dd -1 

adderVar EQU 0255442 

result dd ? 

modifyList proc near 
PUSHAD 
PUSH DS ES 
mov edi,offset array 
mov eax,adderVar 
e: 
cmp dword ptr [edi],-1 
je f 
add dword ptr eax,[edi] 
mov dword ptr [edi],eax 
add edi,4 
jmp e 
f: 
mov [result],eax 
POP ES DS 
POPAD 
ret 
modifyList endp 

Этот код добавляет фиксированное значение (adderVar) к первому элементу массива, а затем сумма всех предыдущих элементов для последующих, останавливаясь на конечном разделителе (-1).

Загрузка .OBJ файл в IDA и создание файла C помощью Hex-лучи генерирует этот код:

int dword_3408E = 0; // weak 
int dword_34092 = 29535; // weak 
int dword_34096 = 29535; // weak 
int dword_3409A = 29096; // weak 
int dword_3409E = 27889; // weak 
int dword_340A2 = 35168; // weak 
int dword_340A6 = 39271; // weak 
int dword_340AA = 24798; // weak 
int dword_340AE = 29855; // weak 
int dword_340B2 = 29772; // weak 
int dword_340B6 = 38197; // weak 
int dword_340BA = 22395; // weak 
int dword_340BE = 56219; // weak 
int dword_340C2 = 56131; // weak 
int dword_340C6 = 56121; // weak 
int dword_340CA = 56133; // weak 
int dword_340CE = 24256; // weak 
int dword_340D2 = 24229; // weak 
int dword_340D6 = 24412; // weak 
int dword_340DA = 51616; // weak 
int dword_340DE = 37038; // weak 
int dword_340E2 = 28755; // weak 
int dword_340E6 = 29069; // weak 
int dword_340EA = 28107; // weak 
int dword_340EE = 46700; // weak 
int dword_340F2 = 31766; // weak 
int dword_340F6 = 30517; // weak 
int dword_340FA = 35050; // weak 
int dword_3411A = 64000; // weak 
int dword_3411E = 32190; // weak 
int dword_34126 = 64000; // weak 
int dword_3412A = 25841; // weak 
int dword_3412E = 9185; // weak 
int dword_34132 = 25203; // weak 
int dword_34136 = 24473; // weak 
int dword_3413A = 25203; // weak 
int dword_3415E = 64000; // weak 
int dword_34162 = 15266; // weak 
int dword_34166 = 50285; // weak 
int dword_3417A; // weak 


__int64 __usercall [email protected]<edx:eax>(__int64 [email protected]<edx:eax>) 
{ 
    int *v1; // [email protected] 
    signed int v2; // [email protected] 
    __int64 v4; // [sp-20h] [bp-20h]@1 

    v4 = a1; 
    v1 = &dword_3408E; 
    v2 = 255442; 
    while (*v1 != -1) 
    { 
    v2 += *v1; 
    *v1 = v2; 
    ++v1; 
    } 
    dword_3417A = v2; 
    return v4; 
} 
// 3408E: using guessed type int dword_3408E; 
// 3417A: using guessed type int dword_3417A; 

Кажется, что значения 25477,64000,64000 и -1 ограничитель отсутствуют в переменные, и что код C предполагает, что все int будут смежными.

Может ли кто-нибудь угадать, что вызывает повреждение Hex-лучей, и как изменить код сборки, чтобы иметь правильный вывод C?

+0

С помощью 'add dword ptr eax, [edi]; mov dword ptr [edi], eax' вы просто записываете текущую сумму обратно в массив? –

+0

Да, спасибо за это, я собираюсь изменить свой вопрос. – franck

+1

В код сборки нет эквивалентного кода C. Обычно декомпиляция на C может работать только в том случае, если она была первоначально скомпилирована из C, и даже тогда есть много причин, почему она может потерпеть неудачу. Вы можете получить лучшие результаты, выровняв массив, так как компилятор C даст ему адрес, который является даже кратным 4. Удаление всех команд push и pop также может помочь. Сохранение и восстановление регистров сегментов бесполезно, но сохранение остальных регистров может не быть. –

ответ

1

Вы можете преобразовать dword_3408E в массив в окне сборки. После этого переанализируйте код в окне Hex-Rays с помощью F5 или другой горячей клавиши, если вы изменили значения по умолчанию, поэтому Hex-Rays также покажут это как массив.

Другое дело. Прототип для вашей функции также неверен. Он должен быть «void sub_167AA()», потому что вы не используете параметры и возвращаемое значение, а глобальные переменные.

0

Hex-rays doesn't work properly with manually crafted code. Я заметил некоторые отличия при попытке загрузить Nasm ELF/DWARF .OBJ, но результат все еще плох.

В настоящее время декомпилятор может обрабатывать сгенерированный код компилятора. В ручном режиме созданный код может быть декомпилирован, но результаты обычно хуже , чем для кода компилятора.