Pull to refresh

Comments 21

А каким компилятором и с какими флагами компилировался исходный код?
Компилируем при помощи gcc. Команда gcc -m32 prog_if.c -o prog_if. -m32 означает, что компилироваться код будет под архитектуру x86.
А вы не пробовали вместо дизассемблера использовать листинг, сгенерированный компилятором? Там почти возле каждой ассемблерной инструкции можно видеть, из какого C-кода она сгенерирована. Также есть осмысленные названия функций и переменных.
При дизассемблировании программ не всегда доступен исходный код. Это не пост про отладку программ. Я представлял, что исходных кодов нет.
Интересно, существуют ли условия, при которых компилятор поймет, что в длинном switch выгоднее использовать поиск индекса значения в массиве для case, и косвенный переход по синхронной с ним таблице адресов обработчиков этих кейзов? Я уже основательно забыл ассемблер x86, но на память это что-то вроде SCAS и дальше JMP [base + reg]

Это было реализовано ещё в компиляторах прошлого века: бинарный поиск + массивы для плотно расположенных меток. Собственно, это достаточно простая оптимизация с точки зрения реализации и, при этом, даёт заметный выигрыш в скорости. Потому в компиляторах 90-х она уже и была реализована.


P.S. Вероятно, не в малой степени из-за взрывного распространения GUI в 90-х с его case-switch event loop: и в X11, и в Win16, и в Win32 это так (API OS/2 плохо помню, но, по-моему, там так же).


P.P.S. А, и да, автор поделился радостью исследования кода, генерируемого GCC без оптимизации. Только вот это не имеет никакого отношения к реальной обратной разработке: тот же GCC без -O1/-O2 для конечного продукта практически не используется и упомянутая оптимизация case-switch там есть.

UFO just landed and posted this here
При дизассемблировании программ не всегда доступен исходный код.

Ошибка в названии статьи, в первом предложении — дальше читать не стал.

Хорошо. Название поменяю :)

<sаrcasm>
Написал на C
, собрал
Выдернул листинг
Но что то не бьётся с вашей статьей


 8001258:   681a        ldr r2, [r3, #0]
 800125a:   2380        movs    r3, #128    ; 0x80
 800125c:   049b        lsls    r3, r3, #18
 800125e:   4013        ands    r3, r2
 8001260:   d1f0        bne.n   8001244 <HAL_RCC_OscConfig+0x588>
 8001262:   e038        b.n 80012d6 <HAL_RCC_OscConfig+0x61a>

</sаrcasm>

Скажите пожалуйста, с помощью чего вы компилировали код, на какой системе и чем дизассемблировали.
Учитывая название регистров r2/r3 то это не x86 а что нибудь RISKовое.
А учитывая HAL_RCC_OscConfig это скорей всего STM32
А теперь включите оптимизацию :)
Позже нужно будет попробовать дизассемблировать :)
Нечего будет разбирать, оптимизатор вычислит на этапе компиляции константы и развернёт все условия и циклы :)
Первый пример с условным переходом с уровнем оптимизации -O1 уже выраждается в следующее:
/ (fcn) sym.main 54
| sym.main ();
| ; var int local_8h @ ebp-0x8
| ; var int local_4h @ esp+0x4
| 0x0000051d 8d4c2404 lea ecx, dword [local_4h]
| 0x00000521 83e4f0 and esp, 0xfffffff0
| 0x00000524 ff71fc push dword [ecx - 4]
| 0x00000527 55 push ebp
| 0x00000528 89e5 mov ebp, esp
| 0x0000052a 53 push ebx
| 0x0000052b 51 push ecx
| 0x0000052c e8effeffff call sym.__x86.get_pc_thunk.bx
| 0x00000531 81c3a71a0000 add ebx, 0x1aa7
| 0x00000537 83ec0c sub esp, 0xc
| 0x0000053a 8d8308e6ffff lea eax, dword [ebx - 0x19f8]
| 0x00000540 50 push eax
| 0x00000541 e86afeffff call sym.imp.puts
| 0x00000546 83c410 add esp, 0x10
| 0x00000549 8d65f8 lea esp, dword [local_8h]
| 0x0000054c 59 pop ecx
| 0x0000054d 5b pop ebx
| 0x0000054e 5d pop ebp
| 0x0000054f 8d61fc lea esp, dword [ecx - 4]
\ 0x00000552 c3 ret
Классно.
Но всё равно потом посмотрю разные варианты оптимизации :)
Так будет веселее.
Режим графов — ваш друг в дизасcемблировании :)

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

А я вот не люблю графы. ИДА их постоянно включает, приходится сразу переходить на текстовый режим.

Крис Касперски тоже не любил. Но разве не удобнее сразу видеть блоки кода, чем высматривать какой где начинается и кончается и на какой другой блок указывает?

Sign up to leave a comment.

Articles