ollv
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору /*LRESULT CALLBACK __stHookNP(int Code,WPARAM wPar,LPARAM lPar) { CurrentDirectory = GetCurrentDir(); char *ModName = new char[MAX_PATH]; GetModuleFileName(__dllINST,ModName,MAX_PATH); //MessageBox(NULL,ModName,CurrentDirectory.c_str(),MB_OK); DWORD oldProtect; DWORD ThrdId,lpbCodeSize = 0,dwNumBytesXferred; if(hThrd)__asm jmp cll INJECTLIB *InjectLib = new INJECTLIB; bool __fok = FALSE; HINSTANCE hKrnl = GetModuleHandle(__TEXT("Kernel32")); HINSTANCE hUserdll = GetModuleHandle(__TEXT("user32")); if((!hUserdll)||(hKrnl==NULL)){ MessageBox(NULL,"Error user23.dll load","Error",MB_OK); __asm jmp cll } InjectLib->lpLoadLibrary =(void*(__stdcall*)(char*)) GetProcAddress(hKrnl,"LoadLibraryA"); InjectLib->lpTerminateProcess =(int(__stdcall*)(HANDLE,UINT)) GetProcAddress(hKrnl,"TerminateProcess"); InjectLib->lpGetCurrentProcess =(void*(__stdcall*)()) GetProcAddress(hKrnl,"GetCurrentProcess"); strcpy(InjectLib->lpLibraryName,ModName); strcpy(InjectLib->lpProcName,"MessageBoxA"); InjectLib->lpMessageBox = (int(__stdcall*)(void*,const char*,const char*,unsigned int))GetProcAddress(hUserdll, "MessageBoxA"); if((InjectLib->lpLoadLibrary==NULL)|| (InjectLib->lpMessageBox==NULL)) //(!InjectLib->lpGetCurrentProcess)) { MessageBox(NULL,"Error loadlib 1","Error",MB_ICONSTOP); __asm jmp cll } InjectLib->lpGetProcAddress =(void*(__stdcall*)(void*,char*)) GetProcAddress(hKrnl,"GetProcAddress"); if(!InjectLib->lpGetProcAddress) { MessageBox(NULL,"Error loadlib 2","Error",MB_ICONSTOP); //__asm jmp cll } InjectLib->lpFreeLibrary =(FREELIBRARY)GetProcAddress(hKrnl,"FreeLibrary"); if(!InjectLib->lpFreeLibrary) { MessageBox(NULL,"Error loadlib 3","Error",MB_ICONSTOP); __asm jmp cll } HANDLE hCurrentProcess = GetCurrentProcess(); lpbCodeSize = ((PBYTE)(DWORD)__AfterThread - (PBYTE)(DWORD)__np); DWORD lpbCodeMem = lpbCodeSize + sizeof(INJECTLIB) + 10; VOID *lpvCode = NULL; //For example //lpvCode = AllocProcessMemory(GetCurrentProcess(),lpbCodeMem + 3); try { HGLOBAL __hg = GlobalAlloc(GMEM_FIXED,lpbCodeMem); VOID *lpvCode1 = GlobalLock(__hg); lpvCode = VirtualAllocEx(hCurrentProcess,lpvCode1,lpbCodeMem,MEM_COMMIT, PAGE_EXECUTE_READWRITE); } catch(...) {MessageBox(NULL,"Error memory 11","Error",MB_OK);} if(!lpvCode)MessageBox(NULL,"Error memory","Error",MB_OK); __fok = VirtualProtectEx(hCurrentProcess,lpvCode, lpbCodeMem,PAGE_EXECUTE_READWRITE, &oldProtect); if(!__fok){ MessageBox(NULL,"Error protect memory","Error",MB_OK); } __fok = WriteProcessMemory(hCurrentProcess,lpvCode, (LPVOID)(DWORD)__np,lpbCodeSize,&dwNumBytesXferred); if(!__fok){ MessageBox(NULL,"Error write code","Error",MB_OK|MB_ICONSTOP); TerminateProcess(hCurrentProcess,-9); } __fok = WriteProcessMemory(hCurrentProcess,(void*)(DWORD(lpvCode)+(lpbCodeSize + 4)&~3), (LPVOID)InjectLib,sizeof(INJECTLIB)+2,&dwNumBytesXferred); if(!__fok){ MessageBox(NULL,"Error write date","Error",MB_OK|MB_ICONSTOP); TerminateProcess(hCurrentProcess,-9); } hThrd = CreateRemoteThread(hCurrentProcess,NULL,0,(LPTHREAD_START_ROUTINE)lpvCode, InjectLib,0,&ThrdId); //TerminateProcess(OwnerProcess,-9); DWORD *tid; __asm cll: FreeLibrary(hKrnl); FreeLibrary(hUserdll); CallNextHookEx(Hook,Code,wPar,lPar); }*/ Здесь идет inject кода потока в другой процесс,.. дык создание потока идет с помощью сам видишь ))) Это код ловушки, дык там как известно GetCurrentProcess дает хандл процесса вызвавшего ловушку .. да в общем суть понятна ... тонкости я уже не помню .. (( а надо передавать структуру с адресами ф-ций, ну как минимум LoadLibrary .. и GetProcAddress... т.к. эти адреса не известны инжектору )) .. Это, я по моему, модернизировал чей-то пример по внедрению кода, пихнул в ловушку и собсно заработало .., да мало ли их этих примеров.., /* А вот исходничками не поделишся (только из интереса, так как кодинг под 9х я забросил оставляю только совместимоть)*/ Ок.. дома копну .., только помню код разный для VC и Buildera (адреса на ф-ции .. ) , и еще как я подозреваю зависит от версии винды.., код короткий .. и думаю ничего интересного в нем нет .., в общем выложу .., посмотришь .. Добавлено о чет накопал вроде из того /* // nPRJ.cpp : Defines the entry point for the application. // #include "stdafx.h" HHOOK Hook; void __stWindowsHookEx(int Code,WPARAM wPar,LPARAM lPar) { MessageBox(NULL,"This proc hook","Message",MB_OK); CallNextHookEx(Hook,Code,wPar,lPar); } void __stWindowsHookExSec(int Code,WPARAM wPar,LPARAM lPar) { MessageBox(NULL,"This proc hook sec","Message sec",MB_OK); CallNextHookEx(Hook,Code,wPar,lPar); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. int Run = 0; DWORD *ThreadId; __asm { jmp RunThread Thread: push ebp mov ebp , esp } Hook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)__stWindowsHookExSec, 0,0); Run++; __asm{ pop ebp ret RunThread: //push ThreadId push 0 push 0 push offset Thread push 0 push 0 call dword ptr [CreateThread] } Hook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)__stWindowsHookEx,0,0); while(Run <=2 ) __asm jmp RunThread; // return 0; } */ только я соврал CreateThread там все же есть ..., компилится в VC // для того, чтобы не было видно по ctrlaltdel RegisterSrvice(s?)Process.. а TerminateProcess не срабатывает и процесс по снапшоту виден .. |