在15PB学习文件操作时候想到了这一办法,前辈们已经有更好更高逼格的方法了,这只适合像我这样的新手使用
分享两个自己写的函数.一个复制自己并启动.一个删除自己的附件(只是纯粹的文件操作)
什么时候可以用到这两个函数呢?
1.发现自己的程序被调试时,重启自己
2.想要改变自己当前运行的目录时
3.启动后伪装成另一个程序
为了安全,反调试,或不被查杀,要隐蔽的调用如
1.PostMessage()发送一个自定义消息调用
2.用函数指针调用
3.通过触发异常然后在异常处理里调用
4.在系统回调函数里
在启动时候就调用 灭尸()函数,如果是被保护说明可能在被调试(延迟了),诈尸()可以需要时会触发
第一个函数,复制自己并启动:
int 诈尸()//函数名不知道怎么取,我觉得爱国的时候到了
{
WCHAR lpPath[MAX_PATH + 1] = { 0 };
DWORD dwLen = MAX_PATH;
/*获取进程完整的镜像(程序路径)信息*/
QueryFullProcessImageName(GetCurrentProcess(), 0, lpPath, &dwLen);
std::wstring sPath = lpPath;
//你的应用程序名.exe = sPath.substr(sPath.rfind(L"\\") + 1, sPath.length());
if (sPath.substr(sPath.rfind(L"\\") + 1, sPath.length()) == L"应用程序.exe")
{
sPath = sPath.substr(0, sPath.rfind(L"\\")) + L"\\应用程序 - 副本.exe";
}
else
{
sPath = sPath.substr(0, sPath.rfind(L"\\")) + L"\\应用程序.exe";
}
/*复制文件*/
CopyFile(lpPath, sPath.c_str(), false);
/*启动复制出来的文件*/
STARTUPINFO sui;//启动的时候创建的各种信息(外观等)
ZeroMemory(&sui, sizeof(STARTUPINFO));//用0填充结构体
sui.cb = sizeof(STARTUPINFO);
sui.dwFlags = STARTF_USESTDHANDLES;//标准的输入输出和错误信息
sui.wShowWindow = SW_SHOW;//可视
sui.hStdError = GetStdHandle;//错误
PROCESS_INFORMATION pi;//启动新程序后填充的结构体
/*启动进程*/
CreateProcess(sPath.c_str(), NULL, NULL, NULL, TRUE, 0, NULL, NULL, &sui, &pi);
/*关闭自己 AfxGetMainWnd() MFC函数,获取MFC程序中的主框架类指针*/
PostMessage(AfxGetMainWnd()->m_hWnd, WM_CLOSE, 0, 0);
return 0;
}
第二个函数,删除自己的附件
int 灭尸()//这个函数名也不知道怎么取,我觉得爱国的时候又到了
{
WCHAR lpPath[MAX_PATH + 1] = { 0 };
DWORD dwLen = MAX_PATH;
/*获取进程完整的镜像(程序路径)信息*/
QueryFullProcessImageName(GetCurrentProcess(), 0, lpPath, &dwLen);
std::wstring sPath = lpPath;
//你的应用程序名.exe = sPath.substr(sPath.rfind(L"\\") + 1, sPath.length());
if (sPath.substr(sPath.rfind(L"\\") + 1, sPath.length()) == L"应用程序.exe")
{
sPath = sPath.substr(0, sPath.rfind(L"\\")) + L"\\应用程序 - 副本.exe";
}
else
{
sPath = sPath.substr(0, sPath.rfind(L"\\")) + L"\\应用程序.exe";
}
DWORD dwError;
/*删除文件*/
DeleteFile(sPath.c_str());
dwError = GetLastError();
if (ERROR_FILE_NOT_FOUND == dwError)
{
//MessageBox(NULL, _T("系统找不到指定的文件"), NULL, MB_OK);
}
else if (ERROR_ACCESS_DENIED == dwError)
{
//拒绝访问.可能被调试
MessageBox(NULL, _T("拒绝访问"), NULL, MB_OK);
}
return 1;
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!