Фундаментальные основы хакерства


Идентификация аргументов функций - часть 48


 

add    eax, [ebx]

; Складываем EAX типа char и теперь расширенное до int с переменной типа int

; переданной по ссылке через регистр EBX

 

add    eax, ecx

; Ага, вот оно обращение к ECX, - следовательно, этот регистр использовался

; для передачи аргументов

 

retn

; Таким образом, прототип функции должен выглядеть так:

; MyFunc(char EAX, int *EBX, int ECX)

; Обратите внимание, что восстановить его удалось лишь совместным анализом

; вызываемой и вызывающей функций!

 

MyFunc       endp

Листинг 77

 

::передача вещественных значений. Кодоломатели в своей массе не очень-то разбираются в вещественной арифметике, избегая ее как огня. Между тем, в ней нет ничего сверхсложного и освоить управление сопроцессором можно буквально за полтора-два дня. Правда, с математическими библиотеками, поддерживающими вычисления с плавающей запятой, справиться намного труднее, (особенно если IDA не распознает имен их функций), но какой компилятор сегодня пользуется библиотеками? Микропроцессор и сопроцессор монтируются на одном кристалле, и сопроцессор, начиная с 80486DX (если мне не изменяет память), доступен всегда, поэтому, прибегать к его программной эмуляции нет никакой нужды.

До конца девяностых среди хакеров бытовало мнение, что можно всю жизнь прожить, но так и не столкнуться с вещественной арифметикой. Действительно, в старые добрые времена процессоры в своей медлительности ни в чем не уступали черепахам, сопроцессоры имелись не у всех, а задачи, стоящие перед компьютерами, допускали (не без ухищрений, правда) решения и в целочисленной арифметике.

Сегодня все кардинально изменилось. Вычисления с плавающей точкой, выполняемые сопроцессором параллельно с работой основной программы, даже быстрее целочисленных вычислений, обсчитываемых основным процессором. И программисты, окрыленные такой перспективой, стали лепить вещественные типы данных даже там, где раньше с лихвой хватало целочисленных. (Например, если a=b/c*100, то, изменив порядок вычислений a=b*100/c, мы можем обойтись и типами int).


- Начало -  - Назад -  - Вперед -



Книжный магазин