黑客24小时在线接单网站

黑客在线接单,网站入侵,渗透测试,渗透网站,入侵网站

*** 安全编程:创建进程

微信公众号:计算机和 *** 安全

ID:Computer-network

当操作程序时,操作系统将程序从磁盘文件中包含到内存中,分配各种操作程序所需的资源,并创建一系列工作,如主线程。该过程是操作中的程序,该过程是向操作系统申请资源的基本单位。当操作记事本程序时,操作系统将创建一个记事本过程。当记事本关闭时,记事本过程也会立即结束。对过程的情感理解就足够了。

如果要观察系统中正在运行的过程,同时按下键盘Ctrl Shift Esc可以打开组合键“任务管理器”,系统中的正常进程列表如图1所示。对于任务管理器中的许多列,我们主要关心的是“映像名称”“PID”和“线程数”3这三个项目将在编程中使用和涉及。

图1 任务管理器

任何计算机文件都是二进制文件。对于可执行程序,其二进制数据可以使用CPU执行程序是一个静态的概念,它本身只是硬盘上的一个二进制文件。当鼠标双击可执行程序时,程序被加载到内存中,然后产生一个过程。当操作系统通过装载器将程序装载到内存中时,它将分配各种过程所需的资源,并产生一个主线程,主线程将拥有CPU执行时间占用过程申请的内存……在编程过程中,通常需要通过操作中的程序来创建一个新的过程。本文介绍了创建过程的常见用途API函数。

1. 简单下载者演示

