创建进程之简单反调试

创建进程

#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;
}
posted @ 2022-05-18 18:53  不会笑的孩子  阅读(80)  评论(0编辑  收藏  举报