【API】直接读取修改exe文件
2018-02-27 15:53
225 查看
1、 前言
配置器的编写有很多的方式,主要是直接修改原始的受控端的程序,有的方式是把受控端和配置信息都放到控制端程序的内部,在需要配置受控端的时候直接输入配置信息,生成受控端;也有的方式是在外部直接修改未配置信息的受控端程序。2、编程思路
服务端设置变量,然后读取变量的值。配置端读取服务端的PE文件,找到变量初始值清空写入新设置的值。
3、实践代码
服务端声明三个已经初始化值的变量
// URL配置器.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "stdafx.h" int main(int argc, char* argv[]) { TCHAR szIpAddress[] = L"AAAAAAAAAAAAAAAAAAAAAAAAAAAA"; // IP地址 TCHAR szPort[] = L"BBBBBBBBBBBBBBBBBBBBBBBBBBBB"; // 端口号 TCHAR szOtherInfo[] = L"CCCCCCCCCCCCCCCCCCCCCCCCCCCC"; // 其他信息 printf("IP:%ls\nPort:%ls\nOther Information:%ls\n", szIpAddress, szPort, szOtherInfo); // 打印信息 getchar(); return 0; }
通过010editor编辑器可以看到变量在字符串里的位置,在PE文件里的存储形式如下图。
![](https://images2018.cnblogs.com/blog/549050/201802/549050-20180227150908105-2061786441.png)
因为存放的IP信息,端口信息以及其他信息是存在固定位数的,这个固定的位数也就是AAAAAA....,BBBBB....,CCCCCC三个数组字符串的固定长度。
生成配置端就是要用同等的数据替换掉原先的信息。
![](https://images2018.cnblogs.com/blog/549050/201802/549050-20180227153313522-1575319779.png)
配置器
![](https://images2018.cnblogs.com/blog/549050/201802/549050-20180227155316196-46516194.png)
三个编辑框分别对应着IP地址、端口号、其他信息。变量名分别为m_szIpStr、m_szPortStr、m_szOtherStr。
MFC回车会关闭掉程序,需要重写一下PreTranslateMessage虚函数。
BOOL CMFC配置端Dlg::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基类 if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) { if (GetFocus()->GetDlgCtrlID() == IDC_szIP)//按下回车,如果当前焦点是在自己期望的控件上 { // 你想做的事,如果按下回车时焦点在你想要的控件上 OnBnChangePE(); } return TRUE; } if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) return TRUE; return CDialogEx::PreTranslateMessage(pMsg); }
按钮对应的事件函数名是OnBnChangePE();
UpdateData(true); 是读取数据,False是更新数据。
void CMFC配置端Dlg::OnBnChangePE() { // TODO: 在此添加控件通知处理程序代码 UpdateData(true); BOOL bRet = false; // 打开状态标志 TCHAR * pFileData; // 文件流内容 DWORD d_FileSize; // 文件大小 TCHAR chPath[MAX_PATH]; // 配置文件路径 // 打开要修改的PE文件 CFileDialog dlg(TRUE, _T("exe"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("可执行文件|*.exe||"), this); dlg.m_ofn.lpstrTitle = L"打开URL配置器.exe"; if (dlg.DoModal() == IDOK) { CString szPE_Path; szPE_Path = dlg.GetPathName(); wmemset(chPath, 0, szPE_Path.GetLength() + 1); wmemcpy(chPath, szPE_Path, szPE_Path.GetLength()+1); } else { return; } // 读出文件内容并写入 HANDLE hFile = CreateFile(chPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); d_FileSize = GetFileSize(hFile, NULL); pFileData = new TCHAR[d_FileSize + 1]; bRet = ReadFile(hFile, pFileData, d_FileSize, &d_FileSize, NULL); if (0 == bRet) { return; } // 替换目标可执行文件中的指定信息:IP port 以及其他的信息 TCHAR szIpStr[] = L"AAAAAAAAAAAAAAAAAAAAAAAAAAAA"; TCHAR szPortStr[] = L"BBBBBBBBBBBBBBBBBBBBBBBBBBBB"; TCHAR szOtherStr[] = L"CCCCCCCCCCCCCCCCCCCCCCCCCCCC"; TCHAR * pDst; int i = 0; // 处理IP字符串 while (true) { if (wcscmp(szIpStr, pFileData + i) == 0) { break; } else { i++; } } // 找到IP地址字符串对应的地址偏移 pDst = pFileData + i; //CString转char 将原先的AAAAA...替换成现在我们要设定的IP地址 wmemset(pDst, 0, wcslen(szIpStr)+1); // 清空原先AAAA字符串 wmemcpy(pDst, m_szIpStr, m_szIpStr.GetLength() + 1); // 把设定的IP字符串复制到内存中 // 处理端口字符串 while (true) { if (wcscmp(szPortStr, pFileData + i) == 0) { break; } else { i++; } } pDst = pFileData + i; //CString转char 将原先的BBBBB...替换成现在我们要设定的IP地址 wmemset(pDst, 0, wcslen(szPortStr) + 1); // 清空原先BBBB字符串 wmemcpy(pDst, m_szPortStr, m_szPortStr.GetLength() + 1); // 把设定的端口字符串复制到内存中 // 处理其他信息字符串 while (true) { if (wcscmp(szOtherStr, pFileData + i) == 0) { break; } else { i++; } } pDst = pFileData + i; //CString转char 将原先的BBBBB...替换成现在我们要设定的IP地址 wmemset(pDst, 0, wcslen(szOtherStr) + 1); // 清空原先CCCCC字符串 wmemcpy(pDst, m_szOtherStr, m_szOtherStr.GetLength() + 1); // 把设定的端口字符串复制到内存中 CloseHandle(hFile); //关闭句柄 ////////////////////////////////// // 保存文件内容到新的exe文件中 /// ////////////////////////////////// // 保存新PE文件路径 CFileDialog dlg_NewSavePath(TRUE, _T("exe"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("可执行文件|*.exe||"), this); dlg_NewSavePath.m_ofn.lpstrTitle = L"保存的路径.exe"; if (dlg_NewSavePath.DoModal() == IDOK) { CString szPE_Path; szPE_Path = dlg_NewSavePath.GetPathName(); wmemset(chPath, 0, szPE_Path.GetLength() + 1); wmemcpy(chPath, szPE_Path, szPE_Path.GetLength() + 1); } else { return; } // 新建文件 hFile = CreateFile(chPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // 写入文件 bRet = WriteFile(hFile, pFileData, d_FileSize, &d_FileSize, NULL); if (bRet == 0) { return; } // 关闭句柄 CloseHandle(hFile); }
3、修改后的效果对比
![](https://images2018.cnblogs.com/blog/549050/201802/549050-20180227160200121-1302672810.png)
4、参考
通过直接读取修改exe文件的方式编写远控/木马配置器http://blog.csdn.net/junbopengpeng/article/details/37915133
相关文章推荐
- 通过直接读取修改exe文件的方式编写远控/木马配置器
- .Net/C# 应用程序直接读取本地 Cookies 文件 (由于 WinXP SP2 调用 API: InternetGetCookie 无果)
- .Net/C# 应用程序直接读取本地 Cookies 文件 (由于 WinXP SP2 调用 API: InternetGetCookie 无果)
- .Net/C# 应用程序直接读取本地 Cookies 文件(WinXP SP2 调用 API: InternetGetCookie 无果)
- c++判断硬盘是否连接、修改指定盘符、读取配置文件、获取exe路径
- 如何直接修改exe文件
- .Net/C#应用程序直接读取本地Cookies文件(由于WinXPSP2调用API:InternetGetCookie无果)
- 使用J2SE API读取Properties文件的六种方法
- 读取jar包内外配置文件,xml property文件的读取修改
- 直接读取Excel文件数据
- 放在WEB-INF下的jsp文件无法被直接读取
- FileReader文件读取API
- 配置文件操作.如config.php文件的读取修改等操作
- (转)Windows Form Application 读取并修改App.config文件
- 【存档】使用OllyDbg+ResHack+LordPE来修改EXE文件
- [转].Net/C# 应用程序直接读取本地 Cookies 文件
- Web系统通过EXE文件实现读取客户电脑MAC等硬件信息且兼容非IE浏览器
- 修改Xcode自动生成的文件注释来导出API文档
- Google 在网页中直接修改js文件 保存生效
- c#Process.Start (exe)无法读取配置文件