Обратный инжиниринг исходного кода C из сборки

Я хотел бы знать, может ли кто-нибудь помочь мне с проблемой, с которой я сталкиваюсь при изучении одного из слайдов лекций вводного урока по сборке, который я хожу в школе. У меня проблема не в понимании сборки, а в том, как именно исходный код C упорядочен на основе сборки. Я опубликую фрагмент, о котором я говорю, и, возможно, он будет более понятен, о чем я говорю.

C Источник:

int arith(int x, int y, int z)
{ 
   int t1 = x+y;
   int t2 = z+t1;
   int t3 = x+4;
   int t4 = y * 48; 
   int t5 = t3 + t4;
   int rval = t2 * t5;
   return rval;
}

Сборка дана:

arith:
pushl %ebp
movl %esp,%ebp

movl 8(%ebp),%eax
movl 12(%ebp),%edx
leal (%edx,%eax),%ecx
leal (%edx,%edx,2),%edx
sall $4,%edx
addl 16(%ebp),%ecx
leal 4(%edx,%eax),%eax
imull %ecx,%eax

movl %ebp,%esp
popl %ebp
ret

Я просто не понимаю, как я могу различить, например, что добавление z + t1 ( z + x + y ) указан во второй строке (в источнике), когда в сборке он идет после y * 48 в коде сборки или, например, что x + 4 - это 3-я строка, когда в сборке она даже не является отдельной строкой, это как бы смешано с последним оператором leal . Для меня это имеет смысл, когда у меня есть источник, но я должен быть в состоянии воспроизвести источник для теста, и я понимаю, что компилятор оптимизирует вещи, но если у кого-то есть способ подумать о обратном проектировании, который мог бы мне помочь Я был бы очень признателен, если бы они могли провести меня через свой мыслительный процесс.

Спасибо.

5
задан AusCBloke 15 November 2011 в 04:18
поделиться