Сплайс (сорцы)

Дата публикации 20 дек 2017 | Редактировалось 10 янв 2018
Выложу тут, мож пригодится кому, мож нет.
Думаю нет смысла тут демогогию разводить. Сорец мой старый без юзания дизасма длинн префиксов. Если что дополню. Токо сначала InitializeCriticalSection(&CS);
Код (C):
  1. volatile static BYTE rehook[9][9];
  2. volatile static DWORD hcount=0;//Хуки счетчик
  3. volatile static DWORD readdr[9]={0};//Хуки - адреса возврата
  4. static HMODULE NTDLL=0;
  5. HANDLE hNamedPipe=NULL;
  6. //Если f_splice=false - снять перехват
  7. //Тогда в параметре lpNewFunc - адрес True-функции
  8. LPVOID SPLISX(PCHAR wc_libnam,LPCSTR sz_fnam,LPVOID lpNewFunc,DWORD num,USHORT ord)
  9. {
  10.     DWORD fnadr=0;
  11.     DWORD p_fn=0;
  12.     HMODULE thm=GetModuleHandle(wc_libnam);
  13.     if(thm==NULL) thm=LoadLibrary(wc_libnam);
  14.     if(thm==NULL) { ResetError(L"Error:LIB",MB_ICONSTOP);;return NULL;}
  15.     p_fn=(DWORD)GetProcAddress(thm,sz_fnam);
  16.     if(p_fn)//GetProcAdrLibFunc(&p_fn,wc_libnam,sz_fnam,ord)
  17.     {  
  18.         fnadr=p_fn;
  19.         DWORD leng=num;
  20.         if(*((BYTE*)fnadr)==0x55){leng=8;}
  21.         DWORD tleng=leng;
  22.         BYTE* rbridg=NULL;
  23.         tleng+=tleng;
  24.          
  25.         if(NT_SUCCESS(NtAllocateVirtualMemory(INVALID_HANDLE_VALUE,(PVOID*)&rbridg,0,&tleng,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE)))
  26.         {        
  27.             DWORD P=0;
  28.             tleng=leng;
  29.             PVOID ra=(PVOID)fnadr;
  30.             if(NT_SUCCESS(NtProtectVirtualMemory(INVALID_HANDLE_VALUE,(PVOID*)&ra,&tleng,PAGE_EXECUTE_READWRITE,&P)))
  31.             {
  32.                 RtlEnterCriticalSection(&CS);
  33.                 tleng=leng;
  34.                 if(memcpy(rbridg,(LPVOID)fnadr,tleng)!=NULL)
  35.                 {
  36.                     for(DWORD i=0;i<leng;i++)
  37.                     {
  38.                         rehook[i][hcount]=*((BYTE*)(fnadr+i));
  39.                     }
  40.                     readdr[hcount]=p_fn;
  41.                     hcount++;
  42.                 }
  43.                 tleng=leng;
  44.                 rbridg[tleng]=0xE9;
  45.                 DWORD JA=fnadr-(DWORD)rbridg-tleng;
  46.                 if(memcpy(&rbridg[tleng+1],&JA,4)==NULL) Beep(2000,100);
  47.                 BYTE jmp[8]={0xe9,0x90,0x90,0x90,0x90,0x90,0x90,0x90};
  48.                 JA=(DWORD)lpNewFunc - fnadr - 5;
  49.                 if(memcpy(&jmp[1],&JA,4)==NULL)    Beep(2000,100);
  50.                 if(memcpy((LPVOID)fnadr,jmp,tleng)==NULL) Beep(2000,100);
  51.                 ra=(PVOID)fnadr;
  52.                 NtProtectVirtualMemory(INVALID_HANDLE_VALUE,(PVOID*)&ra,&tleng,P,&P);
  53.                 RtlLeaveCriticalSection(&CS);
  54.              
  55.                 return rbridg;
  56.             }
  57.         }
  58.     }
  59. return NULL;
  60. }
  61. /////////////////снять перехват/////////////
  62. BOOL UNSPLIS()
  63. {
  64.     //__try
  65.     {
  66.         for(DWORD hc=0;hc<hcount;hc++)
  67.         {
  68.             DWORD P=0;
  69.             DWORD tleng=8;
  70.             PVOID ra=(PVOID)readdr[hc];
  71.             if(NT_SUCCESS(NtProtectVirtualMemory(INVALID_HANDLE_VALUE,(PVOID*)&ra,&tleng,PAGE_EXECUTE_READWRITE,&P)))
  72.             {
  73.                 RtlEnterCriticalSection(&CS);
  74.                 for(BYTE i=0;i<5;i++)
  75.                 {
  76.                     *(BYTE*)(readdr[hc]+i)=rehook[i][hc];
  77.                 }
  78.                 RtlLeaveCriticalSection(&CS);
  79.             }
  80.             NtProtectVirtualMemory(INVALID_HANDLE_VALUE,(PVOID*)&ra,&tleng,P,&P);
  81.         }
  82.         hcount=0;
  83.         return TRUE;
  84.     }
  85.  
  86.     return FALSE;
  87. }

0 1.868
RET

RET
Well-Known Member

Регистрация:
5 янв 2008
Публикаций:
17