-
-
[原创]64位CreateProcess逆向:(一)3环下的各参数效验、整合以及0环返回后的检查
-
发表于: 2016-1-26 11:35 23811
-
点击下面进入总目录:
64位Windows创建64位进程逆向分析(总目录)
这是科锐逆向64位CreateProcess函数的第1篇。作为整个篇章的开始,我们先要谈谈CreateProcess应该做什么,逆向它的意义在哪。
按MSDN的定义:
CreateProcess函数,将创造一个进程以及它的主线程,这个新进程会执行指定的可执行文件。
其中“进程”、“可执行文件”是重点,一般说来,进程是内存中的数据,而可执行文件(狭义地讲)就是Windows存放在磁盘中的PE文件。
所以,CreateProcess之所以重要,是因为它起码做了两件大事:
1.将磁盘中的数据,(按一定格式)加载到内存中去
2.让内存中的数据运行起来
研究CreateProcess这个API,对于理解PE、Windows进程、线程管理都会有很大帮助。
在此系列的第1篇中,我们会一起梳理下整个CreateProcess整体的流程,让大家有一个整体认识。
CreateProcessInternal
进入CreateProcess的入口可以发现,微软为了保持结构改动的灵活性,多封装了一层CreateProcessInernal,CreateProcess基本上没做多余的工作。而是直接调用CreateProcessInternalA并将CreateProcessInternalA返回值作为结果返回。
唯一多做了一点事情,就是在传递参数的过程中,多传了两个(均为0的)参数,这应该是设计上防止未来变动而保留的灵活性。
因此,我们真正的起点,应该是从CreateProcessInternal开始的。
它的函数原型如下:
BOOL WINAPI CreateProcessInternalW(HANDLE hToken, LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation, PHANDLE hNewToken);
PRTL_USER_PROCESS_PARAMETERS __fastcall BasepCreateProcessParameters( LPCWSTR DosFileName, LPCWSTR FileName.Buffer, LPCWSTR lpCurrentDirectory, //GetFullPathName获取到的CurrentDirectory LPCWSTR CommandLine, LPVOID lpEnvironment, LPSTARTUPINFOEX lpStartupInfo, DWORD dwCreationFlags, BOOL bInheritHandles )