Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

Untitled

By: a guest on Jun 10th, 2011  |  syntax: C++  |  size: 3.46 KB  |  views: 223  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
This paste has a previous version, view the difference. Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  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. }