主要是为了实现像木马那样的生成自己需要配置的EXE文件。首先要自己写一个EXE,然后以资源的方式导入到工程中。
下边的例子是一个修改MessageBox标题和文字的程序.
HRSRC hResInfo;
HGLOBAL hResData;
DWORD dwSize, dwWritten;
LPBYTE pBuffer;
HANDLE hFile;
TCHAR szMsgBoxTitle[100],szMsgBoxText[100];
szMsgBoxTitle[0] ='\0';
szMsgBoxText[0] = '\0';
得到新数据,比如新的邮箱地址和密码
GetDlgItemText(IDC_EDIT_TITLE,szMsgBoxTitle,100);
GetDlgItemText(IDC_EDIT_TEXT,szMsgBoxText,100);
// 查找所需的资源
hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDR_DUMMY_EXE), "Dummy_Exe");
if (hResInfo == NULL)
{
::MessageBox(NULL, "查找资源失败!", "错误", MB_OK | MB_ICONINFORMATION);
return;
}
// 获得资源尺寸
dwSize = SizeofResource(NULL, hResInfo);
// 装载资源
hResData = LoadResource(NULL, hResInfo);
if (hResData == NULL)
{
::MessageBox(NULL, "装载资源失败!", "错误", MB_OK | MB_ICONINFORMATION);
return;
}
// 为数据分配空间
pBuffer = (LPBYTE)GlobalAlloc(GPTR, dwSize);
if (pBuffer == NULL)
{
::MessageBox(NULL, "分配内存失败!", "错误", MB_OK | MB_ICONINFORMATION);
return;
}
// 复制资源数据
CopyMemory((LPVOID)pBuffer, (LPCVOID)LockResource(hResData), dwSize);
// 获取标题和文本,并复制数据,具体偏移地址见你的那个EXE资源
CopyMemory((LPVOID)(pBuffer + 0x400), (LPCVOID)szMsgBoxTitle, 100);
CopyMemory((LPVOID)(pBuffer + 0x464), (LPCVOID)szMsgBoxText, 100);
// 创建文件,写数据
hFile = CreateFile("C:\\EnochShen.Exe", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
if (hFile != NULL)
{
WriteFile(hFile, (LPCVOID)pBuffer, dwSize, &dwWritten;, NULL);
}
else
{
::MessageBox(NULL, "创建文件失败!", "错误", MB_OK | MB_ICONINFORMATION);
GlobalFree((HGLOBAL)pBuffer);
return;
}
// 收尾工作,释放资源
CloseHandle(hFile);
GlobalFree((HGLOBAL)pBuffer);
::MessageBox(NULL, "创建文件C:\\cooldog.Exe!", "成功" ,MB_OK | MB_ICONINFORMATION);
ShellExecute(m_hWnd, "open", "C:\\", NULL, NULL, SW_SHOWNORMAL);
下面是那个作为资源的EXE的源代码(MASM32写的):
; —————————————————————– ; 生成的exe只有1k,小巧玲珑,^O^ ; —————————————————————–
; #########################################################################
.386
.model flat, stdcall
option casemap :none ; case sensitive
; #########################################################################
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
; #########################################################################
.data
szMsgBoxTitle db 100 dup('E')
szMsgBoxText db 100 dup('S')
.code
start: ; —————————————————————– ; 下面的代码生成的Exe只有1k,但是打包会出错 ; ; szMsgBoxTitle db 100 dup(‘E’) ; szMsgBoxText db 100 dup(‘S’) ; ; —————————————————————–
invoke MessageBox,NULL,ADDR szMsgBoxText,ADDR szMsgBoxTitle,MB_OK or MB_ICONINFORMATION
invoke ExitProcess,NULL
end start
参考自CSDN开发高手第N期(具体哪一期我忘了)