Страница: 1 | 2 |
Вопрос: Тупой вопрос по функциям
Добавлено: 27.01.05 11:12
Автор вопроса: LamerOnLine | ICQ: 334781088
Кто знает: вот например я написал на асме код функции, хочу вставить его в VB. Каждый раз через CallWindowProc её вызывать муторно. Хотел сделать так: в модуле задекларировать фунцкию с такими же аргументами и затем через CopyMemory и Address of заменить эту функцию на мой код из массива. Как по вашему, это реально сделать? Если да - то какие идеи?
Ответы
Всего ответов: 17
Номер ответа: 1
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #1
Добавлено: 27.01.05 11:22
Или это годится только для сегментов данных? У меня че-то не выходит.
Номер ответа: 2
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #2
Добавлено: 27.01.05 16:40
Что-то неясно что муторного? В байтовый массив дык это и в твоем случае прийдется... Поменять адреса на свои, сам же говоришь что менять прийдется... Одно думается удобней - можно их в ресурсы закинуть, а LoadResData возвращает байтовый массив...
ЗЫ
Вызвать код еще можно и с пом. CreateThread
Номер ответа: 3
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #3
Добавлено: 27.01.05 17:06
И впрямь неясно. Я знаю как запихнуть в ресурсы, как оттуда считать в массив и как запустить из массива. Я хочу понять - возможно ли этом массив положить "поверх" функции свой VB-проги, записаной в модуле. Чтобы вызывать её не по адресу, а уже по имени той VB функции в своей программе. Т.е. без АПИ.
Номер ответа: 4
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #4
Добавлено: 27.01.05 18:08
Может такой вариант: Найти кусок, соответствующий этой "подложке" и пропатчить его, заменив кодом из asm-объектника, например в каком-нибудь отладчике или hex-редакторе? И не грузить ничего из массива. Будет сразу со вставкой А? Блин, интересная может штука получиться.
Номер ответа: 5
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #5
Добавлено: 27.01.05 18:21
Покажи код на АСМ-е. По поводу твоего предложения. Я точно не помню, но по моему там (имеется ввиду исполняемая секция) нет доступа на запись. Можно только патчить экзешник как предложил cresta. Причём можно патчить не сам код, а только адрес вызова. Например CALL [XXX] на CALL [YYY]. Где YYY - адрес первого байта байтового массива.
Номер ответа: 6
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #6
Добавлено: 27.01.05 18:24
Да и вообще в VB много проблем из за необходимости синхронизации выполнения в IDE с выполнением в экзешнике.
Номер ответа: 7
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #7
Добавлено: 27.01.05 19:18
Сейчас пропатчил. Сделал модуль (без формы, чтобы легче было найти процедуру в отладчике
Вот весь VB-код:
MsgBox "FFFFFFFFFF"
MsgBox "FFFFFFFFFF"
MsgBox "FFFFFFFFFF"
MsgBox Foo
End Sub
Function Foo() As Long
Beep
Beep
Beep
Beep
Beep
Beep
Beep
Foo = 1024
End Function
Увидел положенные три msgbox'a "FFFFFFFFFF" и затем msgbox 1024.
Далее в отладчике поверх Beep'ов вставил простенький asm-код:
90 NOP
C1E0 02 SHL EAX,2
90 NOP
83C0 03 ADD EAX,3
90 NOP
B9 04000000 MOV ECX,4
90 NOP
F7E1 MUL ECX
90 NOP
90 NOP
90 NOP
5E POP ESI
C3 RETN
т.е. ф-ция вместо простого возврата 1024 произвела вычисление (числа шестнадцатиричные) (1234*4+3)*4 и вернула в msgbox 74572.
Запускал из отладчика - работает, затем сохранил изменения в ехе и запустил ехе - тоже.
Думаю, сюда можно подставить любой код, который предполагается сохранять в массиве, лишь бы не было вызовов системных ф-ций (хотя и с ними тоже можно сделать, если передавать в ф-цию в качестве параметров заранее вычисленные GetProcAddr адреса)
Номер ответа: 8
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #8
Добавлено: 27.01.05 19:58
А вообще зачем такое может понадобиться? Спрятаться так не спрячешься, если ускорять работу каких-то кусков, почему бы из того же ресурса не выбросить на винт dll и не вызвать в ней процедуру? Все легче и правильней
Номер ответа: 9
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #9
Добавлено: 28.01.05 10:25
Нет смысла создавать Dll ради одной-двух простых функций. Проще интегрировать их таким образом. К сожалению, патч экзешника придется проводить после каждой перекомпиляции. А права записи в исполняемую область памяти получить можно ли?
Номер ответа: 10
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #10
Добавлено: 28.01.05 10:28
А почему не хочу запускать из массива - использование лишних АПИ и ограниченное число параметров. Кстати, если при вызове функции в стэк заносится 4 параметра, а функция забирает один - три там так и остаются, получается, до конца времени жизни...
Номер ответа: 11
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #11
Добавлено: 28.01.05 10:35
Кстати, если при вызове функции в стэк заносится 4 параметра, а функция забирает один - три там так и остаются, получается, до конца времени жизни...
Поясни (лучше кодом). Где код?
Номер ответа: 12
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #12
Добавлено: 28.01.05 10:58
нашел проблемму
pop eax
add esp, 0Ch
push eax
Номер ответа: 13
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #13
Добавлено: 28.01.05 11:05
А код слабо показать? Может там этого и не нужно.
Номер ответа: 14
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #14
Добавлено: 28.01.05 13:04
И на каком ассемблере писал если не секрет.
Номер ответа: 15
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #15
Добавлено: 28.01.05 13:34
Да какой код? Это вопрос гипотетический. Код может быть любой функцией длины порядка 40-50 байт.