LINUX.ORG.RU

Помогите x86 ASM to C

 , ,


0

2

http://codepad.org/u0TAAljG

Остановился на таком варианте, но он работает не правильно:

void e_change(int arg0)
{
    unsigned int d;
    unsigned char c = 4;
    unsigned char a = 0;
    unsigned char desr0 = arg0;

    do
    {
        d = c-1;
        if ( d <= 3 )
            d = 7;

        if ( msg[d] & 1 )
            d = (msg[c] >> 1) | 0xFFFFFF80;
        else
            d = msg[c] >> 1;
        
        tmp[a] = SubKey[(desr0 << 3) + a] ^ (d >> 2);
        ++a;
        
        d = c+1;
        
        if ( d > 7 )
            d = 4;
        
        if ( (msg[d]) == 0 )
            d = msg[c] << 1;
        else
            d = (msg[c] << 1) + 1;
        tmp[a] = SubKey[(desr0 << 3) + a] ^ d;
        ++a;
        ++c;
    }
    while ( a <= 7u );
}

Чяднт?

★★★
if ( (msg[d] & 0x80) == 0 )

помогло, правда не понял, почему

mov     edx, ds:(msg_ptr - 2A28h)[ebx]
movzx   eax, [ebp+d]
cmp     byte ptr [edx+eax], 0
jns     short loc_F91

как звучит следующее условие?

cmp     byte ptr [edx+eax], 0
jns     short loc_F91

Я понял, если бы было что-то типа:

test eax, eax
jns loc_f91

// x86 асму знаю плохо

vova7890 ★★★
() автор топика
Последнее исправление: vova7890 (всего исправлений: 1)
Ответ на: комментарий от vova7890

cmp вычитает из левого аргумента правый, устанавливает флаги, результат никуда не записывает. Дальше идёт условный прыжок (в зависмости от флага). Аргумент здесь — байт в памяти по адресу [edx+eax].

В итоге прыжок происходит, когда старший бит байта по адресу [edx+eax] равен нулю.

luke ★★★★★
()

а че в IDA задействовать hexrays проблема?

anonymous
()

кокоптимизации

mov     [ebp+d], al
cmp     [ebp+d], 3
movzx   eax, [ebp+d]
movzx   eax, byte ptr [edx+eax]
and     eax, 1
test    eax, eax
shl     eax, 3
lea     edx, [eax+edx]

Сразу видно, что код писал человек. Любой вменяемый компилятор никогда бы такой чуши не выдал.

mix_mix ★★★★★
()
Ответ на: комментарий от anonymous

IDA и есть, просто ОП реверсит бинарь, но тот код писал явно человек:

  • Мы записали содержимое регистра в память, зачем снова лезть в память при сравнении?
  • Автор явно любит movzx, и вторая явно излишняя, в старших разрядах уже и так будут нули;
  • Опять излишество, and сама выставляет флаги (SF, ZF и PF), test здесь просто не нужна;
  • Косвенная адресация умеет в множители: [edx+eax*8], подобное же использование lea просто идиотизм.
mix_mix ★★★★★
()
Ответ на: комментарий от anonymous

Нет. Банально из-за этого.

call    $+5
pop     ebx
Ни один компилятор так PIC не делает. Ну и достаточно пропустить кода ОПа через gcc, чтобы в этом убедиться. Некоторые перлы, вроде 1 и 3 при -O0, конечно, присутствуют (при -O1 уже, разумеется, нет), но даже без всех оптимизаций компилятор не позволяет себе делать бессмысленные lea и два раза подряд вставлять movzx в один регистр.

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

может быть древний гцц на -O0. Чёт я сомневаюсь, что там всё руками написано. Всё похоже на эту функцию, везде call $+5, и не грамотное юзание инструкций/регистров. Оч похоже на O0

vova7890 ★★★
() автор топика
Ответ на: комментарий от luke

В итоге прыжок происходит, когда старший бит байта по адресу [edx+eax] равен нулю.

как раз не понятно, почему старший бит, ведь cmp достаёт байт и сравнивает его с нулём?

vova7890 ★★★
() автор топика
Последнее исправление: vova7890 (всего исправлений: 1)
Ответ на: комментарий от no-such-file

а, cmp выставляет эти флаги... Теперь понятно

vova7890 ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.