Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] Как вызвать мою функцию? 27.05.02 09:44
Автор: BXS Статус: Незарегистрированный пользователь
|
Каким способом мне вызывать функцию (точнее кусок кода) который я токо что записал в буфер?
Вот что я сделал:
// заказал памяти
hMem=LocalAlloc(...)
preMem=LocalLock(hMem);
// скопирил код
memmove(ptrMem,&Test,Length);
// беру указатель
typedef DWORD TEST)(char;
TEST ptrTest;
ptrTest=(TEST) &ptrTest;
ptrTest("TEST");
-------------------
// вот эту ф-цию я копирую
DWORD Test(char *str){
MessageBox(0,str...);
}
В чем тут ошибка? у меня комп сразу вылетает... (((
в чем тут проблема? как это правильно сделать? плииииззззззззз
|
|
[Win32] Как вызвать мою функцию? 27.05.02 14:30
Автор: ukv Статус: Незарегистрированный пользователь
|
...
> memmove(ptrMem,&Test,Length);
variant 1
typedef int _cdecl tratata(char*);
(tratataptrMem)("test");
variant 2
typedef int _cdecl lp_tratata)(char;
(*(lp_tratata)ptrMem)("test");
|
|
ptrTest=(TEST) &ptrTest; - Это что такое ? 27.05.02 13:41
Автор: PS <PS> Статус: Elderman Отредактировано 27.05.02 13:48 Количество правок: 1
|
Но работать все равно не будет. Хоят бы из за read, write, executable - есть такие нехорошие слова связанные с памятью.
|
| |
[Win32] спасибо ukv за прототип вызова. все пашет с writeprocessmemory 27.05.02 17:26
Автор: BXS Статус: Незарегистрированный пользователь
|
если юзать просто memmove - то у меня машина летала...
я не стал возица с этим и посчитался с execute write & read.
я подумал что вся эта лажа будет сама собой правильно выставляца в WriteProcessMemory.
вот и готовая версия (если кому интересно)
DWORD Test1(char *str);
DWORD Test2(char *str);
void TestEnd1();
void TestEnd2();
HANDLE hProcess,hMem;
void *ptrMem;
void *Addr;
DWORD Bytes;
int WINAPI WinMain(HINSTANCE Instance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
int count;
if((hProcess=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_SET_INFORMATION,
TRUE,GetCurrentProcessId()))==0){
MessageBox(0,"х тебе...","",MB_OK);
return 0;
}
if((hMem=LocalAlloc(LHND,(PBYTE)&TestEnd1 - (PBYTE)&Test1))==0){
MessageBox(0,"LocalAlloc error","",MB_OK);
return 0;
}
ptrMem=(void*)LocalLock(hMem);
Addr=(void*)(PBYTE)&Test1;
if(!WriteProcessMemory(hProcess,&ptrMem,&Addr,(PBYTE)&TestEnd1-(PBYTE)&Test1,&Bytes)){
MessageBox(0, "облом", "",MB_OK);
//free mem & shit
ExitProcess(0);
}
typedef DWORD _cdecl TEST(char*);
(TESTptrMem)("new location");
LocalUnlock(hMem);
LocalFree(hMem);
CloseHandle(hProcess);
ExitProcess(0);
return 0;
}
DWORD Test1(char *str){
MessageBox(0,str,"test1",MB_OK);
return 0;
}
void TestEnd1(){
return;
}
DWORD Test2(char *str){
MessageBox(0,str,"test2",MB_OK);
return 0;
}
void TestEnd2(){
return;
}
|
|
|