在Windows系统中有不少API可以用来执行CMD命令。比如:CreateProcess,WinExec,system等等。但是,这些API都没办法获取执行的结果。为了获取这些结果,就需要使用到CreatePipe函数来创建管道实现进程间的通信。
该函数的定义如下:
通过这个函数就可以创建一对读写管道,通过这对读写管道就可以实现进程间的通信。其中,hReadPipe代表读管道,进程可以通过这个管道来读取内容,而hWritePipe则是写管道,进程执行完CMD命令的结果是通过写入这个管道来通信的。
由于要创建子进程来执行CMD命令,然后要子进程将执行的结果写入写管道hWritePipe中,所以子进程需要拥有hWritePipe管道,这就需要创建这套读写管道的时候需要让它们的属性为可继承的。这样,创建的子进程才会拥有这对读写管道,才可以实现与父进程的通信。而要让这套读写管道可继承,就需要设置第三个参数,也就是设置lpPipeAttributes,该结构体定义如下
由此可知在创建读写管道之前,需要将lpPipeAttributes的bInheritHandle设为TRUE,以让读写管道可继承。
接下来就需要通过CreateProcess来创建子进程执行CMD命令,而在调用函数前,也需要通过设置lpStartupInfo来让子进程执行结果输出到写管道hWritePipe中。另外要注意,为了让可继承的读写管道句柄顺利继承到子进程中,使用CreateProcess函数创建子进程的时候要将第五个参数也就是bInheritHandles设为TRUE。
完成的代码如下:
最终可以看到CMD执行的结果被成功输出:
该函数的主要作用是对文件进行移动,定义如下
当参数三,也就是dwFlags设置为MOVEFILE_DELAY_UNTIL_REBOOT且第二个参数设为NULL的时候,系统就会在重启的时候把第一个参数指定的文件删除掉,这样就可以实现重启自删除,完整代码如下:
成功运行程序以后,重启电脑就会发现文件被删掉了,但要注意需要用管理员权限来运行程序才可以。
还可以通过创建".cmd"批处理文件来实现自删除。批处理文件可以执行DOS命令,其中的del表示的就是删除命令。所以可以通过创建并执行一个批处理文件来把要删除的文件以及批处理文件删除以后就可以实现自删除,完整代码如下:
只要把程序运行起来,就会发现文件被删除掉了。
要在用户层进行文件监控,可以通过Hook相关API来实现,也可通过ReadDirectoryChangesW函数来实现。该函数可以实现对目录以及目录文件的实时监控,可以有效地发现文件被改动地情况,函数定义如下:
其中dwNotifyFilter用来指定要监控的文件操作,可以是以下的一个或多个:
FILE_NOTIFY_CHANGE_FILE_NAME
0x00000001
FILE_NOTIFY_CHANGE_DIR_NAME
0x00000002
FILE_NOTIFY_CHANGE_ATTRIBUTES
0x00000004
FILE_NOTIFY_CHANGE_SIZE
0x00000008
FILE_NOTIFY_CHANGE_LAST_WRITE
0x00000010
FILE_NOTIFY_CHANGE_LAST_ACCESS
0x00000020
FILE_NOTIFY_CHANGE_CREATION
0x00000040
FILE_NOTIFY_CHANGE_SECURITY
0x00000100
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2022-2-27 19:45
被1900编辑
,原因: