首页
社区
课程
招聘
让侦测工具把壳识别为VC++7.0的源代码
2004-5-8 17:29 11307

让侦测工具把壳识别为VC++7.0的源代码

2004-5-8 17:29
11307
看了LiNSoN兄"让侦测工具把壳识别为VC++",还不错,可惜是手动的...

于是我顺手写了程序自动完成这一工作,经实验现在可以把不带CRC32的壳成功
伪装,如果壳带有CRC32就不行了
现帖出源代码,与大家共享,有兴趣的可以加以改进
程序不复杂,我就直接帖出来了

{
  Author: xIkUg
  Email: [email]xikug@163.com[/email]
  HOMEPAGE: http://www.xp-program.com
  Description: 把PE程序伪装为VC7.0编译的
}
unit uMain;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    edFName: TEdit;
    Button1: TButton;
    Label2: TLabel;
    edOEP: TEdit;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button5Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
    FImageBase: DWORD;
   
  public
    { Public declarations }
  end;

  THEAD = array [0..63] of byte;

var
  Form1: TForm1;

const
  MYSECTION = 'xIkUg';
  
  JMPOFF = 43;
  
  //这个是HEAD.asm中的代码的机器码
  OEPCODE: THEAD = ($55, $8B, $EC, $6A, $FF, $68, $2A, $2C, $0A, $00, $68, $38,
                    $90, $0D, $00, $64, $A1, $00, $00, $00, $00, $50, $64, $89,
                    $25, $00, $00, $00, $00, $58, $64, $A3, $00, $00, $00, $00,
                    $58, $58, $58, $58, $8B, $E8, $B8, $00, $10, $40, $00, $FF,
                    $E0, $90, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
                    $00, $00, $00, $00);

procedure AddSection(FName: string);      //新加一个Section,并把OEPCode写进去

implementation

{$R *.dfm}

procedure TForm1.Button5Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  MessageBox(Handle, 'Author: xIkUg' + #10#13 +
    'Email: [email]xikug@163.com[/email]' + #10#13 +
    'HOMEPAGE: http://www.xp-program.com',
    'About', MB_OK);
end;

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

procedure TForm1.Button2Click(Sender: TObject);
var
  DOSHEADER: IMAGE_DOS_HEADER;
  PEHEADER: IMAGE_NT_HEADERS;
  fs: TFileStream;

begin
  fs := TFileStream.Create(edFName.Text, fmOpenReadWrite +
    fmShareDenyWrite);
  try
    fs.Seek(0, soFromBeginning);
    fs.Read(DOSHEADER, sizeof(DOSHEADER));
   
    fs.Seek(DOSHEADER._lfanew, soFromBeginning);
    fs.Read(PEHEADER, sizeOf(PEHEADER));
    FImageBase := PEHEADER.OptionalHeader.ImageBase;
    edOEP.Text := IntToHex(PEHEADER.OptionalHeader.AddressOfEntryPoint, 8);
  finally
    fs.Free;
  end;
end;

procedure AddSection(FName: string);
var
  DOSHEADER: IMAGE_DOS_HEADER;
  PEHEADER: IMAGE_NT_HEADERS;
  SectionHeader: IMAGE_SECTION_HEADER;
  MySectionHeader: IMAGE_SECTION_HEADER;
  fs: TFileStream;

  AddressOfEntryPoint: DWORD;
  