在Windows创建过程的 *** 有很多种。这里有一个例子,首先介绍最简单的 *** 。API函数为WinExec()其定义如下:

  • UINTWinExec(
  • LPCSTRlpCmdLine,//commandline
  • UINTuCmdShow//windowstyle
  • );
  • 参数说明如下。

    lpCmdLine:指向要执行的可执行文件的字符串。

    uCmdShow:程序运行后的窗口状态。

    之一个参数更容易理解,例如执行“记事本”这个参数可以是程序“C:\Windows\ System32\Notepad.exe”。第二个参数是指程序运行后窗口的状态。常用的参数有两个,一个是SW_SHOW,另一个是SW_HIDE。SW_SHOW表示程序运行后窗口状态显示,SW_HIDE表示程序运行后窗口状态为隐藏状态。试着创建一个隐藏的显示状态“记事本” *** 如下:

  • WinExec("c:\\windows\\system32\\notepad.exe",SW_HIDE);
  • 这样创建的“记事本”进程在“任务管理器”中可以看到“notepad.exe”但是这个过程看不到窗口界面。

    WinExec()函数很多“下载者”中使用,“下载者”英文名是“Downloader”,也就是说,下载器的意思。它是一个相对单一的恶意程序(相对于木马和后门)。下载程序的功能是让受害者计算机指定给黑客URL地址去下载更多的病毒文件或木马文件并运行。下载者的体积较小,容易传播。当下载者下载到病毒或木马后,通常都会使用WinExec()运行恶意程序下载到本地,因为只有两个参数,而且参数非常简单。

    让我们做一个下载者演示,这只是一个演示。如果你有恶意,不要试图做任何坏事,因为演示代码很容易被杀毒软件杀死。记住,目的是学习编程知识。

    为了完成一个模拟下载者,程序可以从 *** 上的某个地址下载。下载文件的方式有很多,比较简单常用的函数是URLDownloadToFile()。该函数也用于下载过程,定义如下:

  • HRESULTURLDownloadToFile(
  • LPUNKNOWNpCaller,
  • LPCTSTRszURL,
  • LPCTSTRszFileName,
  • DWORDdwReserved,
  • LPBINDSTATUSCALLBACKlpfnCB
  • );
  • 这个函数中只使用两个参数,即szURL和szFileName。这两个参数的说明如下。

    szURL: 指向下载地址URL 字符串。

    szFileName:将字符串保存在本地位置。

    其余参数赋值0或0NULL即可。

    使用URLDownloadToFile()函数,需要包含Urlmon.h头文件和Urlmon.lib导入仓库文件,否则在编译和连接时无法通过。

    已经知道需要使用什么了API函数,那么完成代码就很简单了。具体代码只有几行,具体如下:

  • #include<windows.h>
  • #include<urlmon.h>
  • #pragmacomment(lib,"urlmon")
  • intmain()
  • {
  • charszUrl[MAX_PATH]="c:\\windows\\system32\\notepad.exe";
  • charszVirus[MAX_PATH]="d:\\virus.exe";
  • URLDownloadToFile(NULL,szUrl,szVirus,0,NULL);
  • ///这里使用参数,以便于模拟和查看效果SW_SHOW
  • //一般可以传递SW_HIDE参数
  • WinExec(szVirus,SW_SHOW);
  • return0;
  • }
  • 这里的模拟就是把C记事本程序下载到盘系统目录D盘并保存成名virus.exe,然后运行它。如果从 *** 上的地址下载,只需修改szUrl可以保存变量字符串。如果真的完成了,我们的代码是一个简单的模拟代码“下载者”如果要在源代码上进行,比这个代码复杂得多“免杀”,所以会有很多问题需要考虑。我们仍然以学习编程知识为目的,不要破坏它,否则随时都可能被破坏“查水表”。

    2. CreateProcess()函数介绍与程序的启动

    通常选择使用创建过程CreateProcess()函数,参数多,功能强大,使用灵活。对于函数WinExec()函数使用简单,只能完成简单的过程创建。如果你想控制被创建的过程,你必须使用更强大的功能CreateProcess()函数。

    在介绍CreateProcess()函数前,先介绍一个内容。通常,在编写时C在语言程序中,如果是控制台下程序,则编写程序的入口函数是main()函数,通常称为主函数。如果你写了一个Windows下程序,那么入口函数就是WinMain()。即使是使用MFC其实也有开发。WinMain()函数只是巨大的MFC框架包装。那么程序真的是从main()函数或WinMain()函数开始执行吗?在编写控制台程序时,如果需要为程序提供参数,参数来自哪里,为什么主函数有返回值,它将返回哪里?

    使用VC6写一个简单的程序。调试这个简单的程序,看看C语言程序是真的吗?main()函数开始执行。写一个简单的输出“Hello World”调试程序。程序代码如下:

  • #include<stdio.h>
  • intmain()
  • {
  • printf("HelloWorld!!!\r\n");
  • return0;
  • }
  • 这是一个非常简单的程序,按下F7按钮编译连接,然后按下F10按钮开始单步调试状态VC6的CallStack如图2所示,观察窗口(调用栈窗)的内容。

    图2 CallStack窗口内容

    调用栈有三行记录,双击第二行“mainCRT Startup() line 206 25 bytes”,查看代码编辑窗口的内容,此时代码调用主函数main()的C运行时启动函数(简称启动函数)。代码编辑窗口内容如图3所示。

    图3 启动函数

    可以看出,代码编辑窗口左侧有一个绿色三角形,表示代码调用主函数main()。并且可以通过银行代码找到,main()函数的返回值赋值mainret变量。向上移动代码,找到定义mainret变量代码处。mainret定义如下:

    int mainret;

    该变量的类型为int类型。通常定义main()函数,main()函数的返回值为int类型。从以上调用过程可以看出,main()函数只是程序员编程时的入口函数,程序的启动不是从main()函数开始。main()函数前,操作系统和C语言启动代码为程序做了很多工作。

    以上内容只是一个简单的插曲。回到主题,开始介绍CreateProcess()函数的使用。CreateProcess()函数的定义如下:

  • BOOLCreateProcess(
  • LPCTSTRlpApplicationName,//nameofexecutablemodule
  • LPTSTRlpCommandLine,//commandlinestring
  • LPSECURITY_ATTRIBUTESlpProcessAttributes,//SD
  • LPSECURITY_ATTRIBUTESlpThreadAttributes,//SD
  • BOOLbInheritHandles,//handleinheritanceoption
  • DWORDdwCreationFlags,//creationflags
  • LPVOIDlpEnvironment,//newenvironmentblock
  • LPCTSTRlpCurrentDirectory,//currentdirectoryname
  • LPSTARTUPINFOlpStartupInfo,//startupinformation
  • LPPROCESS_INFORMATIONlpProcessInformation//processinformation
  • );
  • 参数说明如下。

    lpApplicationName:指定可执行文件的文件名。

    lpCommandLine:指定欲传递给新进程命令行的参数。

    lpProcessAttributes:该值通常为 NULL,表示为默认安全属性。

    lpThreadAttributes:线程安全属性通常是 NULL,表示为默认安全属性。

    bInheritHandlers:在当前过程中指定可继承句柄是否被新过程继承。

    dwCreationFlags:指定新过程的优先级和其他标志。

    一般来说,这个参数可以是0。

    如果要创建调试过程,则需要将参数设置为DEBUG_PROCESS。创建过程称为父亲过程,创建过程称为子过程。也就是说,如果父亲的过程需要调试子过程,则需要调用CreateProcess()函数传递DEBUG_PROCESS参数DEBUG_PROCESS参数后,子过程创建“孙”过程也处于调试状态。如果不想创建子过程“孙”过程也处于调试状态,因此在父亲创建子过程时传输DEBUG_ON *** _THIS_PROCESS和DEBUG_PROCESS。

    在某些情况下,如果创建子过程的主线程暂时不运行,则可以指定CREATE _SUSPENDED参数。如果后来希望子过程的主线程运行,可以使用ResumeThread()函数使子过程的主线程恢复运行。

    lpEnvironment:指定新过程的环境变量通常指定为 NULL 值。

    lpCurrentDirectory:指定新进程使用的当前目录。

    lpStartupInfo:指向 STARTUPINFO 结构体指针,指定新过程的启动信息。

    该参数是决定过程启动状态的结构体。结构的定义如下:

  • typedefstruct_STARTUPINFO{
  • DWORDcb;
  • LPTSTRlpReserved;
  • LPTSTRlpDesktop;
  • LPTSTRlpTitle;
  • DWORDdwX;
  • DWORDdwY;
  • DWORDdwXSize;
  • DWORDdwYSize;
  • DWORDdwXCountChars;
  • DWORDdwYCountChars;
  • DWORDdwFillAttribute;
  • DWORDdwFlags;
  • WORDwShowWindow;
  • WORDcbReserved2;
  • LPBYTElpReserved2;
  • HANDLEhStdInput;
  • HANDLEhStdOutput;
  • HANDLEhStdError;
  • }STARTUPINFO,*LPSTARTUPINFO;
  • 在使用该结构之前,需要对其进行处理cb成员变量被赋值,成员变量被用来保存结构体的大小。一般来说,创建一个过程只需要初始化几个参数。如果要重定向新过程的输入输出,结构体中会使用更多的成员变量。

    lpProcessInformation:指向PROCESS_INFORMATION该结构用于返回新创建过程和主线程的相关信息。结构的定义如下:

  • typedefstruct_PROCESS_INFORMATION{
  • HANDLEhProcess;
  • HANDLEhThread;
  • DWORDdwProcessId;
  • DWORDdwThreadId;
  • }PROCESS_INFORMATION;
  • 该结构用于返回新创建过程的句柄和过程ID,主线程的句柄和主线程ID。

    下面通过一个实例来对CreateProcess()演示函数。

  • #include<windows.h>
  • #include<stdio.h>
  • #defineEXEC_FILE"c:\\windows\\system32\\notepad.exe"
  • intmain()
  • {
  • PROCESS_INFORMATIONpi={0};
  • STARTUPINFOsi={0};
  • si.cb=sizeof(STARTUPINFO);
  • BOOLbRet=CreateProcess(EXEC_FILE,
  • NULL,NULL,NULL,FALSE,
  • NULL,NULL,NULL,&si,&pi);
  • if(bRet==FALSE)
  • {
  • printf("CreateProcessError!\r\n");
  • return-1;
  • }
  • CloseHandle(pi.hThread);
  • CloseHandle(pi.hProcess);
  • return0;
  • }
  • 创建过程后,PROCESS_INFORMATION需要使用结构体变量的两个句柄CloseHandle()关闭函数。

       
    • 评论列表:
    •  北槐织谜
       发布于 2022-06-06 12:06:33  回复该评论
    • //SDLPSECURITY_ATTRIBUTESlpThreadAttributes,//SDBOOLbInheritHandles,//handleinheritanceop
    •  忿咬秙暔
       发布于 2022-06-06 05:44:37  回复该评论
    • E,NULL,NULL,NULL,&si,&pi);if(bRet==FALSE){printf("CreateProcessError!\r\n");return

    发表评论:

    Powered By

    Copyright Your WebSite.Some Rights Reserved.