閱讀244 返回首頁    go 技術社區[雲棲]


思路:如何跳過CreateProcess調用底層創建進程函數

論壇近日有人在問如何跳過CreateProcess調用底層的NtCreateProcess。

我想說的是不能單純看這個問題,首先不同NT內核版本CreateProcess進入

底層的路徑是不同的:


2k ->NtCreateProcess
xp ->NtCreateProcessEx
vista/win7/2008 ->NtCreateUserProcess


拿windows7 x64來說吧,在ntdll32!NtCreateUserProcess設置斷點,中斷後,查看stack內容,結合該函數原型來看:


NTSTATUS NtCreateUserProcess(PHANDLE ProcessHandle,
  PHANDLE ThreadHandle,
  PVOID Parameter2,
  PVOID Parameter3,
  PVOID ProcessSecurityDescriptor,
  PVOID ThreadSecurityDescriptor,
  PVOID Parameter6,
  PVOID Parameter7,
  PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
  PVOID Parameter9,
  PVOID pProcessUnKnow);

vals in stack :
0028f5dc 760b4338 kernel32!CreateProcessInternalW+0xe75 (ret)
0028f5e0 0028f920
0028f5e4 0028f900
0028f5e8 02000000
0028f5ec 02000000
0028f5f0 00000000
0028f5f4 00000000
0028f5f8 00000000
0028f5fc 00000001
0028f600 00755c38
0028f604 0028f7a4
0028f608 0028fb20
0028f60c d0c89b5d
0028f610 0028fcdc
0028f614 00000001

可知其最關鍵的ProcessParameters地址在755c38,分析其內容則有:

ntdll!_RTL_USER_PROCESS_PARAMETERS
  +0x000 MaximumLength : 0x94c
  +0x004 Length : 0x94c
  +0x008 Flags : 1
  +0x00c DebugFlags : 0
  +0x010 ConsoleHandle : 0x00001480 Void
  +0x018 ConsoleFlags : 3
  +0x020 StandardInput : 0x0000000b Void
  +0x028 StandardOutput : 0x00755ed0 Void
  +0x030 StandardError : 0x03ee03ec Void
  +0x038 CurrentDirectory : _CURDIR
  +0x000 DosPath : _UNICODE_STRING "C:\Windows\system32\notepad.exe"
  +0x000 Length : 0x3e
  +0x002 MaximumLength : 0x40
  +0x008 Buffer : 0x00180016 "--- memory read error at address 0x00180016 ---"
  +0x010 Handle : 0x00756584 Void
  +0x050 DllPath : _UNICODE_STRING ""
  +0x000 Length : 0
  +0x002 MaximumLength : 0
  +0x008 Buffer : (null)  
  +0x060 ImagePathName : _UNICODE_STRING ""
  +0x000 Length : 0
  +0x002 MaximumLength : 0
  +0x008 Buffer : (null)  
  +0x070 CommandLine : _UNICODE_STRING "C:\Windows\system32\notepad.exe"
  +0x000 Length : 0x3e
  +0x002 MaximumLength : 0x40
  +0x008 Buffer : 0x0020001e "--- memory read error at address 0x0020001e ---"
  +0x080 Environment : 0x00020000 Void
  +0x088 StartingX : 0
  +0x08c StartingY : 0
  +0x090 CountX : 0
  +0x094 CountY : 0
  +0x098 CountCharsX : 0
  +0x09c CountCharsY : 0
  +0x0a0 FillAttribute : 0
  +0x0a4 WindowFlags : 0
  +0x0a8 ShowWindowFlags : 0
  +0x0b0 WindowTitle : _UNICODE_STRING ""
  +0x000 Length : 0
  +0x002 MaximumLength : 0
  +0x008 Buffer : (null)  
  +0x0c0 DesktopInfo : _UNICODE_STRING ""
  +0x000 Length : 0
  +0x002 MaximumLength : 0
  +0x008 Buffer : (null)  
  +0x0d0 ShellInfo : _UNICODE_STRING ""
  +0x000 Length : 0
  +0x002 MaximumLength : 0
  +0x008 Buffer : (null)  
  +0x0e0 RuntimeData : _UNICODE_STRING ""
  +0x000 Length : 0
  +0x002 MaximumLength : 0
  +0x008 Buffer : (null)  
  +0x0f0 CurrentDirectores : [32] _RTL_DRIVE_LETTER_CURDIR
  +0x000 Flags : 0
  +0x002 Length : 0
  +0x004 TimeStamp : 0
  +0x008 DosPath : _STRING ""
  +0x000 Length : 0
  +0x002 MaximumLength : 0
  +0x008 Buffer : (null)  
  +0x3f0 EnvironmentSize : 0
  +0x3f8 EnvironmentVersion : 0

接下來就可以操作鳥:

1 找出 NtCreateUserProcess 地址
2 構建及填充 ProcessParameters 內容
3 調用並處理好返回值


最後更新:2017-04-02 15:15:22

  上一篇:go 抵製Android:智能電視打響圈地戰
  下一篇:go 京東商城“玩”遊戲