begin
  fs := TFileStream.Create(FName, fmOpenReadWrite +
    fmShareDenyWrite);
  try
    fs.Seek(0, soFromBeginning);
    fs.Read(DOSHEADER, sizeof(DOSHEADER));
   
    fs.Seek(DOSHEADER._lfanew, soFromBeginning);
    fs.Read(PEHEADER, sizeOf(PEHEADER));

    fs.Seek(sizeOf(SectionHeader) *
      (PEHEADER.FileHeader.NumberOfSections - 1), soFromCurrent);

    fs.Read(SectionHeader, sizeof(IMAGE_SECTION_HEADER));

    MySectionHeader.Name[0] := ord('x');
    MySectionHeader.Name[1] := ord('I');
    MySectionHeader.Name[2] := ord('k');
    MySectionHeader.Name[3] := ord('U');
    MySectionHeader.Name[4] := ord('g');
    MySectionHeader.Name[5] := 0;
    MySectionHeader.Name[6] := 0;
    MySectionHeader.Name[7] := 0;

    MySectionHeader.VirtualAddress := PEHEADER.OptionalHeader.SizeOfImage;
    MySectionHeader.Misc.VirtualSize := $200;
    MySectionHeader.SizeOfRawData := (MySectionHeader.VirtualAddress div
      PEHEADER.OptionalHeader.FileAlignment + 1) * PEHEADER.OptionalHeader.FileAlignment -
      PEHEADER.OptionalHeader.SizeOfImage;
    MySectionHeader.PointerToRawData :=
      SectionHeader.SizeOfRawData+SectionHeader.PointerToRawData;
    MySectionHeader.Characteristics := $e0000020;

    Inc(PEHEADER.FileHeader.NumberOfSections);
    fs.Write(MySectionHeader, sizeOf(MySectionHeader));

    fs.Seek(DOSHEADER._lfanew, soFromBeginning);

    AddressOfEntryPoint := PEHEADER.OptionalHeader.AddressOfEntryPoint;

    PEHEADER.OptionalHeader.AddressOfEntryPoint :=
      MySectionHeader.VirtualAddress;

    PEHEADER.OptionalHeader.MajorLinkerVersion := 7;
    PEHEADER.OptionalHeader.MinorLinkerVersion := 0;
    AddressOfEntryPoint := AddressOfEntryPoint +
      PEHEADER.OptionalHeader.ImageBase;

    asm
      PUSHAD
      LEA eax, OEPCODE
      ADD eax, JMPOFF
      MOV edx, AddressOfEntryPoint

      MOV DWORD ptr [eax], edx
      POPAD
    end;

    PEHEADER.OptionalHeader.SizeOfImage :=
      PEHEADER.OptionalHeader.SizeOfImage + MySectionHeader.Misc.VirtualSize;
      
    fs.Write(PEHEADER, sizeof(PEHEADER));

    fs.Seek(fs.Size, soFromBeginning);
    fs.Write(OEPCODE, MySectionHeader.Misc.VirtualSize)
  finally
    fs.Free;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  //伪装
  if trim(edFName.Text) = '' then
  begin
    MessageDlg('请先选择一个可执行文件', mtError, [mbOK], 0);
    Exit;
  end;

  //这段其实是不需要的,我懒得删了,看看也不错
  if trim(edOEP.Text) = '' then
  begin
    MessageDlg('请先获取程序入口点', mtError, [mbOK], 0);
    Exit;
  end;

  AddSection(edFName.Text);             //伪装
  MessageDlg('伪装成功!', mtInformation, [mbOK], 0);
end;

end.

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞11
打赏
分享
最新回复 (22)
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
xIkUg 9 2004-5-8 17:30
2
0
head.asm的代码

.386
.MODEL FLAT,STDCALL

.code

main:
        assume fs:nothing
        push ebp
        mov ebp,esp
        push -1
        push 666666
        push 888888
        mov eax,fs:[0]
        push eax
        mov fs:[0],esp

        pop eax
        mov fs:[0],eax
        pop eax
        pop eax
        pop eax
        pop eax
        mov ebp,eax
        mov eax, 00401000H
        jmp eax
end main
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
newlaos 2004-5-8 18:18
3
0
不错,收藏!
雪    币: 241
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiluoyou 2004-5-9 09:50
4
0
[QUOTE]最初由 xIkUg 发布
看了LiNSoN兄"让侦测工具把壳识别为VC++",还不错,可惜是手动的...
后面的省了
请问是什么语言啊?(C?)什么编译器啊?
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
xIkUg 9 2004-5-9 09:51
5
0
最初由 xiluoyou 发布
[QUOTE]最初由 xIkUg 发布
看了LiNSoN兄"让侦测工具把壳识别为VC++",还不错,可惜是手动的...
后面的省了
请问是什么语言啊?(C?)什么编译器啊?


Delphi
雪    币: 223
活跃值: (106)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
temerata 1 2004-5-9 10:37
6
0
是不是有个笔误?“让侦测工具把壳识别为VC++7.0的源代码”应该是VC++6.0吧?VC++7.0的代码不是PUSH 60,PUSH XXXXXXXX吗?

在RCE上看到的:

==== Microsoft Visual C++ 6.0 ====

55               PUSH EBP
8BEC             MOV EBP,ESP
6AFF             PUSH -1
6800000000       PUSH 00000000			; needs updating
6800000000       PUSH 00000000			; needs updating
64A100000000     MOV EAX,DWORD PTR FS:[0]
50               PUSH EAX
64892500000000   MOV DWORD PTR FS:[0],ESP
83EC58           SUB ESP,58
53               PUSH EBX
56               PUSH ESI
57               PUSH EDI
8965E8           MOV DWORD PTR [EBP-18],ESP

