热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

直接读取修改exe文件

1、前言配置器的编写有很多的方式,主要是直接修改原始的受控端的程序,有的方式是把受控端和配置信息都放到控制端程序的内部,在需要配置受控端的

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文件里的存储形式如下图。

549050-20180227150908105-2061786441.png

因为存放的IP信息,端口信息以及其他信息是存在固定位数的,这个固定的位数也就是AAAAAA....,BBBBB....,CCCCCC三个数组字符串的固定长度。

生成配置端就是要用同等的数据替换掉原先的信息。

549050-20180227153313522-1575319779.png

  • 配置器

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、修改后的效果对比

549050-20180227160200121-1302672810.png

4、参考

通过直接读取修改exe文件的方式编写远控/木马配置器

http://blog.csdn.net/junbopengpeng/article/details/37915133

转:https://www.cnblogs.com/17bdw/p/8479320.html



推荐阅读
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • OpenCV4.5.0+contrib编译流程及解决错误方法
    本文介绍了OpenCV4.5.0+contrib的编译流程,并提供了解决常见错误的方法,包括下载失败和路径修改等。同时提供了相关参考链接。 ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
author-avatar
Danny邓lovestars
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有