直接读取修改exe文件
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文件里的存储形式如下图。

因为存放的IP信息,端口信息以及其他信息是存在固定位数的,这个固定的位数也就是AAAAAA....,BBBBB....,CCCCCC三个数组字符串的固定长度。
生成配置端就是要用同等的数据替换掉原先的信息。

- 配置器

三个编辑框分别对应着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、修改后的效果对比

4、参考
通过直接读取修改exe文件的方式编写远控/木马配置器
http://blog.csdn.net/junbopengpeng/article/details/37915133
直接读取修改exe文件的更多相关文章
- Asp.Net读取服务器EXE文件的方法!(超简单实例)
Asp.Net读取服务器EXE文件的方法!(超简单实例) Process process = new Process(); process.StartInfo.FileName = "d:\ ...
- 用UpdateResource修改EXE文件图标(已修正)
//请自行添加到 Type 处PICONDIRENTRY = ^ICONDIRENTRY;ICONDIRENTRY = packed record bWidth: Byte; bHeight: Byt ...
- Java读取修改Properties文件
properties文件是我们经常需要操作一种文件,它使用一种键值对的形式来保存属性集. 无论在学习上还是工作上经常需要读取,修改,删除properties文件里面的属性. 本文通过操作一个prope ...
- C#窗体中读取修改xml文件
由于之前没有操作过xml文件,尤其是在窗体中操作xml,脑子一直转不动,而且很抵制去做这个功能,终于还是突破了自己通过查询资料完成了这个功能,在此记录一下自己的成果. 功能说明:程序中存在的xml文件 ...
- 第三篇--如何修改exe文件版本号和文件信息
控制台程序添加版本信息方法: 项目右键 Add-->Resource-->选择Version-->new,然后就可以修改里面的信息了,重新编译一下就OK.
- 如何用DELPHI编程修改外部EXE文件的版本信
右击里面有修改 点开直接修改就可以了吧. DELPHI 里程序的版本信息怎么是灰色的,无法更改 耐心读以下说明,应该能解决你的问题,如果不能解决,请Hi我~ 如何给自己的dll文件添加版本信息呢? 首 ...
- 应用程序启动后修改自身EXE文件或自删除EXE文件(附VC++6.0源码)
在CSDN论坛看到这么一个问题:如何为第三方工具加上使用限制次数?问题的答案很简单,重新做一个应用程序,将第三方程序打包进这个应用程序,启动应用程序时可以检查第三方工具的使用次数,检查通过,可运行第三 ...
- 更换用installshield打包生成exe文件的图标【转】
最近在研究用installshield2010为自己做的产品打包,自己在网上找写资料,胡乱折腾,最后弄成了一个exe安装包,想要修改exe文件的图标,发现Basic MSI project 无法用in ...
- 修改nw.js的exe文件使其请求管理员权限
修改nw.js的exe文件使其请求管理员权限 默认情况下,nw.js发布的nw.exe文件请求的是普通权限,当我们的应用需要访问一些特殊目录或者注册表等,就需要程序启动的时候以管理员权限运行.那么此时 ...
随机推荐
- 第二个Sprint ------第七天、第八天、第九天、第十天,第十一天
这几天我们主要讨论界面的设计,也终于有了个初步的界面: 主界面截图
- [软工课程博客] 求解第N个素数
任务 求解第 10,0000.100,0000.1000,0000 ... 个素数(要求精确解). 想法 Sieve of Eratosthenes 学习初等数论的时候曾经学过埃拉托斯特尼筛法(Sie ...
- Winform设置托盘程序,托盘显示
1.拖一个NotifyIcon,一个ContextMenuStrip控件到主窗体中 2.设置notifyIcon1,一个contextMenuStrip1(如下图) Icon为托盘图标,Text托盘显 ...
- vue中npm run dev运行项目不能自动打开浏览器! 以及 webstorm跑vue项目jshint一直提示错误问题的解决方法!
vue中npm run dev运行项目不能自动打开浏览器!以及 webstorm跑vue项目jshint一直提示错误问题的解决方法! 1.上个项目结束就很久没有使用vue了,最近打算用vue搭建自己的 ...
- 简单封装DBUtils 和 pymysql 并实现简单的逆向工程生成class 类的py文件
这里使用的 Python 版本是:Python 3.6.0b2. 涉及的三方库:DBUtils.pymysql 1.ConfigurationParser 通过调用Python内置的 xml.dom. ...
- 移动端web开发整理
/* 移动端定义字体的代码 */body { font-family: "Helvetica Neue", Helvetica; } ios端触摸时,会出现一个半透明灰色遮罩 如果 ...
- scheme 之门
scheme 之门 开始之前 这是一篇 Scheme 的介绍文章. Scheme 是一个 LISP 的方言, 相对于 Common LISP 或其他方言, 它更强调理论的完整和优美, 而不那么强调实用 ...
- MT【197】存在$a,b$对于任意的$x$
已知$f(x)=ax^2+bx-\dfrac{1}{4}$,若存在$a,b\in R$,使得对于任意的$x\in[0,7],|f(x)|\le2$恒成立,求$|a|$的最大值____ 提示:$|ax^ ...
- NOI.AC 20181103 题解
CF 1037B Reach Median 班上 n个同学(n 是奇数)排成一排站队,为了美观,需要大家高度的中位数是 x. 你可以让同学们在脚下垫木板或者稍微蹲一点来达成这个目标.对任意一位同学的 ...
- Nexus Repository Manager 3(CVE-2019-7238) 远程代码执行漏洞分析和复现
0x00 漏洞背景 Nexus Repository Manager 3是一款软件仓库,可以用来存储和分发Maven,NuGET等软件源仓库.其3.14.0及之前版本中,存在一处基于OrientDB自 ...