558BEC6AFF6800000000680000000064A10000
0000506489250000000083EC585356578965E8

==================================


==== Microsoft Visual C++ 7.0 ====

6A60             PUSH 60
6800000000       PUSH 00000000			; needs updating

6A606800000000

==================================
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
xIkUg 9 2004-5-9 10:55
7
0
最初由 temerata 发布
是不是有个笔误?“让侦测工具把壳识别为VC++7.0的源代码”应该是VC++6.0吧?VC++7.0的代码不是PUSH 60,PUSH XXXXXXXX吗?

在RCE上看到的:

==== Microsoft Visual C++ 6.0 ====

55 PUSH EBP
8BEC MOV EBP,ESP
6AFF PUSH -1
6800000000 PUSH 00000000 ; needs updating
6800000000 PUSH 00000000 ; needs updating
64A100000000 MOV EAX,DWORD PTR FS:[0]
50 PUSH EAX
64892500000000 MOV DWORD PTR FS:[0],ESP
83EC58 SUB ESP,58
53 PUSH EBX
56 PUSH ESI
57 PUSH EDI
8965E8 MOV DWORD PTR [EBP-18],ESP

558BEC6AFF6800000000680000000064A10000
0000506489250000000083EC585356578965E8

==================================


==== Microsoft Visual C++ 7.0 ====

6A60 PUSH 60
6800000000 PUSH 00000000 ; needs updating

6A606800000000

==================================


我改了PE文件头中连接器版版的信息,所以就变成7.0了
雪    币: 279
活跃值: (435)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
MengLong 6 2004-5-9 11:09
8
0
楼主你的论坛还好吗?
雪    币: 242
活跃值: (190)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ttdown 2004-5-9 11:14
9
0
有空试一试。
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
xIkUg 9 2004-5-9 11:28
10
0
最初由 MengLong 发布
楼主你的论坛还好吗?

还好,最近换服务器了,以前的论坛数据全丢失了
雪    币: 279
活跃值: (435)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
MengLong 6 2004-5-9 11:39
11
0
最初由 xIkUg 发布

还好,最近换服务器了,以前的论坛数据全丢失了

好像不能发贴耶。qq:358628944
雪    币: 674
活跃值: (1684)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
daxia200N 6 2004-5-9 15:17
12
0
伪装没有意义,OD一跟踪就露馅了。
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
xIkUg 9 2004-5-9 15:46
13
0
最初由 MengLong 发布

好像不能发贴耶。qq:358628944


谢谢你提出,我一直还不知道我的论坛有这个问题呢...

呵呵...问题已经修复,现在可以浏览和发帖了...

我已经加了你的QQ
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
xIkUg 9 2004-5-9 15:48
14
0
最初由 daxia200N 发布
伪装没有意义,OD一跟踪就露馅了。


对不会手动脱壳,只会用自动脱壳工具脱壳的人还是有点用处的...

当然如果会手动脱壳的,一看就知道是怎么回事了

这个源代码是供大家学习的
雪    币: 279
活跃值: (435)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
MengLong 6 2004-5-9 18:50
15
0
最初由 xIkUg 发布


谢谢你提出,我一直还不知道我的论坛有这个问题呢...

呵呵...问题已经修复,现在可以浏览和发帖了...

我已经加了你的QQ

加错了吧。
我看不到你啊。
雪    币: 211
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
堆栈的栈 2004-5-17 20:10
16
0
那能不能讲解一下原理吗?

另外,要逆向操作该怎么办呢?
把添加的段删了,PE头改回来,该怎么做呢?
雪    币: 213
活跃值: (96)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
云重 1 2004-5-18 08:07
17
0
用处不大,
雪    币: 317
活跃值: (866)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
aqtata 2 2004-5-18 13:41
18
0
高手
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
阿笨 2004-7-6 17:02
19
0
收藏
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
qiweixue 19 2004-7-6 17:14
20
0
Delphi
很流畅啊・・・:D

==== Microsoft Visual C++ 7.0 ====

6A60             PUSH 60
6800000000       PUSH Visual C++ 7.0       
6A606800000000

==================================
???
参数多传对拉・・
还报错啊・・
哈哈哈哈哈,小样 没有看到偶是穿拉CRC32的马甲吗・・・・
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 24 2004-7-6 18:50
21
0
我以前也想写.总是懒的作
雪    币: 242
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xcs 2004-7-7 11:50
22
0
很好!值得收藏!!
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 24 2004-7-8 12:02
23
0
有没有兴趣写一个更多的,比如也可以模仿deilph,vb等等的
一起做?
游客
登录 | 注册 方可回帖
返回