Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: hw.t-k.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #5
Добавлено: 27.01.05 18:21
Покажи код на АСМ-е. По поводу твоего предложения. Я точно не помню, но по моему там (имеется ввиду исполняемая секция) нет доступа на запись. Можно только патчить экзешник как предложил cresta. Причём можно патчить не сам код, а только адрес вызова. Например CALL [XXX] на CALL [YYY]. Где YYY - адрес первого байта байтового массива.

Ответить

Номер ответа: 6
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #6
Добавлено: 27.01.05 18:24
Да и вообще в VB много проблем из за необходимости синхронизации выполнения в IDE с выполнением в экзешнике.

Ответить

Номер ответа: 7
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #7 Добавлено: 27.01.05 19:18
Сейчас пропатчил. Сделал модуль (без формы, чтобы легче было найти процедуру в отладчике :)

Вот весь VB-код:

Sub Main()
    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-код:

B8 34120000    MOV EAX,1234
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-сайт: basicproduction.nm.ru
 Профиль | | #11
Добавлено: 28.01.05 10:35

Кстати, если при вызове функции в стэк заносится 4 параметра, а функция забирает один - три там так и остаются, получается, до конца времени жизни...

 Поясни (лучше кодом). Где код?

Ответить

Номер ответа: 12
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #12
Добавлено: 28.01.05 10:58
:) нашел проблемму :)

pop eax
add esp, 0Ch
push eax

Ответить

Номер ответа: 13
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #13
Добавлено: 28.01.05 11:05
А код слабо показать? :) Может там этого и не нужно.

Ответить

Номер ответа: 14
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #14
Добавлено: 28.01.05 13:04
И на каком ассемблере писал если не секрет.

Ответить

Номер ответа: 15
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #15 Добавлено: 28.01.05 13:34
Да какой код? Это вопрос гипотетический. Код может быть любой функцией длины порядка 40-50 байт.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам