创建进程之简单反调试
创建进程
#include "stdafx.h"
#include <stdlib.h>
#include <windows.h>
int main(int argc, char* argv[])
{
TCHAR childProcessName[] = TEXT("C:/WINDOWS/system32/cmd.exe");
TCHAR childProcessCommandLine[] = TEXT(" /c ping 127.0.0.1");
//启动信息
STARTUPINFO si;
//进程信息
PROCESS_INFORMATION pi;
memset(&si,0,sizeof(si)); //如果不初始化结构体会 创建进程失败 返回 错误是998
memset(&pi,0,sizeof(pi));
si.cb = sizeof(si);
if(CreateProcess(childProcessName, childProcessCommandLine, NULL, NULL, FALSE, 0, NULL, NULL,
&si, &pi))
{
printf("CreateProcess Successfully! \n");
}
else {
printf("CreateProcess Error: %d \n", GetLastError());
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
system("pause");
return 0;
}
首先我定义了进程路径、进程命令行参数,其次创建了si、pi两个结构体,然后使用ZeroMemory函数用0填充数据,再给si.cb成员赋值当前结构体大小(为什么需要?这是因为Windows会有很多个版本,便于未来更新换代);最后CreateProcess函数创建进程,由于CreateProcess函数本身返回值是布尔类型的,所以使用if来判断,如果出问题则使用GetLastError函数来获取问题编号
在创建完进程之后需要关闭进程,但是我们所知道,每个进程至少一个线程,所以我们也要关闭线程,使用CloseHandle函数来关闭
课外扩展--反调试(STARTUPINFO结构体)
CreateProcess函数创建进程,其有一个参数是STARTUPINFO结构体,这个参数是进程启动的一些信息,我们一开始会将其memset()函数处理,填充0,那么在运行的时候是否还都是0呢?或者说在载入调试工具的时候所有成员是否都是0呢?
STARTUPINFO结构体的成员(共有18个属性)
typedef struct _STARTUPINFOA {
DWORD cb;
LPSTR lpReserved;
LPSTR lpDesktop;
LPSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFOA, *LPSTARTUPINFOA;
将这几个DWORD类型的成员打印一下看看,通过GetStartupInfo函数来获取信息
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
STARTUPINFO si;
memset(&pi,0,sizeof(pi));
si.cb = sizeof(si);
GetStartupInfo(&si);
printf("%d %d %d %d %d %d %d %d\n", si.dwX, si.dwY, si.dwXSize, si.dwYSize, si.dwXCountChars,
si.dwYCountChars, si.dwFillAttribute, si.dwFlags);
system("pause");
return 0;
}
正常运行
ollydbg运行
我们可以很清楚的看见了几个值在调试工具中打开发生变化:si.dwXSize, si.dwYSize, si.dwXCountChars,
si.dwFillAttribute, si.dwFlags
所以我们可以根据这几个值来判断从而进行反调试:
#include "stdafx.h"
#include <stdlib.h>
#include <windows.h>
int main(int argc, char* argv[])
{
TCHAR childProcessName[] = TEXT("C:/WINDOWS/system32/cmd.exe");
TCHAR childProcessCommandLine[] = TEXT("/c ping 127.0.0.1");
//启动信息
STARTUPINFO si;
//进程信息
PROCESS_INFORMATION pi;
memset(&si,0,sizeof(si));
memset(&pi,0,sizeof(pi));
si.cb = sizeof(si);
GetStartupInfoA(&si);
if ( si.dwX==0 &&si.dwY==0 && si.dwXSize==0 && si.dwYSize==0 && si.dwXCountChars==0 &&
si.dwYCountChars==0 && si.dwFillAttribute==0 && si.dwFlags==1)
{
printf("%d,%d,%d,%d,%d,%d,%d,%d\n", si.dwX, si.dwY, si.dwXSize, si.dwYSize, si.dwXCountChars,
si.dwYCountChars, si.dwFillAttribute, si.dwFlags);
if(CreateProcess(childProcessName, childProcessCommandLine, NULL, NULL, FALSE, 0, NULL, NULL,
&si, &pi))
{
printf("CreateProcess Successfully! \n");
}
}
else
{
printf("你想要调试程序? 能力还不行");
printf("CreateProcess Error: %d \n", GetLastError());
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
system("pause");
getchar();
return 0;
}