ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

创建进程之简单反调试

2022-05-18 19:00:19  阅读:174  来源: 互联网

标签:include 创建 CreateProcess si 进程 DWORD sizeof pi 调试


创建进程

#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;
}

标签:include,创建,CreateProcess,si,进程,DWORD,sizeof,pi,调试
来源: https://www.cnblogs.com/doubleconquer/p/16285932.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有