1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <Winternl.h>
  5. #include <assert.h>
  6. #include <Tlhelp32.h>
  7.  
  8. #pragma pack(push, 1)
  9. struct far_jmp
  10. {
  11.     BYTE PushOp;
  12.     PVOID PushArg;
  13.     BYTE RetOp;
  14. };
  15.  
  16. struct OldCode
  17. {
  18.     DWORD One;
  19.     WORD Two;
  20. };
  21. #pragma pack(pop)
  22.  
  23. void StopThreads()
  24. {
  25.     DWORD currTh;
  26.     HANDLE thrHandle;
  27.     HANDLE h;
  28.     DWORD currPr;
  29.     THREADENTRY32 Thread;
  30.  
  31.     currTh = GetCurrentThreadId();
  32.     currPr = GetCurrentProcessId();
  33.     h = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
  34.     if(h != INVALID_HANDLE_VALUE) {
  35.         Thread.dwSize = sizeof(THREADENTRY32);
  36.         if(Thread32First(h, &Thread)) {
  37.             do {
  38.                 if(Thread.th32ThreadID != currTh && Thread.th32OwnerProcessID == currPr) {
  39.                     thrHandle = OpenThread(THREAD_SUSPEND_RESUME, FALSE, Thread.th32ThreadID);
  40.                     if(thrHandle > 0) {
  41.                         SuspendThread(thrHandle);
  42.                         CloseHandle(thrHandle);
  43.                     }
  44.                 }
  45.             }
  46.             while(!Thread32Next(h, &Thread));
  47.         }
  48.         CloseHandle(h);
  49.     }
  50. }
  51.  
  52. void RunThreads()
  53. {
  54.     DWORD currTh;
  55.     HANDLE thrHandle;
  56.     HANDLE h;
  57.     DWORD currPr;
  58.     THREADENTRY32 Thread;
  59.  
  60.     currTh = GetCurrentThreadId();
  61.     currPr = GetCurrentProcessId();
  62.     h = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
  63.     if(h != INVALID_HANDLE_VALUE) {
  64.         Thread.dwSize = sizeof(THREADENTRY32);
  65.         if(Thread32First(h, &Thread)) {
  66.             do {
  67.                 if(Thread.th32ThreadID != currTh && Thread.th32OwnerProcessID == currPr) {
  68.                     thrHandle = OpenThread(THREAD_SUSPEND_RESUME, FALSE, Thread.th32ThreadID);
  69.                     if(thrHandle > 0) {
  70.                         ResumeThread(thrHandle);
  71.                         CloseHandle(thrHandle);
  72.                     }
  73.                 }
  74.             }
  75.             while(!Thread32Next(h, &Thread));
  76.         }
  77.         CloseHandle(h);
  78.     }
  79. }
  80.  
  81. HANDLE RegQueryCurrProc;
  82. PVOID AdrRegQuery;
  83. OldCode OldRegQuery;
  84. far_jmp JmpRegQuery;
  85.  
  86. typedef NTSTATUS (WINAPI *NewOpenKeyFun)(PHANDLE KeyHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes);  
  87.  
  88. // My new function
  89. NTSTATUS WINAPI NOpenKey(PHANDLE KeyHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes)
  90. {
  91.     FILE* outfile = fopen("syscalls.log", "a");
  92.  
  93.    
  94.     buffer = (char*)malloc(ObjectAttributes->ObjectName->Length + 1);
  95.     wctomb(buffer, *ObjectAttributes->ObjectName->Buffer);
  96.     buffer[ObjectAttributes->ObjectName->Length] = '\0';
  97.     fprintf(outfile, "%s\n", buffer);
  98.     fclose(outfile);
  99.  
  100.     WriteProcessMemory(GetCurrentProcess(), AdrRegQuery, &OldRegQuery, sizeof(OldCode), &Written);
  101.  
  102.     //NewOpenKeyFun ZwOpenKeyAddress =      (NewOpenKeyFun)GetProcAddress(GetModuleHandle(L"Ntdll.dll"), "ZwOpenKey"); 
  103.     NewOpenKeyFun ZwOpenKeyAddress = (NewOpenKeyFun)AdrRegQuery;
  104.  
  105.     NTSTATUS result = (*ZwOpenKeyAddress)(KeyHandle, DesiredAccess, ObjectAttributes);
  106.    
  107.    
  108.     WriteProcessMemory(GetCurrentProcess(), AdrRegQuery, &JmpRegQuery, sizeof(far_jmp), &Written);
  109.     return result;
  110. }
  111.  
  112. void SetRegQueryHook()
  113. {
  114.     DWORD Written;
  115.     AdrRegQuery = GetProcAddress(GetModuleHandle(L"Ntdll.dll"), "ZwOpenKey");
  116.     JmpRegQuery.PushOp = 0x68;
  117.         JmpRegQuery.PushArg = NOpenKey;
  118.         JmpRegQuery.RetOp = 0xC3;
  119.     ReadProcessMemory(GetCurrentProcess(), AdrRegQuery, &OldRegQuery, sizeof(OldCode), &Written);
  120.     WriteProcessMemory(GetCurrentProcess(), AdrRegQuery, &JmpRegQuery, sizeof(far_jmp), &Written);
  121. }
  122.  
  123. BOOL APIENTRY DllMain( HANDLE hModule,
  124.                        DWORD  ul_reason_for_call,
  125.                        LPVOID lpReserved
  126.                      )
  127. {  
  128.     if( (ul_reason_for_call == DLL_PROCESS_ATTACH)) {  
  129.         StopThreads();
  130.         SetRegQueryHook();
  131.         RunThreads();
  132.     }  
  133.     return TRUE;
  134. }