最近在做一个HOOK 进程创建的程序,用Ollydbg调试的时候发现了一个CreateProcessInternalA函数,我的程序启动进程最后调用这个函数
创建了一个进程,调用顺序是CreateProcess --> CreateProcessA --> CreateProcessInternalA..于是首先想到了直接HOOK CreateProcessInternalA
这个API函数,这个函数有12个参数,比CreateProcess 多出了两个,如图:
网上找了下关于CreateProcessInternalA这个函数的资料,关于它的
参数说明并没有详细的资料,后来终于在一个E文网站看到关于它的说明,函数原型如下:
CreateProcessInternalA(HANDLE hToken,
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOAlpStartupInfo,
LPPROCESS_INFORMATIONlpProcessInformation,
PHANDLE hNewToken)
除第一个和最后一个不同外,其它都和CreateProcess 一样,
第一个参数大概就是关于权限的吧,最后一个是新的什么权限吧..
(我瞎猜的-_-#,俺E文太烂了...)..
关于这两个参数如何赋值,根据反汇编(上图)代码我们直接传NULL(0)就OK了..
了解了这些,我们来看看是否可以直接调用它,
首先通过工具dumpbin查看了下kernel32.dll,找到了CreateProcessInternalA
的"窝藏"地点:
100 63 0001DDD6 CreateProcessInternalA
在它死后面发现还有个CreateProcessInternalW..嗯,这是UNCODE版本的.,
暂时不理睬它...-_-#
好了,现在让我们动手来调用它看看!
以下代码运行后会产生一个新的CMD进程,而且它的速度比CreateProcess 可是快的
多了...-_-#
// By M80
// 打击盗版
int main()
{
HINSTANCE hInst = LoadLibrary("kernel32.dll");
STARTUPINFO startinfo;
GetStartupInfo(&startinfo);
char cmdline[MAX_PATH];
GetSystemDirectory(cmdline,MAX_PATH);
strcat(cmdline,("\\cmd.exe"));
PROCESS_INFORMATION proinfo;
// CreateProcess(cmdline,NULL,NULL,NULL,1,0,NULL,NULL,&startinfo,&proinfo);
if(hInst)
{
typedef BOOL(* pfn)(HANDLE hToken,
LPCTSTR , // 执行程序文件名
LPTSTR , // 参数行
LPSECURITY_ATTRIBUTES , // 进程安全参数
LPSECURITY_ATTRIBUTES , // 线程安全参数
BOOL , // 继承标记
DWORD , // 创建标记
LPVOID , // 环境变量
LPCTSTR , // 运行该子进程的初始目录
LPSTARTUPINFO , // 创建该子进程的相关参数
LPPROCESS_INFORMATION, // 创建后用于被创建子进程的信息
PHANDLE
) ;
pfn func = (pfn)GetProcAddress(hInst, "CreateProcessInternalA");
if( func )
{
__asm
{
PUSH 0
LEA EAX,[proinfo]
PUSH EAX
LEA ECX,[startinfo]
PUSH ECX
PUSH 0
PUSH 0
PUSH 0
PUSH 1
PUSH 0
PUSH 0
PUSH 0
LEA EDx,[cmdline]
PUSH EDX
PUSH 0
CALL DWORD PTR [func]
ADD ESP,30H
}
}
FreeLibrary(hInst);
}
return 0;
}
PS:在调试这段程序的时候遇到了一点小小的麻烦,就是程序编译成DEBUG版本的情况下,
运行完后程序接着就崩溃了,在这里感谢Root的提示.后来直接改成用汇编调用,问题很顺利的解决了...
用它来启动进程可以绕过很多防病毒软件的监控哦,,嘿嘿...-_-#