vic4key

hook_create_process.cpp

Jun 24th, 2015
686
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. g++ hook_create_process.cpp ../CatEngine/CatEngine.cpp -lpsapi -shared -o hook_create_process.dll
  3. */
  4.  
  5. #include <windows.h>
  6. #include <stdio.h>
  7. #include "../CatEngine/CatEngine.h"
  8.  
  9. #pragma GCC diagnostic ignored "-Wattributes"
  10.  
  11. #define getOaObjectName(oa)(oa != NULL && oa->ObjectName->Length != 0 ? oa->ObjectName->Buffer : L"<None>")
  12.  
  13. /********************** Types **********************/
  14.  
  15. typedef int NTSTATUS, POOL_TYPE;
  16.  
  17. typedef struct _UNICODE_STRING {
  18.     USHORT Length;
  19.     USHORT MaximumLength;
  20.     PWSTR  Buffer;
  21. } UNICODE_STRING, *PUNICODE_STRING;
  22.  
  23. typedef struct _OBJECT_ATTRIBUTES {
  24.     ULONG           Length;
  25.     HANDLE          RootDirectory;
  26.     PUNICODE_STRING ObjectName;
  27.     ULONG           Attributes;
  28.     PVOID           SecurityDescriptor;
  29.     PVOID           SecurityQualityOfService;
  30. }  OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
  31.  
  32. typedef BOOL (WINAPI *PfnCreateProcessW)(
  33.     LPCWSTR lpApplicationName,
  34.     LPWSTR lpCommandLine,
  35.     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  36.     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  37.     BOOL bInheritHandles,
  38.     DWORD dwCreationFlags,
  39.     LPVOID lpEnvironment,
  40.     LPCWSTR lpCurrentDirectory,
  41.     LPSTARTUPINFOW lpStartupInfo,
  42.     LPPROCESS_INFORMATION lpProcessInformation
  43. );
  44.  
  45. typedef BOOL (WINAPI *PfnCreateProcessInternalW)(
  46.     HANDLE hUserToken,
  47.     LPCWSTR lpApplicationName,
  48.     LPWSTR lpCommandLine,
  49.     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  50.     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  51.     BOOL bInheritHandles,
  52.     DWORD dwCreationFlags,
  53.     LPVOID lpEnvironment,
  54.     LPCWSTR lpCurrentDirectory,
  55.     LPSTARTUPINFOW lpStartupInfo,
  56.     LPPROCESS_INFORMATION lpProcessInformation,
  57.     PHANDLE hNewToken
  58. );
  59.  
  60. typedef BOOL (WINAPI *PfnCreateProcessAsUserW)(
  61.     HANDLE hToken,
  62.     LPCWSTR lpApplicationName,
  63.     LPWSTR lpCommandLine,
  64.     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  65.     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  66.     BOOL bInheritHandles,
  67.     DWORD dwCreationFlags,
  68.     LPVOID lpEnvironment,
  69.     LPCWSTR lpCurrentDirectory,
  70.     LPSTARTUPINFOW lpStartupInfo,
  71.     LPPROCESS_INFORMATION lpProcessInformation
  72. );
  73.  
  74. typedef BOOL (WINAPI *PfnCreateProcessWithLogonW)(
  75.     LPCWSTR lpUsername,
  76.     LPCWSTR lpDomain,
  77.     LPCWSTR lpPassword,
  78.     DWORD dwLogonFlags,
  79.     LPCWSTR lpApplicationName,
  80.     LPWSTR lpCommandLine,
  81.     DWORD dwCreationFlags,
  82.     LPVOID lpEnvironment,
  83.     LPCWSTR lpCurrentDirectory,
  84.     LPSTARTUPINFOW lpStartupInfo,
  85.     LPPROCESS_INFORMATION lpProcessInfo
  86. );
  87.  
  88. typedef NTSTATUS (NTAPI *PfnNtCreateProcessEx)(
  89.     PHANDLE ProcessHandle,
  90.     ACCESS_MASK DesiredAccess,
  91.     POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  92.     HANDLE ParentProcess,
  93.     ULONG Flags,
  94.     HANDLE SectionHandle OPTIONAL,
  95.     HANDLE DebugPort OPTIONAL,
  96.     HANDLE ExceptionPort OPTIONAL,
  97.     BOOLEAN InJob
  98. );
  99.  
  100. typedef NTSTATUS (NTAPI *PfnNtCreateProcess)(
  101.     PHANDLE ProcessHandle,
  102.     ACCESS_MASK DesiredAccess,
  103.     POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  104.     HANDLE ParentProcess,
  105.     BOOLEAN InheritObjectTable,
  106.     HANDLE SectionHandle OPTIONAL,
  107.     HANDLE DebugPort OPTIONAL,
  108.     HANDLE ExceptionPort OPTIONAL
  109. );
  110.  
  111. typedef NTSTATUS (NTAPI *PfnNtCreateSection)(
  112.     PHANDLE SectionHandle,
  113.     ACCESS_MASK DesiredAccess,
  114.     POBJECT_ATTRIBUTES ObjectAttributes,
  115.     PLARGE_INTEGER MaximumSize,
  116.     ULONG SectionPageProtection,
  117.     ULONG AllocationAttributes,
  118.     HANDLE FileHandle
  119. );
  120.  
  121. typedef HINSTANCE (WINAPI *PfnShellExecuteW)(
  122.     HWND hwnd,
  123.     LPCWSTR lpOperation,
  124.     LPCWSTR lpFile,
  125.     LPCWSTR lpParameters,
  126.     LPCWSTR lpDirectory,
  127.     INT nShowCmd
  128. );
  129.  
  130. typedef BOOL (WINAPI *PfnShellExecuteExW)(
  131.     LPSHELLEXECUTEINFOW lpExecInfo
  132. );
  133.  
  134. /********************** Variables **********************/
  135.  
  136. PfnCreateProcessW pfnCreateProcessW = NULL;
  137. PfnCreateProcessInternalW pfnCreateProcessInternalW = NULL;
  138. PfnCreateProcessAsUserW pfnCreateProcessAsUserW = NULL;
  139. PfnCreateProcessWithLogonW pfnCreateProcessWithLogonW = NULL;
  140. PfnNtCreateProcessEx pfnNtCreateProcessEx = NULL;
  141. PfnNtCreateProcess pfnNtCreateProcess = NULL;
  142. PfnNtCreateSection pfnNtCreateSection = NULL;
  143. PfnShellExecuteW pfnShellExecuteW = NULL;
  144. PfnShellExecuteExW pfnShellExecuteExW = NULL;
  145.  
  146. /********************** Routines **********************/
  147.  
  148. BOOL WINAPI HfnCreateProcessW(
  149.     LPCWSTR lpApplicationName,
  150.     LPWSTR lpCommandLine,
  151.     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  152.     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  153.     BOOL bInheritHandles,
  154.     DWORD dwCreationFlags,
  155.     LPVOID lpEnvironment,
  156.     LPCWSTR lpCurrentDirectory,
  157.     LPSTARTUPINFOW lpStartupInfo,
  158.     LPPROCESS_INFORMATION lpProcessInformation
  159. )
  160. {
  161.     catMsgW(L"CreateProcessW: Would you like create process? '%s'", lpApplicationName);
  162.     return pfnCreateProcessW(
  163.         lpApplicationName,
  164.         lpCommandLine,
  165.         lpProcessAttributes,
  166.         lpThreadAttributes,
  167.         bInheritHandles,
  168.         dwCreationFlags,
  169.         lpEnvironment,
  170.         lpCurrentDirectory,
  171.         lpStartupInfo,
  172.         lpProcessInformation
  173.     );
  174. }
  175.  
  176. BOOL WINAPI HfnCreateProcessInternalW(
  177.     HANDLE hUserToken,
  178.     LPCWSTR lpApplicationName,
  179.     LPWSTR lpCommandLine,
  180.     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  181.     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  182.     BOOL bInheritHandles,
  183.     DWORD dwCreationFlags,
  184.     LPVOID lpEnvironment,
  185.     LPCWSTR lpCurrentDirectory,
  186.     LPSTARTUPINFOW lpStartupInfo,
  187.     LPPROCESS_INFORMATION lpProcessInformation,
  188.     PHANDLE hNewToken
  189. )
  190. {
  191.     catMsgW(L"CreateProcessInternalW: Would you like create process? '%s'", lpApplicationName);
  192.     return pfnCreateProcessInternalW(
  193.         hUserToken,
  194.         lpApplicationName,
  195.         lpCommandLine,
  196.         lpProcessAttributes,
  197.         lpThreadAttributes,
  198.         bInheritHandles,
  199.         dwCreationFlags,
  200.         lpEnvironment,
  201.         lpCurrentDirectory,
  202.         lpStartupInfo,
  203.         lpProcessInformation,
  204.         hNewToken
  205.     );
  206. }
  207.  
  208. BOOL WINAPI HfnCreateProcessAsUserW(
  209.     HANDLE hToken,
  210.     LPCWSTR lpApplicationName,
  211.     LPWSTR lpCommandLine,
  212.     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  213.     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  214.     BOOL bInheritHandles,
  215.     DWORD dwCreationFlags,
  216.     LPVOID lpEnvironment,
  217.     LPCWSTR lpCurrentDirectory,
  218.     LPSTARTUPINFOW lpStartupInfo,
  219.     LPPROCESS_INFORMATION lpProcessInformation
  220. )
  221. {
  222.     catMsgW(L"CreateProcessAsUserW: Would you like create process? '%s'", lpApplicationName);
  223.     return pfnCreateProcessAsUserW(
  224.         hToken,
  225.         lpApplicationName,
  226.         lpCommandLine,
  227.         lpProcessAttributes,
  228.         lpThreadAttributes,
  229.         bInheritHandles,
  230.         dwCreationFlags,
  231.         lpEnvironment,
  232.         lpCurrentDirectory,
  233.         lpStartupInfo,
  234.         lpProcessInformation
  235.     );
  236. }
  237.  
  238. BOOL WINAPI HfnCreateProcessWithLogonW(
  239.     LPCWSTR lpUsername,
  240.     LPCWSTR lpDomain,
  241.     LPCWSTR lpPassword,
  242.     DWORD dwLogonFlags,
  243.     LPCWSTR lpApplicationName,
  244.     LPWSTR lpCommandLine,
  245.     DWORD dwCreationFlags,
  246.     LPVOID lpEnvironment,
  247.     LPCWSTR lpCurrentDirectory,
  248.     LPSTARTUPINFOW lpStartupInfo,
  249.     LPPROCESS_INFORMATION lpProcessInfo
  250. )
  251. {
  252.     catMsgW(L"CreateProcessWithLogonW: Would you like create process? '%s'", lpApplicationName);
  253.     return pfnCreateProcessWithLogonW(
  254.         lpUsername,
  255.         lpDomain,
  256.         lpPassword,
  257.         dwLogonFlags,
  258.         lpApplicationName,
  259.         lpCommandLine,
  260.         dwCreationFlags,
  261.         lpEnvironment,
  262.         lpCurrentDirectory,
  263.         lpStartupInfo,
  264.         lpProcessInfo
  265.     );
  266. }
  267.  
  268. NTSTATUS NTAPI HfnNtCreateProcessEx(
  269.     PHANDLE ProcessHandle,
  270.     ACCESS_MASK DesiredAccess,
  271.     POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  272.     HANDLE ParentProcess,
  273.     ULONG Flags,
  274.     HANDLE SectionHandle OPTIONAL,
  275.     HANDLE DebugPort OPTIONAL,
  276.     HANDLE ExceptionPort OPTIONAL,
  277.     BOOLEAN InJob
  278. )
  279. {
  280.     catMsgW(L"NtCreateProcessEx: Would you like create process? '%s'", getOaObjectName(ObjectAttributes));
  281.     return pfnNtCreateProcessEx(
  282.         ProcessHandle,
  283.         DesiredAccess,
  284.         ObjectAttributes,
  285.         ParentProcess,
  286.         Flags,
  287.         SectionHandle,
  288.         DebugPort,
  289.         ExceptionPort,
  290.         InJob
  291.     );
  292. }
  293.  
  294. NTSTATUS NTAPI HfnNtCreateProcess(
  295.     PHANDLE ProcessHandle,
  296.     ACCESS_MASK DesiredAccess,
  297.     POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  298.     HANDLE ParentProcess,
  299.     BOOLEAN InheritObjectTable,
  300.     HANDLE SectionHandle OPTIONAL,
  301.     HANDLE DebugPort OPTIONAL,
  302.     HANDLE ExceptionPort OPTIONAL
  303. )
  304. {
  305.     catMsgW(L"NtCreateProcess: Would you like create process? '%s'", getOaObjectName(ObjectAttributes));
  306.     return pfnNtCreateProcess(
  307.         ProcessHandle,
  308.         DesiredAccess,
  309.         ObjectAttributes,
  310.         ParentProcess,
  311.         InheritObjectTable,
  312.         SectionHandle,
  313.         DebugPort,
  314.         ExceptionPort
  315.     );
  316. }
  317.  
  318. NTSTATUS HfnNtCreateSection(
  319.     PHANDLE SectionHandle,
  320.     ACCESS_MASK DesiredAccess,
  321.     POBJECT_ATTRIBUTES ObjectAttributes,
  322.     PLARGE_INTEGER MaximumSize,
  323.     ULONG SectionPageProtection,
  324.     ULONG AllocationAttributes,
  325.     HANDLE FileHandle
  326. )
  327. {
  328.     //catMsgW(L"NtCreateSection: Would you like create process? '%s'", getOaObjectName(ObjectAttributes));
  329.     return pfnNtCreateSection(
  330.         SectionHandle,
  331.         DesiredAccess,
  332.         ObjectAttributes,
  333.         MaximumSize,
  334.         SectionPageProtection,
  335.         AllocationAttributes,
  336.         FileHandle
  337.     );
  338. }
  339.  
  340. HINSTANCE WINAPI HfnShellExecuteW(
  341.     HWND hwnd,
  342.     LPCWSTR lpOperation,
  343.     LPCWSTR lpFile,
  344.     LPCWSTR lpParameters,
  345.     LPCWSTR lpDirectory,
  346.     INT nShowCmd
  347. )
  348. {
  349.     catMsgW(L"ShellExecuteW: Would you like create process? '%s'", lpFile);
  350.     return pfnShellExecuteW(
  351.         hwnd,
  352.         lpOperation,
  353.         lpFile,
  354.         lpParameters,
  355.         lpDirectory,
  356.         nShowCmd
  357.     );
  358. }
  359.  
  360. BOOL WINAPI HfnShellExecuteExW(LPSHELLEXECUTEINFOW lpExecInfo)
  361. {
  362.     catMsgW(L"ShellExecuteExW: Would you like create process? '%s'", lpExecInfo->lpFile);
  363.     return pfnShellExecuteExW(lpExecInfo);
  364. }
  365.  
  366. CcatHookAPI myHook;
  367.  
  368. #define ATTACH(m, p, cb, v)\
  369. if (myHook.catAPIAttach(m, p, (void*)cb, (void**)v)) {\
  370. catMsg(T("[+] Attach '%s' success!"), p);\
  371. }\
  372. else {\
  373. catMsg(T("[!] Attach '%s' failed!"), p);\
  374. }
  375.  
  376. #define DETACH(m, p, v)\
  377. if (myHook.catAPIDetach(m, p, (void**)v)) {\
  378. catMsg(T("[+] Detach '%s' succes!"), p);\
  379. }\
  380. else {\
  381. catMsg(T("[!] Detach '%s' failed!"), p);\
  382. }
  383.  
  384. extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
  385. {
  386.     switch (fdwReason) {
  387.         case DLL_PROCESS_ATTACH:
  388.             catMsg(T("***** DLL_PROCESS_ATTACH *****"));
  389.  
  390.             ATTACH(T("kernelbase.dll"), T("CreateProcessW"), &HfnCreateProcessW, &pfnCreateProcessW)
  391.             ATTACH(T("kernelbase.dll"), T("CreateProcessInternalW"), &HfnCreateProcessInternalW, &pfnCreateProcessInternalW)
  392.  
  393.             ATTACH(T("advapi32.dll"), T("CreateProcessAsUserW"), &HfnCreateProcessAsUserW, &pfnCreateProcessAsUserW)
  394.             ATTACH(T("advapi32.dll"), T("CreateProcessWithLogonW"), &HfnCreateProcessWithLogonW, &pfnCreateProcessWithLogonW)
  395.  
  396.             ATTACH(T("ntdll.dll"), T("NtCreateProcessEx"), &HfnNtCreateProcessEx, &pfnNtCreateProcessEx)
  397.             ATTACH(T("ntdll.dll"), T("NtCreateProcess"), &HfnNtCreateProcess, &pfnNtCreateProcess)
  398.             ATTACH(T("ntdll.dll"), T("NtCreateSection"), &HfnNtCreateSection, &pfnNtCreateSection)
  399.  
  400.             ATTACH(T("shell32.dll"), T("ShellExecuteW"), &HfnShellExecuteW, &pfnShellExecuteW)
  401.             ATTACH(T("shell32.dll"), T("ShellExecuteExW"), &HfnShellExecuteExW, &pfnShellExecuteExW)
  402.         break;
  403.         case DLL_PROCESS_DETACH:
  404.             DETACH(T("kernelbase.dll"), T("CreateProcessW"), &pfnCreateProcessW)
  405.             DETACH(T("kernelbase.dll"), T("CreateProcessInternalW"), &pfnCreateProcessInternalW)
  406.  
  407.             DETACH(T("advapi32.dll"), T("CreateProcessAsUserW"), &pfnCreateProcessAsUserW)
  408.             DETACH(T("advapi32.dll"), T("CreateProcessWithLogonW"), &pfnCreateProcessWithLogonW)
  409.  
  410.             DETACH(T("ntdll.dll"), T("NtCreateProcessEx"), &pfnNtCreateProcessEx)
  411.             DETACH(T("ntdll.dll"), T("NtCreateProcess"), &pfnNtCreateProcess)
  412.             DETACH(T("ntdll.dll"), T("NtCreateSection"), &pfnNtCreateSection)
  413.  
  414.             DETACH(T("shell32.dll"), T("ShellExecuteW"), &pfnShellExecuteW)
  415.             DETACH(T("shell32.dll"), T("ShellExecuteExW"), &pfnShellExecuteExW)
  416.  
  417.             catMsg(T("***** DLL_PROCESS_DETACH *****"));
  418.         break;
  419.         default:;
  420.     }
  421.  
  422.     return true;
  423. }
Advertisement
Add Comment
Please, Sign In to add comment