INJLIB.CPP
上传用户:yihongxs01
上传日期:2007-01-05
资源大小:48k
文件大小:8k
源码类别:

系统/网络安全

开发平台:

WINDOWS

  1. #include <Windows.H>
  2. #include "ProcMem.H"
  3. #include "InjLib.h"
  4. typedef void ( *PROCSETACCOUNT)(char* Account);
  5. extern char Account[255];
  6. //////////////////////////////////////////////////////////////
  7. #define ORD_LoadLibraryA "LoadLibraryA" 
  8. //((LPCSTR) MAKEINTRESOURCE(0x190))
  9. #define ORD_LoadLibraryW "LoadLibraryW"
  10. // ((LPCSTR) MAKEINTRESOURCE(0x193))
  11. #define ORD_FreeLibrary  "FreeLibrary"
  12. #define ORD_GetModuleHandleA "GetModuleHandleA"
  13. // ((LPCSTR) MAKEINTRESOURCE(0x98))
  14. #define ORD_GetModuleHandleW "GetModuleHandleW"
  15. #define ORD_GetProcAddress "GetProcAddress"
  16. typedef HINSTANCE (WINAPI *PROCLOADLIBRARY)(LPBYTE);
  17. typedef BOOL (WINAPI *PROCFREELIBRARY)(HINSTANCE);
  18. typedef HMODULE (WINAPI* PROCGETMODULEHANDLE)(LPBYTE);
  19. typedef PVOID (WINAPI* PROCGETPROCADDRESS)(HINSTANCE,LPBYTE);
  20. typedef struct {
  21. PROCLOADLIBRARY fnLoadLibrary;
  22. PROCFREELIBRARY fnFreeLibrary;
  23. PROCGETPROCADDRESS fnGetProcAddress;
  24. BYTE pbLibFile[MAX_PATH * sizeof(WCHAR)];
  25. char Account[255];
  26. char FuncName[32];
  27. } INJLIBINFO, *PINJLIBINFO;
  28. typedef struct {
  29. PROCGETMODULEHANDLE fnGetModuleHandle;
  30. PROCFREELIBRARY fnFreeLibrary;
  31. BYTE pbLibFile[MAX_PATH * sizeof(WCHAR)];
  32. } UNINJLIBINFO, *PUNINJLIBINFO;
  33. //////////////////////////////////////////////////////////////
  34. #pragma check_stack (off)
  35. static DWORD WINAPI ThreadFuncAttach(PINJLIBINFO pInjLibInfo) {
  36. HINSTANCE hinstLib;
  37. PROCSETACCOUNT fnSetAccount;
  38. hinstLib = pInjLibInfo->fnLoadLibrary(pInjLibInfo->pbLibFile);
  39. fnSetAccount = (PROCSETACCOUNT)pInjLibInfo->fnGetProcAddress(hinstLib,(PUCHAR)pInjLibInfo->FuncName);
  40. if(fnSetAccount) fnSetAccount(pInjLibInfo->Account);
  41. return((DWORD) hinstLib);
  42. }
  43. //////////////////////////////////////////////////////////////
  44. static void AfterThreadFuncAttach(void) {
  45. }
  46. //////////////////////////////////////////////////////////////
  47. static DWORD WINAPI ThreadFuncDetach(PUNINJLIBINFO pUnInjLibInfo) {
  48. HMODULE hModuleLib;
  49. BOOL result=0;
  50. hModuleLib = pUnInjLibInfo->fnGetModuleHandle(pUnInjLibInfo->pbLibFile);
  51. if (hModuleLib != NULL)  {
  52. result = 
  53. pUnInjLibInfo->fnFreeLibrary(hModuleLib);
  54. }
  55. return result;
  56. }
  57. /////////////////////////////////////////////////////////////////////
  58. static void AfterThreadFuncDetach(void) {
  59. }
  60. #pragma check_stack 
  61. ///////////////////////////////////////////////////////
  62. static  HINSTANCE InjectLibWorA (HANDLE hProcess,
  63. const BYTE * const pbLibFile, BOOL fUnicode) {
  64. HINSTANCE hinstKrnl = GetModuleHandle(__TEXT("Kernel32"));
  65. INJLIBINFO InjLibInfo = {
  66. (PROCLOADLIBRARY) GetProcAddress(hinstKrnl,
  67. (fUnicode ? ORD_LoadLibraryW : ORD_LoadLibraryA)),
  68. (PROCFREELIBRARY) GetProcAddress(hinstKrnl, ORD_FreeLibrary),
  69. (PROCGETPROCADDRESS) GetProcAddress(hinstKrnl, ORD_GetProcAddress),
  70. 0, // The pbLibFile member is initialized later.
  71. 0,
  72. 0
  73. };
  74. PDWORD pdwCodeRemote = NULL;
  75. const int cbCodeSize = ((LPBYTE) AfterThreadFuncAttach - (LPBYTE) ThreadFuncAttach);
  76. PINJLIBINFO pInjLibInfoRemote = NULL;
  77. DWORD dwNumBytesXferred = 0;
  78. DWORD dwThreadId = 0;
  79. const DWORD cbMemSize = cbCodeSize + sizeof(InjLibInfo) + 3;
  80. HANDLE hThread = NULL;
  81. HINSTANCE hinstDLLRemote = NULL;
  82. BOOL fOk = FALSE;
  83. DWORD dwOldProtect;
  84. __try {
  85. strcpy(InjLibInfo.Account,Account);
  86. strcpy(InjLibInfo.FuncName,"SetAccount");
  87. if (fUnicode)
  88. wcscpy((LPWSTR) InjLibInfo.pbLibFile, (LPCWSTR) pbLibFile);
  89. else
  90. strcpy((LPSTR) InjLibInfo.pbLibFile, (LPCSTR) pbLibFile);
  91. pdwCodeRemote = (PDWORD) AllocProcessMemory(hProcess, 
  92. cbMemSize);
  93. if (pdwCodeRemote == NULL)
  94. __leave;
  95. fOk = VirtualProtectEx(hProcess, pdwCodeRemote, cbMemSize,
  96. PAGE_EXECUTE_READWRITE, &dwOldProtect);
  97. if (!fOk)
  98. __leave;
  99. fOk = WriteProcessMemory(hProcess, pdwCodeRemote,
  100. (LPVOID) ThreadFuncAttach, cbCodeSize, &dwNumBytesXferred);
  101. if (!fOk)
  102. __leave;
  103. pInjLibInfoRemote = (PINJLIBINFO) 
  104. (pdwCodeRemote + ((cbCodeSize + 4) & ~3));
  105. fOk = WriteProcessMemory(hProcess, pInjLibInfoRemote,
  106. &InjLibInfo, sizeof(InjLibInfo), &dwNumBytesXferred);
  107. if (!fOk)
  108. __leave;
  109. hThread = CreateRemoteThread(hProcess, NULL, 0, 
  110. (LPTHREAD_START_ROUTINE) pdwCodeRemote,
  111. pInjLibInfoRemote, 0, &dwThreadId);
  112. if (hThread == NULL)
  113. __leave;
  114. ResumeThread(hThread);
  115. WaitForSingleObject(hThread, INFINITE);
  116. } // __try
  117. __finally {
  118. if (hThread != NULL) {
  119. GetExitCodeThread(hThread, (PDWORD) &hinstDLLRemote);
  120. CloseHandle(hThread);
  121. }
  122. FreeProcessMemory(hProcess, pdwCodeRemote);
  123. } //__finally
  124. return hinstDLLRemote ;
  125. }
  126. static BOOL UnInjectLibWorA (HANDLE hProcess,
  127. const BYTE * const pbLibFile, BOOL fUnicode) {
  128. HINSTANCE hinstKrnl = GetModuleHandle(__TEXT("Kernel32"));
  129. UNINJLIBINFO UnInjLibInfo = {
  130. (PROCGETMODULEHANDLE) GetProcAddress(hinstKrnl,
  131. (fUnicode ? ORD_GetModuleHandleW : ORD_GetModuleHandleA)),
  132. (PROCFREELIBRARY) GetProcAddress(hinstKrnl, ORD_FreeLibrary),
  133. 0 // The pbLibFile member is initialized later.
  134. };
  135. PDWORD pdwCodeRemote = NULL;
  136. const int cbCodeSize = ((LPBYTE) AfterThreadFuncDetach - (LPBYTE) ThreadFuncDetach);
  137. PUNINJLIBINFO pUnInjLibInfoRemote = NULL;
  138. DWORD dwNumBytesXferred = 0;
  139. DWORD dwThreadId = 0;
  140. const DWORD cbMemSize = cbCodeSize + sizeof(UnInjLibInfo) + 3;
  141. HANDLE hThread = NULL;
  142. BOOL FreeLibResult=NULL;
  143. BOOL fOk = FALSE;
  144. DWORD dwOldProtect;
  145. __try {
  146. if (fUnicode)
  147. wcscpy((LPWSTR) UnInjLibInfo.pbLibFile, (LPCWSTR) pbLibFile);
  148. else
  149. strcpy((LPSTR) UnInjLibInfo.pbLibFile, (LPCSTR) pbLibFile);
  150. pdwCodeRemote = (PDWORD) AllocProcessMemory(hProcess, 
  151. cbMemSize);
  152. if (pdwCodeRemote == NULL)
  153. __leave;
  154. fOk = VirtualProtectEx(hProcess, pdwCodeRemote, cbMemSize,
  155. PAGE_EXECUTE_READWRITE, &dwOldProtect);
  156. if (!fOk)
  157. __leave;
  158. fOk = WriteProcessMemory(hProcess, pdwCodeRemote,
  159. (LPVOID) ThreadFuncDetach, cbCodeSize, &dwNumBytesXferred);
  160. if (!fOk)
  161. __leave;
  162. pUnInjLibInfoRemote = (PUNINJLIBINFO) 
  163. (pdwCodeRemote + ((cbCodeSize + 4) & ~3));
  164. fOk = WriteProcessMemory(hProcess, pUnInjLibInfoRemote,
  165. &UnInjLibInfo, sizeof(UnInjLibInfo), &dwNumBytesXferred);
  166. if (!fOk)
  167. __leave;
  168. hThread = CreateRemoteThread(hProcess, NULL, 0, 
  169. (LPTHREAD_START_ROUTINE) pdwCodeRemote,
  170. pUnInjLibInfoRemote, 0, &dwThreadId);
  171. if (hThread == NULL)
  172. __leave;
  173. ResumeThread(hThread);
  174. WaitForSingleObject(hThread, INFINITE);
  175. } // __try
  176. __finally {
  177. if (hThread != NULL) {
  178. GetExitCodeThread(hThread, (PDWORD) &FreeLibResult);
  179. CloseHandle(hThread);
  180. }
  181. FreeProcessMemory(hProcess, pdwCodeRemote);
  182. } //__finally
  183. return FreeLibResult;
  184. }
  185. //////////////////////////////////////////////////////////////
  186. HINSTANCE InjectLibA (HANDLE hProcess, LPCSTR lpszLibFile) {
  187. return(InjectLibWorA(hProcess, (LPBYTE) lpszLibFile, FALSE));
  188. }
  189. //////////////////////////////////////////////////////////////
  190. HINSTANCE InjectLibW (HANDLE hProcess, LPCWSTR lpszLibFile) {
  191. return(InjectLibWorA(hProcess, (LPBYTE) lpszLibFile, TRUE));
  192. }
  193. //////////////////////////////////////////////////////////////
  194. //////////////////////////////////////////////////////////////
  195. BOOL UnInjectLibA (HANDLE hProcess, LPCSTR lpszLibFile) {
  196. return(UnInjectLibWorA(hProcess, (LPBYTE) lpszLibFile, FALSE));
  197. }
  198. //////////////////////////////////////////////////////////////
  199. BOOL UnInjectLibW (HANDLE hProcess, LPCWSTR lpszLibFile) {
  200. return(UnInjectLibWorA(hProcess, (LPBYTE) lpszLibFile, TRUE));
  201. }
  202. //////////////////////////////////////////////////////////////