木马生成技术详解

木马服务端生成技术详解  实现思路很简单 用16进制工具   打开.EXE文件 找到要替换的内容地址 进行更新写入就可以了注意点: 地址是从0开始的如下图所示的 地址应该是:0X5124   其实改写代码如下:  void ServerConfig::OnCreate() ...{    UpdateData();    if(m_ip.IsEmpty()||m_name.IsEmpty( 阅读详情
 

有些木马在解压缩之后只会有一个客户端程序,用户可以通过在客户端的一些设置工作来自动生成针对性比较强的服务端程序,例如特定的端口、击键木马的邮件地址、密码、SMTP服务器等等。在本文中,我将简要地探讨这一技术的实现。

    从“生成”的这个事实来看,我们可以猜想客户端程序可能本身绑有一段自定义的二进制数据,这段二进制数据实质上就是一个服务端的模板。在用户进行了设置工作之后,客户端就会将设置完成的这些特定数据填充到这个模板之中,然后再通过写文件的操作将这段已经配置完毕的二进制数据模板生成一个特定的服务端程序,如下图所示:

    打个比方来说,邮局有很多空白的信封。你在买下一个信封之后,在信封上填写邮政编码、收件人地址和姓名,然后再将你的信件装入信封糊好,这就成为了你所特有的一封信件了。——希望我这么解释能够让你明白我下面将要在操作的大致过程。

    下面我要实现一个名为“MsgBox生成器”的演示程序,你可以在客户端进行MessageBox的标题和文本的设置,然后程序就会在C:/下生成一个名为MsgBox.exe的“Hello, World”程序,这个弹出的MessageBox就是你先前在客户端所设置的那样。运行界面如下图:

    好了,那么我先来设计生成服务端的功能。为了十足地模仿木马程序,我使用Win32 ASM来编写服务端程序,代码如下:

.386
.model flat, stdcall
option casemap:none
include /masm32/include/windows.inc
include /masm32/include/kernel32.inc
includelib /masm32/lib/kernel32.lib
include /masm32/include/user32.inc
includelib /masm32/lib/user32.lib
.data
szTitle db "Hello", 0
szText db "Hello, World", 0
.code
start:
invoke MessageBox, NULL, addr szText, addr szTitle, MB_OK or MB_ICONINFORMATION
invoke ExitProcess, NULL
end start

    如你所见,这正是Iczelion在他的Win32汇编教程中编写的那个“Hello, World”,你可以利用MASM32将这段源代码编译链接,生成一个MsgBox.exe,在此我就利用这个程序来充当我要生成的服务端。

    现在需要考虑的问题是,如何将这个MsgBox.exe嵌入到客户端程序中?一个最好想,也是最直观的办法是利用一个BYTE数组来放置 MsgBox.exe的二进制数据(CIH病毒就是这样,它专门准备了一个PE文件头),然后再使用API函数CreateFile将这段二进制数据写成文件。部分代码如下:

BYTE bySrvData[] = {
    0x4d, 0x5a, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00,
    0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
    0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   
// 由于篇幅略去以下所有数据-_-#...
};
BOOL CreateServer()
{
    HANDLE hFile;
    DWORD dwWritten;
    hFile = CreateFile( "C://MsgBox.exe", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL );
   
if( hFile == NULL )
    return
   FALSE;
    WriteFile( hFile, (LPCVOID)bySrvData,
   sizeof( bySrvData ), &dwWritten, NULL );
    CloseHandle( hFile );
   
   return
   TRUE;
}

    好了,代码到此为止。虽然它可以胜利完成任务,但是你一定不愿意编写这样的代码——对于MsgBox.exe的数据部分,它实在太冗长了(我算了一笔账,对于编译完成的MsgBox.exe,它只有不到3KB的大小,但是如果把它的二进制数据像上面那样保存成文本文件,这个文本文件就会拥有15KB的体积)。况且,这仅仅是一个“Hello, World!”程序,那么换成真正的木马服务端程序又会怎么样呢?而且,很多的服务端是用高级语言编写的,它们动辄会拥有几十KB的体积!

    现在我们只能别无选择地换一个角度考虑如何来解决这个问题:除了用BYTE数组,还有别的方法可以将MsgBox.exe放入客户端程序中吗?

    答案是肯定的,那就是利用EXE文件的自定义资源。在解说如何使用自定义资源之前,我先大体介绍一下我要使用的几个API:

FindResource:查找一个资源。由于我们是要将这个服务端作为EXE的自定义资源形式放在EXE之中,所以在释放它之前必须首先找到它才可以。

SizeofResource:获得资源的尺寸,装载资源时使用。

LoadResource:装载资源,将资源的二进制数据装载到内存中。

LockResource:锁定资源,将内存中的资源数据锁定。

    好了,你可以通过查阅MSDN来了解这几个函数的详细功能及参数,这里我就不赘述了。我的整个思路如下:

将MsgBox.exe作为客户端程序的二进制资源一同编译。

在生成MsgBox.exe服务端的时候,使用以上的几个API函数读取这一段二进制资源数据。

将这段二进制数据保存为文件。

    现在我来实现第1步。首先你将MsgBox.exe改名为MsgBox.bin作为一个二进制文件,并将这个文件放入客户端源代码的文件夹下。然后,向客户端的资源脚本(.rc文件)中导入这个二进制资源,如下图所示:

这时候,VC会弹出一个对话框提示,如下图:

    你可以在“Resource Type”中随意填写你的资源类型,这个类型名称就是我们将要在FindResource函数的第三个参数lpType中使用的资源类型,我这里以“Server”为例。

这样,我就能够以资源的方式来使用这段数据了。我的代码如下:

BOOL CreateServer()
{
    HRSRC hResInfo;
    HGLOBAL hResData;
    DWORD dwSize, dwWritten;
    HANDLE hFile;
   
// 查找所需的资源
    hResInfo = FindResource( NULL, MAKEINTRESOURCE(IDR_SERVER), "Server" );
   
if( hResInfo == NULL )
    return
   FALSE;
   
// 获得资源尺寸
    dwSize = SizeofResource( NULL, hResInfo );
   
// 装载资源
    hResData = LoadResource( NULL, hResInfo );
   
if( hResData == NULL )
    return
   FALSE;
   
// 写文件
    hFile = CreateFile( "C://MsgBox.exe", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL );
   
if( hFile == NULL )
    return
   false;
    WriteFile( hFile, (LPCVOID)LockResource( hResData ), dwSize, &dwWritten, NULL );
    CloseHandle( hFile );
   
   return
   TRUE;
}

    到这里,如何生成服务端的问题就已经解决了,现在我来讨论如何自定义服务端的数据。我还是以一个例子来解释这个问题,下面是一段代码,也就是一个MessageBox的调用过程:

TCHAR strContext[] = "Hello, World!";
TCHAR strTitle[] = "Hello";
MessageBox( NULL, strContext, strTitle, MB_OK );


以上代码相对应的汇编代码为:
push 0
; 最后一个参数MB_OK
lea eax,[ebp-18h]
push eax
; 第3个参数strTitle
lea ecx,[ebp-10h]
push ecx ;
第2个参数strContext
push 0
; 第1个参数NULL
call dword ptr [__imp__MessageBoxA@16 (0042a2ac)]
; 函数调用

    也就是说,MessageBox的调用过程是传入了两个字符串地址,那么我们只需要将字符串所指向的内容进行改变,就可以达到修改MessageBox显示结果的目的了。

    那么,又如何来确定在MsgBox.exe中那两个字符串的位置呢?在这里,我玩弄了一个小把戏,就是将原来MsgBox.asm的.data段改为:

.data
szTitle db 100 dup('A')
szText db 100 dup('B')

    你也许会对这段代码颇为不解。不过我还是请你先按照上面的步骤将这个新的源文件编译链接,然后再改名为MsgBox.bin,最后导入到客户端的资源中。现在,你可以打开那个二进制资源MsgBox.bin看一看,相信你一定会在某个位置找到像下面这样的东西:

    这样一来,你就会很容易地发现,标题的相对偏移量是0x800,文本的相对偏移量是0x864——这也就是我定义那一连串'A'和'B'的用意了。

现在,就可以编写我在本文开始所提到的“MsgBox生成器”了,它的核心代码如下:

HRSRC hResInfo;
HGLOBAL hResData;
DWORD dwSize, dwWritten;
LPBYTE p;
HANDLE hFile;
TCHAR szTitle[100], szText[100];
// 查找所需的资源
hResInfo = FindResource( NULL, MAKEINTRESOURCE( IDR_SERVER ), "Server" );
if( hResInfo == NULL )
{
    MessageBox( hDlg, "查找资源失败!", "错误", MB_OK | MB_ICONINFORMATION );
    break
;
}
// 获得资源尺寸
dwSize = SizeofResource( NULL, hResInfo );
// 装载资源
hResData = LoadResource( NULL, hResInfo );
if( hResData == NULL )
{
    MessageBox( hDlg, "装载资源失败!", "错误", MB_OK | MB_ICONINFORMATION );
    break
;
}
// 为数据分配空间
p = (LPBYTE)GlobalAlloc( GPTR, dwSize );
if( p == NULL )
{
    MessageBox( hDlg, "分配内存失败!", "错误", MB_OK | MB_ICONINFORMATION );
    break
;
}
// 复制资源数据
CopyMemory( (LPVOID)p, (LPCVOID)LockResource( hResData ), dwSize );
// 获取标题和文本,并复制数据
GetDlgItemText( hDlg, IDC_EDT_TITLE, szTitle, 100 );
GetDlgItemText(hDlg, IDC_EDT_TEXT, szText, 100);
CopyMemory( (LPVOID)( p + 0x800 ), (LPCVOID)szTitle, 100 );
CopyMemory( (LPVOID)( p + 0x864 ), (LPCVOID)szText, 100 );
// 创建文件,写数据
hFile = CreateFile( "C://MsgBox.exe", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL );
if( hFile != NULL )
    WriteFile( hFile, (LPCVOID)p, dwSize, &dwWritten, NULL );
else
{
    MessageBox( hDlg, "创建文件失败!", "错误", MB_OK | MB_ICONINFORMATION );
    GlobalFree( (HGLOBAL)p );
    break
;
}
// 收尾工作,释放资源
CloseHandle( hFile );
GlobalFree( (HGLOBAL)p );

    到这里,这一技术的核心部分基本上就已经讲完了。对于一个实际的木马程序服务端而言,你只需要把MsgBox的标题和文本替换为相应的端口号和邮件地址就可以了。另外,对于用C/C++、Delphi等高级语言所编写的服务端模板,它的尺寸肯定会大大超过一个汇编写成的程序,这样的话查找要替换的字符串或者数值就肯定会花些时间了。

本文配套代码用SDK编写,在Windows XP Professional + VC 6.0下编译通过。

PHP 图片木马隐写实战:绕过防御的DVWA靶场演示 本文通过DVWA靶场实战,详细演示了PHP图片木马隐写技术如何绕过高级文件上传防御。核心在于制作一个拥有合法图片文件头、却在文件末尾隐藏PHP木马代码的“特洛伊”图片,并利用文件包含漏洞激活木马,最终实现服务器控制。文章深入剖析了攻击链原理与关键防御建议。 阅读详情

相关推荐

Kali Linux下使用Metasploit生成与规避检测的木马技术

渗透测试是网络安全领域的重要实践,其中Kali Linux作为专业的安全测试操作系统,集成了包括Metasploit Framework在内的多种工具链。Metasploit的MSFvenom模块支持生成跨平台载荷,通过自定义编码和连接方式实现攻击模拟。在红队行动中,合理使用HTTPS载荷和内存注入技术能有效绕过企业级防火墙检测。本文以windows/meterpreter/reverse_tcp为例,详解从基础载荷生成到高级流量伪装的完整技术路径,同时强调在授权测试中做好日志记录的法律合规要求。

weixin_29325955的博客 219

逆向工程核心原理——PE文件格式分析

什么是PE文件? PE文件的全称是Portable Executable,意为可移植的可执行的文件 PE文件是指32位可执行文件,也称为PE32。64位的可执行文件称为PE+或PE32+,是PE(PE32)的一种扩展形式(请注意不是PE64)。 常见种类 种 类 主扩展名 种 类 主扩展名 可执行系列 EXE、SCR 驱动程序系列

weixin_46601374的博客 2535

从钓鱼网站克隆到木马上线:手把手玩转Cobalt Strike的两种基础攻击链

本文深入解析Cobalt Strike在网络安全中的两种基础攻击链:社会工程学钓鱼攻击和木马后渗透操作。通过详细的技术实现步骤和实战案例,帮助安全研究人员理解攻击者的思维路径,同时提供防御视角下的防护建议。文章涵盖监听器配置、网站克隆、木马生成与免杀等关键环节,是学习渗透测试工具的实用指南。

janckywong963的专栏 472

【PE结构】1.PE文件结构、DOS头

一、前言二、PE整体结构三、DOS头四、NT头    4.1.文件头    4.2.扩展头五、区段头六、导出表七、导入表八、资源表九、其他表一、前言PE(PortableExecutable)文件,也就是Windows操作系统上的可执行文件,不仅仅是扩展名为EXE的文件,还包括DLL、SYS、COM、OCX等多种文件。Windows操作系统树大招风,运行在上面的各种应用程序(PE文件)自然成了很多...

SMOne 1581

TheFatRat木马生成工具实战指南:从安装到多平台Payload生成

本文详细介绍了TheFatRat木马生成工具的多平台Payload生成实战技巧,包括环境部署避坑、Payload生成策略、免杀强化技巧及多平台攻击案例。特别针对Windows Defender、企业级防火墙和移动端渗透提供了黄金组合方案,帮助安全人员高效生成隐蔽性强的后门程序。

weixin_42685438的博客 369

判断两个多边形是否相交(java实现)

判断两个多边形是否相交 ,当前认为一个点相交也是相交,可针对凹多边形和凸边型等多复杂的多边形进行相交判断,采用java实现,因为网上java实现的比较少,所以这里写下如何实现,适用于碰撞检测,地图等等应用场景

IT_CREATE的博客 5845

小白白红队初成长(7)win权限提升

1、前言 1.1、一些补充 2、Potato家族 2.1、补充 2.2、利用前提(条件) 2.3、简述JuicyPotato原理 2.4、利用过程 3、系统错误配置提权-AlwaysInstallElevated 3.1、漏洞原理 3.2、验证目标机器是否存在漏洞 3.3、搭建漏洞环境(激活AlwaysInstallElevated) 3.3.1、第一种方法 3.3.2、第二种方法 3.4、提权测试 4、令牌窃取 什么是令牌? “令牌窃取”使用场景 知识点补充 实际测试 其他补充 5、内核提权 5.1、寻找

划水的小白白 8305

海量Embedding进行相似度查询和比较的方法

这个是在科研中的现实需求。例如每一个源代码文件,我们可以生成一个embedding,如果有超过5000万个embedding(例如用BERT生成5000万个embedding),怎么样有效地计算相似性呢(例如有5000个positive的embedding,想在5000万个中找到类似的)。 简单介绍一下我尝试的结果:如果直接用torch.cosine_similarity,我手里的数据估计至少要处理两个月。这时候就想到了用LSH -- Locality Sensitive Hashing,但是我之前并没怎

qysh123的专栏 4567

ELF文件格式-笔记

ELF 在进行逆向工程的开端,我们拿到 ELF 文件,或者是 PE 文件,首先要做的就是分析文件头,了解信息,进而逆向文件。 ELF文件的格式 目前流行的可执行文件格式(Executable)主要就是 Windows 下的 PE(Portable Executable)和 Linux 的 ELF(Executable Linkble Format),都是 COFF(Common File f...

ai agent 651

基于zynq在linux下的AXI-CAN实战

从petalinux的搭建,到uboot、kernel、rootfs的调试、打包提示:以下是本篇文章正文内容,下面案例可供参考本次要讲述的zynq的AXI-CAN实战小知识就说到这里了,兄弟萌要有什么指导意见或疑问可以在评论区留下"足迹"。

qq_45521099的博客 3167

保姆级教程:在阿里云ECS上用Docker一键部署EMQX MQTT服务器(Ubuntu 20.04)

本文提供在阿里云ECS上使用Docker一键部署EMQX MQTT服务器的详细教程,涵盖从实例创建、Docker环境配置到EMQX部署与优化的全流程。适合物联网开发者快速搭建高效、安全的MQTT消息服务器,适用于智能家居、工业物联网等场景。

weixin_28739079的博客 308

JVM指令集及各指令的详细使用说明

指令码 助记符 说明 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 iconst_0 将int型0推送至栈顶 0x04 iconst_1 将int型1推送至栈顶 0x05 iconst_2 将int型2推送至栈顶 0x06 iconst_3 将int型3推送至栈...

cooldatabase 238

机器人系统能用MQTT5.0代替ROS2吗?

更为灵活和友好的方案是通过把ROS(Robot Operating System)与MQTT(Message Queuing Telemetry Transport)协议相结合的解决方案,利用MQTT的轻量级、跨平台和广泛适用性特点,扩展ROS系统的通信能力,或将非ROS系统接入ROS网络。

QzmAIoT 2164

黑客攻击-木马程序(1)

声明:本篇内容,禁止用作非法目的,谢绝一切形式的转载。 当你在无意间点击一个链接后,当你在不明情况安装一个程序时,当你忍不住点击一个美女图片的时候,你的设备可能就此沦陷了,成为了黑客眼中的"肉鸡"。 kali Linux Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统。由Offensive Security Ltd维护和资助。最先由Offensive Security的Mati Aharoni和Devon Kearns通过重写BackTrack来完成,BackTrack

helloworlddm的博客 1万+

36、转子 - 主动磁轴承系统建模及密封性能研究

本文研究了转子-主动磁轴承(AMBs)系统的动力学建模、稳定性分析及密封性能。通过建立包含转子、电子控制系统和接口接触的机电模型,结合Bernoulli-Euler梁理论与弹簧单元等效法,构建了考虑接口接触的闭环系统模型,并在磁悬浮鼓风机和电机上进行数值模拟与实验验证,结果表明接口接触刚度显著影响系统稳定性,尤其在高预紧扭矩下易激发弯曲模态失稳。同时,对非接触式低温密封进行了CFD仿真与实验测试,发现浮动环密封(FRS)具有最优的泄漏控制和抗磨损性能。研究成果为提升高速旋转机械的稳定性和密封可靠性提供了理论

vim8coder的博客 135

am62x A53与R5F通信

AM62x是Ti的一款异构多核芯片。remoteproc驱动,硬编码(写死)了R5F/M4F固件的名字,这样驱动启动时,就会找硬件编码的固件,下面是其对应关系。值得注意的是,linux内核中的M4F remoteproc驱动启动M4F,而linux内核中的R5F remoreteproc驱动不启动R5F,相反,它attach到已经在boot阶段启动的R5F固件上。在/lib/firmware的真实固件名:,而我们生成的固件名如下所示,没有直接对应的,经确认,.out文件就是我们需要的,重命名后即可。

鹰之翔 1363

Kali+Metasploit 木马生成、植入与控制靶机全流程(经典版基础篇)

⚠️ 重要声明本文仅用于严禁用于非法入侵、破坏、窃取数据等违法犯罪行为。任何未经授权的攻击行为均违反《网络安全法》《刑法》等法律法规,后果自负。

hcx1986hcx的博客 803

教程: 将 SolidWorks 设计导出为 ROS 的 URDF

请按照以下步骤应用自定义徽标纹理:创建徽标材质文件:techniquepass材质名称:测试/材质颜色属性:环境、漫反射、镜面和发射都设置为白色(1 1 1 1),这意味着该材质看起来完全是白色的。纹理 在表面应用纹理图像 logo.png。将材质文件复制到 gazebo matrial:复制徽标图像:将 “徽标 ”替换为机器人上徽标所在位置的适当参考值。按照以上步骤,您就可以在 Gazebo 中为机器人添加自定义材质和纹理,包括徽标。

机器人控制与仿真应用 2459

PHP木马图片隐写与Weevely后门控制实战:跨平台攻防技术解析

文件上传漏洞是Web安全中的常见攻击向量,攻击者通过将恶意代码嵌入看似无害的文件(如图片)来绕过安全检测。其原理是利用文件格式解析的差异,例如在JPG文件末尾追加PHP代码,使文件在浏览器中显示为正常图片,但被服务器解析时执行恶意指令。这种技术对于渗透测试和防御加固具有重要价值,能帮助安全人员理解攻击者的隐蔽渗透手法。在实际应用场景中,安全从业者常使用Kali Linux中的Weevely工具生成加密后门,并结合命令行操作实现跨平台(Windows/Linux)的文件隐藏。通过掌握PHP木马的生成、图片隐写

weixin_34391445的博客 340

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Metasploit木马生成与渗透测试实战指南

渗透测试是网络安全领域的重要实践,通过模拟攻击来评估系统防御能力。其中,Metasploit框架作为开源渗透测试工具,集成了漏洞利用、Payload生成和会话控制等功能,广泛应用于安全评估。本文以Kali Linux环境为基础,详细解析如何使用msfvenom生成定制木马,并通过社会工程学方式控制靶机。内容涵盖Payload生成、反病毒规避、持久化维持等关键技术,特别针对Windows Defender等常见防护措施提供了免杀处理方案。通过DC3、Metasploitable3等热门靶机的实战演示,帮助安全

weixin_32736961的博客 300

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 文件时间设置与读取的代码
下一篇: 最简单的反弹后门设计和基本模块代码
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值