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文件的更多相关文章

  1. Asp.Net读取服务器EXE文件的方法!(超简单实例)

    Asp.Net读取服务器EXE文件的方法!(超简单实例) Process process = new Process(); process.StartInfo.FileName = "d:\ ...

  2. 用UpdateResource修改EXE文件图标(已修正)

    //请自行添加到 Type 处PICONDIRENTRY = ^ICONDIRENTRY;ICONDIRENTRY = packed record bWidth: Byte; bHeight: Byt ...

  3. Java读取修改Properties文件

    properties文件是我们经常需要操作一种文件,它使用一种键值对的形式来保存属性集. 无论在学习上还是工作上经常需要读取,修改,删除properties文件里面的属性. 本文通过操作一个prope ...

  4. C#窗体中读取修改xml文件

    由于之前没有操作过xml文件,尤其是在窗体中操作xml,脑子一直转不动,而且很抵制去做这个功能,终于还是突破了自己通过查询资料完成了这个功能,在此记录一下自己的成果. 功能说明:程序中存在的xml文件 ...

  5. 第三篇--如何修改exe文件版本号和文件信息

    控制台程序添加版本信息方法: 项目右键 Add-->Resource-->选择Version-->new,然后就可以修改里面的信息了,重新编译一下就OK.

  6. 如何用DELPHI编程修改外部EXE文件的版本信

    右击里面有修改 点开直接修改就可以了吧. DELPHI 里程序的版本信息怎么是灰色的,无法更改 耐心读以下说明,应该能解决你的问题,如果不能解决,请Hi我~ 如何给自己的dll文件添加版本信息呢? 首 ...

  7. 应用程序启动后修改自身EXE文件或自删除EXE文件(附VC++6.0源码)

    在CSDN论坛看到这么一个问题:如何为第三方工具加上使用限制次数?问题的答案很简单,重新做一个应用程序,将第三方程序打包进这个应用程序,启动应用程序时可以检查第三方工具的使用次数,检查通过,可运行第三 ...

  8. 更换用installshield打包生成exe文件的图标【转】

    最近在研究用installshield2010为自己做的产品打包,自己在网上找写资料,胡乱折腾,最后弄成了一个exe安装包,想要修改exe文件的图标,发现Basic MSI project 无法用in ...

  9. 修改nw.js的exe文件使其请求管理员权限

    修改nw.js的exe文件使其请求管理员权限 默认情况下,nw.js发布的nw.exe文件请求的是普通权限,当我们的应用需要访问一些特殊目录或者注册表等,就需要程序启动的时候以管理员权限运行.那么此时 ...

随机推荐

  1. 第二个Sprint ------第七天、第八天、第九天、第十天,第十一天

    这几天我们主要讨论界面的设计,也终于有了个初步的界面: 主界面截图

  2. [软工课程博客] 求解第N个素数

    任务 求解第 10,0000.100,0000.1000,0000 ... 个素数(要求精确解). 想法 Sieve of Eratosthenes 学习初等数论的时候曾经学过埃拉托斯特尼筛法(Sie ...

  3. Winform设置托盘程序,托盘显示

    1.拖一个NotifyIcon,一个ContextMenuStrip控件到主窗体中 2.设置notifyIcon1,一个contextMenuStrip1(如下图) Icon为托盘图标,Text托盘显 ...

  4. vue中npm run dev运行项目不能自动打开浏览器! 以及 webstorm跑vue项目jshint一直提示错误问题的解决方法!

    vue中npm run dev运行项目不能自动打开浏览器!以及 webstorm跑vue项目jshint一直提示错误问题的解决方法! 1.上个项目结束就很久没有使用vue了,最近打算用vue搭建自己的 ...

  5. 简单封装DBUtils 和 pymysql 并实现简单的逆向工程生成class 类的py文件

    这里使用的 Python 版本是:Python 3.6.0b2. 涉及的三方库:DBUtils.pymysql 1.ConfigurationParser 通过调用Python内置的 xml.dom. ...

  6. 移动端web开发整理

    /* 移动端定义字体的代码 */body { font-family: "Helvetica Neue", Helvetica; } ios端触摸时,会出现一个半透明灰色遮罩 如果 ...

  7. scheme 之门

    scheme 之门 开始之前 这是一篇 Scheme 的介绍文章. Scheme 是一个 LISP 的方言, 相对于 Common LISP 或其他方言, 它更强调理论的完整和优美, 而不那么强调实用 ...

  8. 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^ ...

  9. NOI.AC 20181103 题解

    CF 1037B  Reach Median 班上 n个同学(n 是奇数)排成一排站队,为了美观,需要大家高度的中位数是 x. 你可以让同学们在脚下垫木板或者稍微蹲一点来达成这个目标.对任意一位同学的 ...

  10. Nexus Repository Manager 3(CVE-2019-7238) 远程代码执行漏洞分析和复现

    0x00 漏洞背景 Nexus Repository Manager 3是一款软件仓库,可以用来存储和分发Maven,NuGET等软件源仓库.其3.14.0及之前版本中,存在一处基于OrientDB自 ...