Тема: BlitzHack
Показать сообщение отдельно
Старый 25.01.2010, 00:01   #48
Alex.D.
Оператор ЭВМ
 
Регистрация: 02.11.2008
Сообщений: 27
Написано 12 полезных сообщений
(для 24 пользователей)
Ответ: BlitzHack

Сообщение от impersonalis Посмотреть сообщение
с 3д на 2д менять нельзя - поползёт весь файл, из-за разных объёмов дефиниций, занимаемых той и другой командой в теле ехе. Буду думать.
Та таблица (в ресурсном файле с программой) содержит имена функций и после них смещение от сигнатуры SVWU (4ый байт от начала) до адреса инструкции вызова (call) который изначально инвалидный (FCFFFFFF) и правится при загрузке программы. После названия функции (вида _f...) идет 5 байт, 4 из которых на смещение и один (нуль) отделяет следующее название. В большинстве случаев прийдется переделывать эту таблицу, но в некоторых (как смена 3д на 2д) можно попробывать просто сменить имя (_fgraphics3d на _fgraphics, а лишние 2 байта тоже занулить)

Сообщение от impersonalis Посмотреть сообщение
проблема таже что и выше (константый аргумент занимает места 4 байта, в то время как запись со ссылкой на перменную - на 2 байта больше). Буду думать.
Компилятор блица не использует инструкцию push, вместо этого он сдвигает стек и записывает в него по смещению
Соответственно запись в стек
по смещению:
*константы - 8 байт
*локальной переменной - 7 байт
*глобальной переменной - 10 байт
без смещения (первый параметр функции):
*константы - 7 байт
*локальной переменной - 6 байт
*глобальной переменной - 9 байт
В случае с глобальной переменной, замена на константу безболезненна, оставшиеся 2-3 байта можно затереть NOPами
В случае с локальной переменной, выход для некоторых функций - записывать одинарное слово (mov word [esp], const \ mov word[esp+offset], const) что укладывается в нужные 6\7 байт.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
impersonalis (25.01.2010)