道。道。道

安全特性不等于安全的特性

   :: 首页 :: 联系 :: 聚合  :: 管理

常用链接

搜索

  •  

最新评论

  1 ////////////////////////////////////////////////////////////////////// 
  2 附录:一个拦截CreateFile函数的简单实现 
  3 ////////////////////////////////////////////////////////////////////// 
  4 #include <stdio.h> 
  5 #include <windows.h> 
  6 #include <Psapi.h> 
  7 
  8 #pragma comment(lib, "psapi.lib") 
  9 
 10 typedef struct _RemoteParam { 
 11   DWORD dwCreateFile; 
 12   DWORD dwMessageBox; 
 13   DWORD dwGetCurrentProcess; 
 14   DWORD dwWriteProcessMemory; 
 15   unsigned char szOldCode[10]; 
 16   DWORD FunAddr; 
 17 } RemoteParam, * PRemoteParam; 
 18 
 19 typedef HANDLE (__stdcall * PFN_CREATEFILE)(LPCTSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE); 
 20 typedef int (__stdcall * PFN_MESSAGEBOX)(HWND, LPCTSTR, LPCTSTR, DWORD); 
 21 typedef BOOL (__stdcall * PFN_WRITEPROCESSMEMORY)(HANDLE,LPVOID,LPCVOID,SIZE_T,SIZE_T*); 
 22 typedef HANDLE (__stdcall * PFN_GETCURRENTPROCESS)(void); 
 23 
 24 #define PROCESSNUM 128 
 25 #define MYMESSAGEBOX "MessageBoxW" 
 26 #define MYCREATEFILE "CreateFileW" 
 27 
 28 void HookCreateFile(LPVOID lParam) 
 29 { 
 30 
 31   RemoteParam* pRP = (RemoteParam*)lParam; 
 32 
 33 
 34   DWORD NextIpAddr = 0; 
 35   DWORD dwParamaAddr = 0; 
 36 
 37   HANDLE RetFpHdl = INVALID_HANDLE_value; 
 38   LPCTSTR lpFileName; 
 39   DWORD dwDesiredAccess; 
 40   DWORD dwShareMode; 
 41   LPSECURITY_ATTRIBUTES lpSecurityAttributes; 
 42   DWORD dwCreationDisposition; 
 43   DWORD dwFlagsAndAttributes; 
 44   HANDLE hTemplateFile; 
 45   PFN_CREATEFILE pfnCreatefile = (PFN_CREATEFILE)pRP->dwCreateFile; 
 46 
 47 
 48   __asm 
 49   { 
 50     MOV EAX,[EBP+8] 
 51     MOV [dwParamaAddr], EAX 
 52     MOV EAX,[EBP+12]           
 53     MOV [NextIpAddr], EAX 
 54     MOV EAX,[EBP+16] 
 55     MOV [lpFileName], EAX 
 56     MOV EAX,[EBP+20] 
 57     MOV [dwDesiredAccess],EAX 
 58     MOV EAX,[EBP+24] 
 59     MOV [dwShareMode],EAX 
 60     MOV EAX,[EBP+28] 
 61     MOV [lpSecurityAttributes],EAX 
 62     MOV EAX,[EBP+32] 
 63     MOV [dwCreationDisposition],EAX 
 64     MOV EAX,[EBP+36] 
 65     MOV [dwFlagsAndAttributes],EAX 
 66     MOV EAX,[EBP+40] 
 67     MOV [hTemplateFile],EAX     
 68   } 
 69 
 70   PFN_MESSAGEBOX pfnMessageBox = (PFN_MESSAGEBOX)pRP->dwMessageBox; 
 71   int allowFlag = pfnMessageBox(NULL, lpFileName, NULL, MB_ICONINformATION | MB_YESNO); 
 72    
 73   if(allowFlag == IDYES) 
 74   { 
 75   unsigned char szNewCode[10]; 
 76   int PramaAddr = (int)dwParamaAddr; 
 77   szNewCode[4] = PramaAddr>>24; 
 78   szNewCode[3] = (PramaAddr<<8)>>24; 
 79   szNewCode[2] = (PramaAddr<<16)>>24; 
 80   szNewCode[1] = (PramaAddr<<24)>>24; 
 81   szNewCode[0] = 0x68; 
 82    
 83   int funaddr = (int)pRP->FunAddr - (int)pfnCreatefile - 10 ; 
 84   szNewCode[9] = funaddr>>24; 
 85   szNewCode[8] = (funaddr<<8)>>24; 
 86   szNewCode[7] = (funaddr<<16)>>24; 
 87   szNewCode[6] = (funaddr<<24)>>24; 
 88   szNewCode[5] = 0xE8; 
 89    
 90    
 91   PFN_GETCURRENTPROCESS pfnGetCurrentProcess = (PFN_GETCURRENTPROCESS)pRP->dwGetCurrentProcess; 
 92   PFN_WRITEPROCESSMEMORY pfnWriteProcessMemory = (PFN_WRITEPROCESSMEMORY)pRP->dwWriteProcessMemory; 
 93   pfnWriteProcessMemory(pfnGetCurrentProcess(), 
 94                         (LPVOID)pfnCreatefile, 
 95                         (LPCVOID)pRP->szOldCode, 
 96                         10, 
 97                         NULL); 
 98 
 99   RetFpHdl = pfnCreatefile(lpFileName, 
100                             dwDesiredAccess, 
101                             dwShareMode, 
102                             lpSecurityAttributes, 
103                             dwCreationDisposition, 
104                             dwFlagsAndAttributes, 
105                             hTemplateFile); 
106   pfnWriteProcessMemory(pfnGetCurrentProcess(), 
107                         (LPVOID)pfnCreatefile, 
108                         (LPCVOID)szNewCode, 
109                         10, 
110                         NULL); 
111   } 
112 
113 
114   __asm 
115       {POP EDI 
116         POP ESI 
117         POP EBX 
118         MOV EDX, [NextIpAddr] 
119         MOV EAX, [RetFpHdl] 
120         MOV ESP, EBP 
121         POP EBP 
122         ADD ESP, 28H   
123         PUSH EDX 
124         RET 
125       } 
126 
127    
128 } 
129 
130 
131 
132 BOOL AdjustProcessPrivileges(LPCSTR szPrivilegesName) 
133 { 
134   HANDLE hToken; 
135   TOKEN_PRIVILEGES tkp; 
136 
137   if(!OpenProcessToken(GetCurrentProcess(), 
138       TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken)) 
139   { 
140       return FALSE; 
141   } 
142 
143   if(!LookupPrivilegeValue(NULL,szPrivilegesName, 
144                             &tkp.Privileges[0].Luid)) 
145   { 
146       CloseHandle(hToken); 
147       return FALSE; 
148   } 
149    
150   tkp.PrivilegeCount = 1; 
151   tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
152    
153   if(!AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(tkp),NULL,NULL)) 
154   { 
155       CloseHandle(hToken); 
156       return FALSE; 
157   } 
158    
159   CloseHandle(hToken); 
160   return TRUE; 
161 } 
162 
163 
164 void printProcessNameByPid( DWORD ProcessId ) 
165 { 
166   HANDLE pHd; 
167   HMODULE pHmod; 
168   char ProcessName[MAX_PATH] = "unknown"; 
169   DWORD cbNeeded; 
170   pHd = OpenProcess( PROCESS_QUERY_INformATION |PROCESS_VM_READ, FALSE, ProcessId ); 
171   if(pHd == NULL) 
172       return; 
173    
174   if(!EnumProcessModules( pHd, &pHmod, sizeof(pHmod), &cbNeeded)) 
175       return; 
176   if(!GetModuleFileNameEx( pHd, pHmod, ProcessName, MAX_PATH)) 
177       return; 
178    
179   printf( "%dt%sn", ProcessId, ProcessName); 
180   CloseHandle( pHd ); 
181   return; 
182 } 
183 
184 
185 int main(void) 
186 { 
187 
188     if(!AdjustProcessPrivileges(SE_DEBUG_NAME)) 
189     { 
190         printf("AdjustProcessPrivileges Error!n"); 
191         return -1; 
192     } 
193 
194     DWORD Pids[PROCESSNUM]; 
195     DWORD dwProcessNum = 0; 
196     if(!EnumProcesses(Pids, sizeof(Pids), &dwProcessNum)) 
197     { 
198         printf("EnumProcess Error!n"); 
199         return -1; 
200     } 
201      
202     for( DWORD num = 0; num < (dwProcessNum / sizeof(DWORD)); num++) 
203         printProcessNameByPid(Pids[num]); 
204 
205     printf("nAll %d processes running. n", dwProcessNum / sizeof(DWORD)); 
206 
207     DWORD dwPid = 0; 
208     printf("n请输入要拦截的进程id:"); 
209     scanf("%d", &dwPid); 
210      
211     HANDLE hTargetProcess = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_READ, FALSE, dwPid); 
212     if(hTargetProcess == NULL) 
213     { 
214         printf("OpenProcess Error!n"); 
215         return -1; 
216     } 
217 
218     DWORD dwFunAddr = (DWORD)VirtualAllocEx(hTargetProcess, NULL, 8192, 
219                                             MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); 
220      
221     if((LPVOID)dwFunAddr == NULL) 
222     { 
223         printf("申请线程内存失败!n"); 
224         CloseHandle(hTargetProcess); 
225         return -1; 
226     } 
227 
228     DWORD dwPramaAddr = (DWORD)VirtualAllocEx(hTargetProcess, NULL, sizeof(RemoteParam), 
229                                               MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); 
230 
231     if((LPVOID)dwPramaAddr == NULL) 
232     { 
233         printf("申请参数内存失败!n"); 
234         CloseHandle(hTargetProcess); 
235         return -1; 
236     } 
237 
238     printf("n线程内存地址:%.8xn" 
239           "参数内存地址:%.8xn", 
240           dwFunAddr, dwPramaAddr); 
241       RemoteParam RParam; 
242     ZeroMemory(&RParam, sizeof(RParam)); 
243     HMODULE hKernel32 = LoadLibrary("kernel32.dll"); 
244     HMODULE hUser32 = LoadLibrary("user32.dll"); 
245 
246     RParam.dwCreateFile = (DWORD)GetProcAddress(hKernel32, MYCREATEFILE); 
247     RParam.dwGetCurrentProcess = (DWORD)GetProcAddress(hKernel32, "GetCurrentProcess"); 
248     RParam.dwWriteProcessMemory = (DWORD)GetProcAddress(hKernel32, "WriteProcessMemory"); 
249     RParam.dwMessageBox = (DWORD)GetProcAddress(hUser32, MYMESSAGEBOX); 
250      
251     unsigned char oldcode[10]; 
252     unsigned char newcode[10]; 
253     int praadd = (int)dwPramaAddr; 
254     int threadadd = (int)dwFunAddr; 
255     newcode[4] = praadd>>24; 
256     newcode[3] = (praadd<<8)>>24; 
257     newcode[2] = (praadd<<16)>>24; 
258     newcode[1] = (praadd<<24)>>24; 
259     newcode[0] = 0x68; 
260    
261     int offsetaddr = threadadd - (int)RParam.dwCreateFile - 10 ; 
262     newcode[9] = offsetaddr>>24; 
263     newcode[8] = (offsetaddr<<8)>>24; 
264     newcode[7] = (offsetaddr<<16)>>24; 
265     newcode[6] = (offsetaddr<<24)>>24; 
266     newcode[5] = 0xE8; 
267 
268     printf("NewCode:"); 
269     for(int j = 0; j < 10; j++) 
270         printf("0x%.2x ",newcode[j]); 
271     printf("nn"); 
272 
273 
274 
275     if(!ReadProcessMemory(GetCurrentProcess(), 
276                           (LPCVOID)RParam.dwCreateFile, 
277                           oldcode, 
278                           10, 
279                           &dwPid)) 
280     { 
281         printf("read error"); 
282         CloseHandle(hTargetProcess); 
283         FreeLibrary(hKernel32); 
284         return -1; 
285     } 
286 
287     strcat((char*)RParam.szOldCode, (char*)oldcode); 
288     RParam.FunAddr = dwFunAddr; 
289 
290     printf( 
291           "RParam.dwCreate文件:%.8xn" 
292           "RParam.dwMessageBox:%.8xn" 
293           "RParam.dwGetCurrentProcess:%.8xn" 
294           "RParam.dwWriteProcessMemory:%.8xn" 
295           "RParam.FunAddr:%.8xn", 
296           RParam.dwCreateFile, 
297           RParam.dwMessageBox, 
298           RParam.dwGetCurrentProcess, 
299           RParam.dwWriteProcessMemory, 
300           RParam.FunAddr); 
301     printf("RParam.szOldCode:"); 
302     for( int i = 0; i< 10; i++) 
303         printf("0x%.2x ", RParam.szOldCode); 
304     printf("n"); 
305      
306      
307     if(!WriteProcessMemory(hTargetProcess, (LPVOID)dwFunAddr, (LPVOID)&HookCreateFile, 8192, &dwPid)) 
308     { 
309         printf("WriteRemoteProcessesMemory Error!n"); 
310         CloseHandle(hTargetProcess); 
311         FreeLibrary(hKernel32); 
312         return -1; 
313     } 
314 
315     if(!WriteProcessMemory(hTargetProcess, (LPVOID)dwPramaAddr, (LPVOID)&RParam, sizeof(RemoteParam), &dwPid)) 
316     { 
317         printf("WriteRemoteProcessesMemory Error!n"); 
318         CloseHandle(hTargetProcess); 
319         FreeLibrary(hKernel32); 
320         return -1; 
321     } 
322      
323     if(!WriteProcessMemory(hTargetProcess, (LPVOID)RParam.dwCreateFile, (LPVOID)newcode, 10, &dwPid)) 
324     { 
325         printf("WriteRemoteProcessesMemory Error!n"); 
326         CloseHandle(hTargetProcess); 
327         FreeLibrary(hKernel32); 
328         return -1; 
329     } 
330 
331     printf("nThat's all, good luck :)n"); 
332     CloseHandle(hTargetProcess); 
333     FreeLibrary(hKernel32); 
334     return 0; 
335 } 
posted on 2006-11-18 16:52 独孤九剑 阅读(426) 评论(0)  编辑 收藏 引用 所属分类: Win32 、Visual C++ 8.0