/HookRegister/Hook/Hook.cpp

https://bitbucket.org/quarkbit/mycodes · C++ · 691 lines · 617 code · 67 blank · 7 comment · 161 complexity · 4755f0597e09a0f7848f97ac4b4a9db0 MD5 · raw file

  1. // Hook.cpp : Defines the entry point for the DLL application.
  2. //
  3. #include "stdafx.h"
  4. #include "detours.h"
  5. #pragma comment(lib, "detours.lib")
  6. #define TYPE_RegCreateKeyExA 0
  7. #define TYPE_RegCreateKeyExW 1
  8. #define TYPE_RegSetValueExA 2
  9. #define TYPE_RegSetValueExW 3
  10. #define TYPE_RegDeleteKeyA 4
  11. #define TYPE_RegDeleteKeyW 5
  12. #define TYPE_RegDeleteValueA 6
  13. #define TYPE_RegDeleteValueW 7
  14. #define TYPE_RegQueryValueExA 8
  15. #define TYPE_RegQueryValueExW 9
  16. #define WM_MonPIDInvalid WM_USER + 5642
  17. #pragma comment(linker, "/OPT:nowin98")
  18. #pragma data_seg(".Shard")
  19. HWND os_hWnd = NULL;
  20. HHOOK os_hhook = NULL;
  21. DWORD PID = 0;
  22. DWORD ExplorerPID = 0;
  23. DWORD RegMonPID = 0;
  24. BOOL HOOK_RegCreateKeyEx = TRUE;
  25. BOOL HOOK_RegSetValueEx = TRUE;
  26. BOOL HOOK_RegDeleteKey = TRUE;
  27. BOOL HOOK_RegDeleteValue = TRUE;
  28. BOOL HOOK_RegQueryValueEx = TRUE;
  29. #pragma data_seg()
  30. #pragma comment(linker,"/section:.Shard,rws")
  31. bool bTryed = false;
  32. bool bIntercepted = false;
  33. struct PARAMS
  34. {
  35. DWORD PID;
  36. HKEY hKey;
  37. char buffer1[1024];
  38. int cbBuffer1;
  39. char buffer2[1024];
  40. int cbBuffer2;
  41. DWORD type;
  42. long result;
  43. };
  44. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegCreateKeyExA(HKEY, LPCSTR, DWORD, LPSTR, DWORD, REGSAM, LPSECURITY_ATTRIBUTES, PHKEY, LPDWORD), RegCreateKeyExA);
  45. LONG WINAPI Mine_RegCreateKeyExA(
  46. HKEY hKey,
  47. LPCSTR lpSubKey,
  48. DWORD Reserved,
  49. LPSTR lpClass,
  50. DWORD dwOptions,
  51. REGSAM samDesired,
  52. LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  53. PHKEY phkResult,
  54. LPDWORD lpdwDisposition
  55. )
  56. {
  57. LONG nRet;
  58. __try{
  59. nRet = Real_RegCreateKeyExA(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, phkResult, lpdwDisposition);
  60. if(!HOOK_RegCreateKeyEx)
  61. return nRet;
  62. if(GetCurrentProcessId() == ExplorerPID)
  63. return nRet;
  64. if(GetCurrentProcessId() == RegMonPID)
  65. return nRet;
  66. if((PID == 0) || ((GetCurrentProcessId() == PID) && (PID>0)) )
  67. {
  68. if(lpSubKey == NULL)
  69. return nRet;
  70. COPYDATASTRUCT data;
  71. PARAMS params = {0};
  72. params.PID = GetCurrentProcessId();
  73. params.hKey = hKey;
  74. memcpy(params.buffer1, lpSubKey, strlen(lpSubKey));
  75. //memcpy(params.buffer2, lpClass, 1024);
  76. params.result = nRet;
  77. data.cbData = sizeof(PARAMS);
  78. data.lpData = &params;
  79. data.dwData = TYPE_RegCreateKeyExA;
  80. SendMessage(os_hWnd, WM_COPYDATA, (WPARAM)os_hWnd, (LPARAM)&data);
  81. }
  82. }__finally{
  83. };
  84. return nRet;
  85. }
  86. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegCreateKeyExW(HKEY, LPCWSTR, DWORD, LPWSTR, DWORD, REGSAM, LPSECURITY_ATTRIBUTES, PHKEY, LPDWORD), RegCreateKeyExW);
  87. LONG WINAPI Mine_RegCreateKeyExW(
  88. HKEY hKey,
  89. LPCWSTR lpSubKey,
  90. DWORD Reserved,
  91. LPWSTR lpClass,
  92. DWORD dwOptions,
  93. REGSAM samDesired,
  94. LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  95. PHKEY phkResult,
  96. LPDWORD lpdwDisposition
  97. )
  98. {
  99. LONG nRet;
  100. __try{
  101. nRet = Real_RegCreateKeyExW(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, phkResult, lpdwDisposition);
  102. if(!HOOK_RegCreateKeyEx)
  103. return nRet;
  104. if(GetCurrentProcessId() == ExplorerPID)
  105. return nRet;
  106. if(GetCurrentProcessId() == RegMonPID)
  107. return nRet;
  108. if((PID == 0) || ((GetCurrentProcessId() == PID) && (PID>0)) )
  109. {
  110. if(lpSubKey == NULL)
  111. return nRet;
  112. COPYDATASTRUCT data;
  113. PARAMS params = {0};
  114. params.PID = GetCurrentProcessId();
  115. params.hKey = hKey;
  116. memcpy(params.buffer1, lpSubKey, wcslen(lpSubKey)*2);
  117. //memcpy(params.buffer2, lpClass, 1024);
  118. params.result = nRet;
  119. data.cbData = sizeof(PARAMS);
  120. data.lpData = &params;
  121. data.dwData = TYPE_RegCreateKeyExW;
  122. SendMessage(os_hWnd, WM_COPYDATA, (WPARAM)os_hWnd, (LPARAM)&data);
  123. }
  124. }__finally{
  125. };
  126. return nRet;
  127. }
  128. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegSetValueExA(HKEY, LPCSTR, DWORD, DWORD, CONST BYTE*, DWORD), RegSetValueExA);
  129. LONG WINAPI Mine_RegSetValueExA(
  130. HKEY hKey,
  131. LPCSTR lpValueName,
  132. DWORD Reserved,
  133. DWORD dwType,
  134. CONST BYTE* lpData,
  135. DWORD cbData
  136. )
  137. {
  138. LONG nRet;
  139. __try{
  140. nRet = Real_RegSetValueExA(hKey, lpValueName, Reserved, dwType, lpData, cbData);
  141. if(!HOOK_RegSetValueEx)
  142. return nRet;
  143. if(GetCurrentProcessId() == ExplorerPID)
  144. return nRet;
  145. if(GetCurrentProcessId() == RegMonPID)
  146. return nRet;
  147. if((PID == 0) || ((GetCurrentProcessId() == PID) && (PID>0)) )
  148. {
  149. if(lpValueName == NULL || lpData == NULL)
  150. return nRet;
  151. COPYDATASTRUCT data;
  152. PARAMS params = {0};
  153. params.PID = GetCurrentProcessId();
  154. params.hKey = hKey;
  155. memcpy(params.buffer1, lpValueName, strlen(lpValueName));
  156. params.type = dwType;
  157. if(cbData>1024)
  158. {
  159. memcpy(params.buffer2, lpData, 1024);
  160. params.cbBuffer2 = 1024;
  161. }
  162. else
  163. {
  164. memcpy(params.buffer2, lpData, cbData);
  165. params.cbBuffer2 = cbData;
  166. }
  167. params.result = nRet;
  168. data.cbData = sizeof(PARAMS);
  169. data.lpData = &params;
  170. data.dwData = TYPE_RegSetValueExA;
  171. SendMessage(os_hWnd, WM_COPYDATA, (WPARAM)os_hWnd, (LPARAM)&data);
  172. }
  173. }__finally{
  174. };
  175. return nRet;
  176. }
  177. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegSetValueExW(HKEY, LPCWSTR, DWORD, DWORD, CONST BYTE*, DWORD), RegSetValueExW);
  178. LONG WINAPI Mine_RegSetValueExW(
  179. HKEY hKey,
  180. LPCWSTR lpValueName,
  181. DWORD Reserved,
  182. DWORD dwType,
  183. CONST BYTE* lpData,
  184. DWORD cbData
  185. )
  186. {
  187. LONG nRet;
  188. __try{
  189. nRet = Real_RegSetValueExW(hKey, lpValueName, Reserved, dwType, lpData, cbData);
  190. if(!HOOK_RegSetValueEx)
  191. return nRet;
  192. if(GetCurrentProcessId() == ExplorerPID)
  193. return nRet;
  194. if(GetCurrentProcessId() == RegMonPID)
  195. return nRet;
  196. if((PID == 0) || ((GetCurrentProcessId() == PID) && (PID>0)) )
  197. {
  198. if(lpValueName == NULL || lpData == NULL)
  199. return nRet;
  200. COPYDATASTRUCT data;
  201. PARAMS params = {0};
  202. params.PID = GetCurrentProcessId();
  203. params.hKey = hKey;
  204. memcpy(params.buffer1, lpValueName, wcslen(lpValueName)*2);
  205. params.type = dwType;
  206. if(cbData>1024)
  207. {
  208. memcpy(params.buffer2, lpData, 1024);
  209. params.cbBuffer2 = 1024;
  210. }
  211. else
  212. {
  213. memcpy(params.buffer2, lpData, cbData);
  214. params.cbBuffer2 = cbData;
  215. }
  216. params.result = nRet;
  217. data.cbData = sizeof(PARAMS);
  218. data.lpData = &params;
  219. data.dwData = TYPE_RegSetValueExW;
  220. SendMessage(os_hWnd, WM_COPYDATA, (WPARAM)os_hWnd, (LPARAM)&data);
  221. }
  222. }__finally{
  223. };
  224. return nRet;
  225. }
  226. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegDeleteKeyA(HKEY, LPCSTR), RegDeleteKeyA);
  227. LONG WINAPI Mine_RegDeleteKeyA(
  228. HKEY hKey,
  229. LPCSTR lpSubKey
  230. )
  231. {
  232. LONG nRet;
  233. __try{
  234. nRet = Real_RegDeleteKeyA(hKey, lpSubKey);
  235. if(!HOOK_RegDeleteKey)
  236. return nRet;
  237. if(GetCurrentProcessId() == ExplorerPID)
  238. return nRet;
  239. if(GetCurrentProcessId() == RegMonPID)
  240. return nRet;
  241. if((PID == 0) || ((GetCurrentProcessId() == PID) && (PID>0)) )
  242. {
  243. if(lpSubKey == NULL)
  244. return nRet;
  245. COPYDATASTRUCT data;
  246. PARAMS params = {0};
  247. params.PID = GetCurrentProcessId();
  248. params.hKey = hKey;
  249. memcpy(params.buffer1, lpSubKey, strlen(lpSubKey));
  250. data.cbData = sizeof(PARAMS);
  251. data.lpData = &params;
  252. data.dwData = TYPE_RegDeleteKeyA;
  253. SendMessage(os_hWnd, WM_COPYDATA, (WPARAM)os_hWnd, (LPARAM)&data);
  254. }
  255. }__finally{
  256. };
  257. return nRet;
  258. }
  259. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegDeleteKeyW(HKEY, LPCWSTR), RegDeleteKeyW);
  260. LONG WINAPI Mine_RegDeleteKeyW(
  261. HKEY hKey,
  262. LPCWSTR lpSubKey
  263. )
  264. {
  265. LONG nRet;
  266. __try{
  267. nRet = Real_RegDeleteKeyW(hKey, lpSubKey);
  268. if(!HOOK_RegDeleteKey)
  269. return nRet;
  270. if(GetCurrentProcessId() == ExplorerPID)
  271. return nRet;
  272. if(GetCurrentProcessId() == RegMonPID)
  273. return nRet;
  274. if((PID == 0) || ((GetCurrentProcessId() == PID) && (PID>0)) )
  275. {
  276. if(lpSubKey == NULL)
  277. return nRet;
  278. COPYDATASTRUCT data;
  279. PARAMS params = {0};
  280. params.PID = GetCurrentProcessId();
  281. params.hKey = hKey;
  282. memcpy(params.buffer1, lpSubKey, wcslen(lpSubKey)*2);
  283. data.cbData = sizeof(PARAMS);
  284. data.lpData = &params;
  285. data.dwData = TYPE_RegDeleteKeyW;
  286. SendMessage(os_hWnd, WM_COPYDATA, (WPARAM)os_hWnd, (LPARAM)&data);
  287. }
  288. }__finally{
  289. };
  290. return nRet;
  291. }
  292. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegDeleteValueA(HKEY, LPCSTR), RegDeleteValueA);
  293. LONG WINAPI Mine_RegDeleteValueA(
  294. HKEY hKey,
  295. LPCSTR lpValueName
  296. )
  297. {
  298. LONG nRet;
  299. __try{
  300. nRet = Real_RegDeleteValueA(hKey, lpValueName);
  301. if(!HOOK_RegDeleteValue)
  302. return nRet;
  303. if(GetCurrentProcessId() == ExplorerPID)
  304. return nRet;
  305. if(GetCurrentProcessId() == RegMonPID)
  306. return nRet;
  307. if((PID == 0) || ((GetCurrentProcessId() == PID) && (PID>0)) )
  308. {
  309. if(lpValueName == NULL)
  310. return nRet;
  311. COPYDATASTRUCT data;
  312. PARAMS params = {0};
  313. params.PID = GetCurrentProcessId();
  314. params.hKey = hKey;
  315. memcpy(params.buffer1, lpValueName, strlen(lpValueName));
  316. data.cbData = sizeof(PARAMS);
  317. data.lpData = &params;
  318. data.dwData = TYPE_RegDeleteValueA;
  319. SendMessage(os_hWnd, WM_COPYDATA, (WPARAM)os_hWnd, (LPARAM)&data);
  320. }
  321. }__finally{
  322. };
  323. return nRet;
  324. }
  325. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegDeleteValueW(HKEY, LPCWSTR), RegDeleteValueW);
  326. LONG WINAPI Mine_RegDeleteValueW(
  327. HKEY hKey,
  328. LPCWSTR lpValueName
  329. )
  330. {
  331. LONG nRet;
  332. __try{
  333. nRet = Real_RegDeleteValueW(hKey, lpValueName);
  334. if(!HOOK_RegDeleteValue)
  335. return nRet;
  336. if(GetCurrentProcessId() == ExplorerPID)
  337. return nRet;
  338. if(GetCurrentProcessId() == RegMonPID)
  339. return nRet;
  340. if((PID == 0) || ((GetCurrentProcessId() == PID) && (PID>0)) )
  341. {
  342. if(lpValueName == NULL)
  343. return nRet;
  344. COPYDATASTRUCT data;
  345. PARAMS params = {0};
  346. params.PID = GetCurrentProcessId();
  347. params.hKey = hKey;
  348. memcpy(params.buffer1, lpValueName, wcslen(lpValueName)*2);
  349. data.cbData = sizeof(PARAMS);
  350. data.lpData = &params;
  351. data.dwData = TYPE_RegDeleteValueW;
  352. SendMessage(os_hWnd, WM_COPYDATA, (WPARAM)os_hWnd, (LPARAM)&data);
  353. }
  354. }__finally{
  355. };
  356. return nRet;
  357. }
  358. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegQueryValueExA(HKEY, LPCSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD), RegQueryValueExA);
  359. LONG WINAPI Mine_RegQueryValueExA(
  360. HKEY hKey,
  361. LPCSTR lpValueName,
  362. LPDWORD lpReserved,
  363. LPDWORD lpType,
  364. LPBYTE lpData,
  365. LPDWORD lpcbData)
  366. {
  367. ::OutputDebugStringW(L"Mine_RegQueryValueExA");
  368. LONG nRet;
  369. __try{
  370. nRet = Real_RegQueryValueExA(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData);
  371. if(!HOOK_RegQueryValueEx)
  372. return nRet;
  373. if(GetCurrentProcessId() == ExplorerPID)
  374. return nRet;
  375. if(GetCurrentProcessId() == RegMonPID)
  376. return nRet;
  377. if((PID == 0) || ((GetCurrentProcessId() == PID) && (PID>0)) )
  378. {
  379. if(nRet != ERROR_SUCCESS)
  380. return nRet;
  381. COPYDATASTRUCT data;
  382. PARAMS params = {0};
  383. params.PID = GetCurrentProcessId();
  384. params.hKey = hKey;
  385. if(lpValueName == NULL || /*lpType == NULL ||*/ lpData == NULL || lpcbData == NULL)
  386. return nRet;
  387. memcpy(params.buffer1, lpValueName, strlen(lpValueName));
  388. if(lpType == NULL)
  389. params.type = 0;
  390. else
  391. params.type = *lpType;
  392. if(*lpcbData == 0)
  393. {
  394. return nRet;
  395. }
  396. else if(*lpcbData>1024)
  397. {
  398. memcpy(params.buffer2, lpData, 1024);
  399. params.cbBuffer2 = 1024;
  400. }
  401. else
  402. {
  403. memcpy(params.buffer2, lpData, *lpcbData);
  404. params.cbBuffer2 = *lpcbData;
  405. }
  406. params.result = nRet;
  407. data.cbData = sizeof(PARAMS);
  408. data.lpData = &params;
  409. data.dwData = TYPE_RegQueryValueExA;
  410. SendMessage(os_hWnd, WM_COPYDATA, (WPARAM)os_hWnd, (LPARAM)&data);
  411. }
  412. }__finally{
  413. };
  414. return nRet;
  415. }
  416. DETOUR_TRAMPOLINE(LONG APIENTRY Real_RegQueryValueExW(HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD), RegQueryValueExW);
  417. LONG APIENTRY Mine_RegQueryValueExW(
  418. HKEY hKey,
  419. LPCWSTR lpValueName,
  420. LPDWORD lpReserved,
  421. LPDWORD lpType,
  422. LPBYTE lpData,
  423. LPDWORD lpcbData)
  424. {
  425. ::OutputDebugStringW(L"Mine_RegQueryValueExW");
  426. LONG nRet;
  427. __try{
  428. nRet = Real_RegQueryValueExW(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData);
  429. if(!HOOK_RegQueryValueEx)
  430. return nRet;
  431. if(GetCurrentProcessId() == ExplorerPID)
  432. return nRet;
  433. if(GetCurrentProcessId() == RegMonPID)
  434. return nRet;
  435. if((PID == 0) || ((GetCurrentProcessId() == PID) && (PID>0)) )
  436. {
  437. if(nRet != ERROR_SUCCESS)
  438. return nRet;
  439. COPYDATASTRUCT data;
  440. PARAMS params = {0};
  441. params.PID = GetCurrentProcessId();
  442. params.hKey = hKey;
  443. if(lpValueName == NULL || /*lpType == NULL ||*/ lpData == NULL || lpcbData == NULL)
  444. return nRet;
  445. memcpy(params.buffer1, lpValueName, wcslen(lpValueName)*2);
  446. if(lpType == NULL)
  447. params.type = 0;
  448. else
  449. params.type = *lpType;
  450. if(*lpcbData == 0)
  451. {
  452. return nRet;
  453. }
  454. else if(*lpcbData>1024)
  455. {
  456. memcpy(params.buffer2, lpData, 1024);
  457. params.cbBuffer2 = 1024;
  458. }
  459. else
  460. {
  461. memcpy(params.buffer2, lpData, *lpcbData);
  462. params.cbBuffer2 = *lpcbData;
  463. }
  464. params.result = nRet;
  465. data.cbData = sizeof(PARAMS);
  466. data.lpData = &params;
  467. data.dwData = TYPE_RegQueryValueExW;
  468. SendMessage(os_hWnd, WM_COPYDATA, (WPARAM)os_hWnd, (LPARAM)&data);
  469. }
  470. }__finally{
  471. };
  472. return nRet;
  473. }
  474. DETOUR_TRAMPOLINE(BOOL WINAPI Real_PostQuitMessage(UINT), PostQuitMessage);
  475. BOOL WINAPI Mine_PostQuitMessage(UINT uExitCode)
  476. {
  477. BOOL nRet;
  478. __try{
  479. if(GetCurrentProcessId() == PID)
  480. {
  481. PostMessage(os_hWnd, WM_MonPIDInvalid, 0, 0);
  482. PID = 0;
  483. }
  484. nRet = Real_PostQuitMessage(uExitCode);
  485. }__finally{
  486. };
  487. return nRet;
  488. }
  489. #define SaveTrampoline(pbTrampoline, index) SaveOrgTrampoline((PBYTE)pbTrampoline, OrgTrampoline[index])
  490. #define PatchDetourRemove(pbTrampoline, index) PatchDetourTrampoline((PBYTE)pbTrampoline, OrgTrampoline[index])
  491. #define MineDetourFunctionWithTrampoline(pbTrampoline, pbDetour, index) \
  492. SaveTrampoline(pbTrampoline, index); \
  493. DetourFunctionWithTrampoline((PBYTE)pbTrampoline, (PBYTE)pbDetour);
  494. #define MineDetourRemove(pbTrampoline, pbDetour, index) \
  495. DetourRemove((PBYTE)pbTrampoline, (PBYTE)pbDetour); \
  496. PatchDetourRemove(pbTrampoline, index);
  497. BYTE OrgTrampoline[20][DETOUR_TRAMPOLINE_SIZE];
  498. void SaveOrgTrampoline(PBYTE pbTrampoline, PBYTE pBackup)
  499. {
  500. //´Ë¾äÊÇΪÁËDebug¸úReleaseÖж¼ÄÜÕæÕýµÃµ½º¯ÊýµØÖ·
  501. pbTrampoline = DetourGetFinalCode(pbTrampoline, TRUE);
  502. __asm
  503. {
  504. mov ecx, DETOUR_TRAMPOLINE_SIZE / 4
  505. mov esi, pbTrampoline
  506. mov edi, pBackup
  507. rep movsd
  508. }
  509. }
  510. void PatchDetourTrampoline(PBYTE pbTrampoline, PBYTE pBackup)
  511. {
  512. pbTrampoline = DetourGetFinalCode(pbTrampoline, TRUE);
  513. if (pbTrampoline == NULL)
  514. return;
  515. DWORD dwOldPerm = 0;
  516. HANDLE hProcess = GetCurrentProcess();
  517. if (!VirtualProtect(pbTrampoline, DETOUR_TRAMPOLINE_SIZE, PAGE_EXECUTE_READWRITE, &dwOldPerm))
  518. return;
  519. __asm
  520. {
  521. mov ecx, DETOUR_TRAMPOLINE_SIZE / 4
  522. mov edi, pbTrampoline
  523. mov esi, pBackup
  524. rep movsd
  525. }
  526. if (!FlushInstructionCache(hProcess, pbTrampoline, DETOUR_TRAMPOLINE_SIZE))
  527. return;
  528. VirtualProtect(pbTrampoline, DETOUR_TRAMPOLINE_SIZE, dwOldPerm, &dwOldPerm);
  529. }
  530. // *************************************************************************************
  531. void Intercept()
  532. {
  533. DEBUG_OUTPUT_MESSAGE;
  534. MineDetourFunctionWithTrampoline((PBYTE)Real_RegCreateKeyExA, (PBYTE)Mine_RegCreateKeyExA, 0);
  535. MineDetourFunctionWithTrampoline((PBYTE)Real_RegCreateKeyExW, (PBYTE)Mine_RegCreateKeyExW, 1);
  536. MineDetourFunctionWithTrampoline((PBYTE)Real_RegSetValueExA, (PBYTE)Mine_RegSetValueExA, 2);
  537. MineDetourFunctionWithTrampoline((PBYTE)Real_RegSetValueExW, (PBYTE)Mine_RegSetValueExW, 3);
  538. MineDetourFunctionWithTrampoline((PBYTE)Real_RegDeleteKeyA, (PBYTE)Mine_RegDeleteKeyA, 4);
  539. MineDetourFunctionWithTrampoline((PBYTE)Real_RegDeleteKeyW, (PBYTE)Mine_RegDeleteKeyW, 5);
  540. MineDetourFunctionWithTrampoline((PBYTE)Real_RegDeleteValueA, (PBYTE)Mine_RegDeleteValueA, 6);
  541. MineDetourFunctionWithTrampoline((PBYTE)Real_RegDeleteValueW, (PBYTE)Mine_RegDeleteValueW, 7);
  542. MineDetourFunctionWithTrampoline((PBYTE)Real_RegQueryValueExA, (PBYTE)Mine_RegQueryValueExA, 8);
  543. MineDetourFunctionWithTrampoline((PBYTE)Real_RegQueryValueExW, (PBYTE)Mine_RegQueryValueExW, 9);
  544. MineDetourFunctionWithTrampoline((PBYTE)Real_PostQuitMessage, (PBYTE)Mine_PostQuitMessage, 10);
  545. }
  546. void UnIntercept()
  547. {
  548. DEBUG_OUTPUT_MESSAGE;
  549. DetourRemove((PBYTE)Real_RegCreateKeyExA,(PBYTE)Mine_RegCreateKeyExA);
  550. DetourRemove((PBYTE)Real_RegCreateKeyExW,(PBYTE)Mine_RegCreateKeyExW);
  551. DetourRemove((PBYTE)Real_RegSetValueExA,(PBYTE)Mine_RegSetValueExA);
  552. DetourRemove((PBYTE)Real_RegSetValueExW,(PBYTE)Mine_RegSetValueExW);
  553. DetourRemove((PBYTE)Real_RegDeleteKeyA, (PBYTE)Mine_RegDeleteKeyA);
  554. DetourRemove((PBYTE)Real_RegDeleteKeyW, (PBYTE)Mine_RegDeleteKeyW);
  555. DetourRemove((PBYTE)Real_RegDeleteValueA, (PBYTE)Mine_RegDeleteValueA);
  556. DetourRemove((PBYTE)Real_RegDeleteValueW, (PBYTE)Mine_RegDeleteValueW);
  557. DetourRemove((PBYTE)Real_RegQueryValueExA, (PBYTE)Mine_RegQueryValueExA);
  558. DetourRemove((PBYTE)Real_RegQueryValueExW, (PBYTE)Mine_RegQueryValueExW);
  559. DetourRemove((PBYTE)Real_PostQuitMessage, (PBYTE)Mine_PostQuitMessage);
  560. }
  561. // *************************************************************************************
  562. BOOL APIENTRY DllMain( HANDLE hModule,
  563. DWORD ul_reason_for_call,
  564. LPVOID lpReserved
  565. )
  566. {
  567. switch (ul_reason_for_call)
  568. {
  569. case DLL_PROCESS_ATTACH:
  570. break;
  571. case DLL_THREAD_ATTACH:
  572. break;
  573. case DLL_THREAD_DETACH:
  574. break;
  575. case DLL_PROCESS_DETACH:
  576. {
  577. if ( bIntercepted ){
  578. bIntercepted = false;
  579. UnIntercept();
  580. }
  581. }
  582. break;
  583. }
  584. return TRUE;
  585. }
  586. LRESULT CALLBACK MyShellProc(int nCode, WPARAM wParam, LPARAM lParam)
  587. {
  588. if ( bTryed == false )
  589. {
  590. DEBUG_OUTPUT(_T("nCode = %d, wParam = %d, lParam = %d"), nCode, wParam, lParam);
  591. bTryed = true;
  592. Intercept();
  593. bIntercepted = true;
  594. }
  595. return ::CallNextHookEx( os_hhook, nCode, wParam, lParam );
  596. }
  597. extern "C" __declspec(dllexport) BOOL InstallHook(HWND handle)
  598. {
  599. DEBUG_OUTPUT_MESSAGE;
  600. os_hhook = ::SetWindowsHookEx(WH_SHELL, MyShellProc, GetModuleHandle("hook.dll"), 0);
  601. os_hWnd = handle;
  602. RegMonPID = GetCurrentProcessId();
  603. return os_hhook != 0;
  604. }
  605. extern "C" __declspec(dllexport) BOOL UninstallHook()
  606. {
  607. return ::UnhookWindowsHookEx(os_hhook);
  608. }
  609. extern "C" __declspec(dllexport) void SetFilter(DWORD pid)
  610. {
  611. PID = pid;
  612. }
  613. extern "C" __declspec(dllexport) void SetHookFunction(BOOL RegCreateKeyEx, BOOL RegSetValueEx, BOOL RegDeleteKey, BOOL RegDeleteValue, BOOL RegQueryValueEx)
  614. {
  615. HOOK_RegCreateKeyEx = RegCreateKeyEx;
  616. HOOK_RegSetValueEx = RegSetValueEx;
  617. HOOK_RegDeleteKey = RegDeleteKey;
  618. HOOK_RegDeleteValue = RegDeleteValue;
  619. HOOK_RegQueryValueEx = RegQueryValueEx;
  620. }
  621. extern "C" __declspec(dllexport) void SetExplorerPID(DWORD pid)
  622. {
  623. ExplorerPID = pid;
  624. }