Выложу тут, мож пригодится кому, мож нет.
Думаю нет смысла тут демогогию разводить. Сорец мой старый без юзания дизасма длинн префиксов. Если что дополню. Токо сначала InitializeCriticalSection(&CS);
Код (C):
volatile static BYTE rehook[9][9]; volatile static DWORD hcount=0;//Хуки счетчик volatile static DWORD readdr[9]={0};//Хуки - адреса возврата static HMODULE NTDLL=0; HANDLE hNamedPipe=NULL; //Если f_splice=false - снять перехват //Тогда в параметре lpNewFunc - адрес True-функции LPVOID SPLISX(PCHAR wc_libnam,LPCSTR sz_fnam,LPVOID lpNewFunc,DWORD num,USHORT ord) { DWORD fnadr=0; DWORD p_fn=0; HMODULE thm=GetModuleHandle(wc_libnam); if(thm==NULL) thm=LoadLibrary(wc_libnam); if(thm==NULL) { ResetError(L"Error:LIB",MB_ICONSTOP);;return NULL;} p_fn=(DWORD)GetProcAddress(thm,sz_fnam); if(p_fn)//GetProcAdrLibFunc(&p_fn,wc_libnam,sz_fnam,ord) { fnadr=p_fn; DWORD leng=num; if(*((BYTE*)fnadr)==0x55){leng=8;} DWORD tleng=leng; BYTE* rbridg=NULL; tleng+=tleng; if(NT_SUCCESS(NtAllocateVirtualMemory(INVALID_HANDLE_VALUE,(PVOID*)&rbridg,0,&tleng,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE))) { DWORD P=0; tleng=leng; PVOID ra=(PVOID)fnadr; if(NT_SUCCESS(NtProtectVirtualMemory(INVALID_HANDLE_VALUE,(PVOID*)&ra,&tleng,PAGE_EXECUTE_READWRITE,&P))) { RtlEnterCriticalSection(&CS); tleng=leng; if(memcpy(rbridg,(LPVOID)fnadr,tleng)!=NULL) { for(DWORD i=0;i<leng;i++) { rehook[i][hcount]=*((BYTE*)(fnadr+i)); } readdr[hcount]=p_fn; hcount++; } tleng=leng; rbridg[tleng]=0xE9; DWORD JA=fnadr-(DWORD)rbridg-tleng; if(memcpy(&rbridg[tleng+1],&JA,4)==NULL) Beep(2000,100); BYTE jmp[8]={0xe9,0x90,0x90,0x90,0x90,0x90,0x90,0x90}; JA=(DWORD)lpNewFunc - fnadr - 5; if(memcpy(&jmp[1],&JA,4)==NULL) Beep(2000,100); if(memcpy((LPVOID)fnadr,jmp,tleng)==NULL) Beep(2000,100); ra=(PVOID)fnadr; NtProtectVirtualMemory(INVALID_HANDLE_VALUE,(PVOID*)&ra,&tleng,P,&P); RtlLeaveCriticalSection(&CS); return rbridg; } } } return NULL; } /////////////////снять перехват///////////// BOOL UNSPLIS() { //__try { for(DWORD hc=0;hc<hcount;hc++) { DWORD P=0; DWORD tleng=8; PVOID ra=(PVOID)readdr[hc]; if(NT_SUCCESS(NtProtectVirtualMemory(INVALID_HANDLE_VALUE,(PVOID*)&ra,&tleng,PAGE_EXECUTE_READWRITE,&P))) { RtlEnterCriticalSection(&CS); for(BYTE i=0;i<5;i++) { *(BYTE*)(readdr[hc]+i)=rehook[i][hc]; } RtlLeaveCriticalSection(&CS); } NtProtectVirtualMemory(INVALID_HANDLE_VALUE,(PVOID*)&ra,&tleng,P,&P); } hcount=0; return TRUE; } return FALSE; }
Сплайс (сорцы)
Дата публикации 20 дек 2017
| Редактировалось 10 янв 2018