首页
社区
课程
招聘
在高级语言中隐藏Call指令
发表于: 2005-3-21 16:56 12429

在高级语言中隐藏Call指令

2005-3-21 16:56
12429

今天写壳的时候想到了一种不需要手动修改直接编译就隐藏了call指令的方法,和大家一起分享。先还是说说手动隐藏call的简单方法。(我习惯用Delphi所以文中是delphi代码)
我在网吧,电脑没有带出来,所以即想即写,有什么错误的地方还望指出来。
手动隐藏方法:
比如我们定义这样的一个过程。
procedure test;
begin
end;
然后在另外一个过程中调用,
begin
   test;
end;
一般编译后我们就会看到相应的
00000001 call XXXXXXXX (00000001和XXXXXXXX都是假设的地址)
我们最常用的隐藏方法就是把代码写成这样
begin
   test;
   asm DB $90,$90,$90,$90,$90,$90 end;
end;
我们需要利用6个nop来为以后的隐藏做准备。
然后等编译后会出现这样的代码
00000001 call XXXXXXXX
00000006 nop
00000007 nop
00000008 nop
00000009 nop
00000010 nop
00000011 nop

然后我们手工需要做的是修改这段代码成如下
00000001 push 00000012
00000006 push XXXXXXXX
00000011 ret
这样代码长度刚好一样
这样就达到了隐藏效果,但是这样每次都要手工修改麻烦,下面看另外一种隐藏方法

自动隐藏:
在上面我们看到了手动隐藏的方法,下面来看自动隐藏方法,同样以test过程为例。
我们都知道这样的一种获取eip的方法
00000001 call 00000006
00000006 pop eax
在看看这段代码的机器码
00000001 FF00000000
00000006 58
{机器吗可能有错误记性不好}
那么我们定义两个变量
var
  TestEip:cardinal;
  TestPoi:pointer;
先不要问用来做什么,马上就清楚拉。
我们现在把调用代码改以下
begin
  Asm
    DB $FF,$00,$00,$00,$00,$58;
    Add Eax,$20;{这里要看,这个$20是这段代码的大小,反正要让Eax刚好只向Ret后一句的地址}
    mov TestEip,eax;
  end;
  TestPoi:=@Test;
  asm
    Push TestEip;
    Push TestPoi;
    ret
  end;
然后编译,怎么样?call指令是不是不见了?
但是这样有一个麻烦,那就是万一Test带参数怎么办?
比如:
procedure test(a,b,c:cardinal);
begin
end;
那么我们也可以这样调用

begin
  Asm
    DB $FF,$00,$00,$00,$00,$58;
    Add Eax,$2F;{这里要看,这个$20是这段代码的大小,反正要让Eax刚好只向Ret后一句的地址}
    mov TestEip,eax;
    mov eax,参数1;
    mov ecx,参数2;
    mov edx,参数3;
  end;
  TestPoi:=@Test;
  asm
    mov eax,testeip;
    Push TestEip;
    Push TestPoi;
    ret
  end;
只写这么多拉。没有什么技术含量。有什么更好的方法拿出来大家分享一下呀。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 209
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
最近流行写壳
2005-3-21 17:03
0
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
3
本版发重复了一主题,刚才操作失误让工具开发块也有一篇,哎。看雪老大帮删除一下呀。
2005-3-21 17:08
0
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
最初由 netsowell 发布
本版发重复了一主题,刚才操作失误让工具开发块也有一篇,哎。看雪老大帮删除一下呀。


那个版块你自己有权限(版主权限)删除的。
2005-3-21 17:11
0
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
最初由 random 发布
最近流行写壳


Win32平台最后的疯狂~
2005-3-21 17:13
0
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
6
最初由 kanxue 发布


那个版块你自己有权限(版主权限)删除的。

我试了一下,没有权限。
2005-3-21 17:14
0
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
7
最初由 netsowell 发布

我试了一下,没有权限。

开始有个地方设置错了,现在试试,应可以了。
2005-3-21 17:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
begin
test;
asm DB $90,$90,$90,$90,$90,$90 end;
end;

请问楼煮

VC中如何嵌入上面那段汇编代码?
2005-3-21 18:17
0
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
9
最初由 NF7 发布
VC中如何嵌入上面那段汇编代码?

........


http://bbs.pediy.com/showthread.php?s=&threadid=12220
2005-3-21 18:36
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
10
最初由 netsowell 发布

我试了一下,没有权限。


在网页的下方,找选单
2005-3-21 19:34
0
雪    币: 111
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
不错的主意... 可惜还是有点繁琐...
2005-3-21 20:23
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
12
不错的思路~
2005-3-21 22:54
0
雪    币: 107
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
UPUP
2005-3-21 23:46
0
雪    币: 332
活跃值: (479)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
14
call指令是不见了,但是地址还在(XXXXXXXX,TestEip),只能简单的防住静态分析,如果熟悉了也防不住。怎么再隐藏地址呢?自动变换一下?
2005-3-22 13:50
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
15
最初由 laoqian 发布
call指令是不见了,但是地址还在(XXXXXXXX,TestEip),只能简单的防住静态分析,如果熟悉了也防不住。怎么再隐藏地址呢?自动变换一下?

如果将地址保存在内存中(call XXXX,pop [TestEip]),取的时候只须push [TestEip]和push [TestPoi]可以加大静态分析难度。但对动态跟踪则起不了什么作用了,因为只须查看内存就能得知了。
2005-3-23 12:27
0
雪    币: 211
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
强!!!
我也在学Delphi,希望楼主能够提供一个Demo的代码出来,让我们学习一下。
:D
2005-3-24 16:33
0
雪    币: 214
活跃值: (70)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
厉害
2005-3-24 19:36
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
18
UPUP
2005-3-24 19:58
0
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
19
最初由 堆栈的栈 发布
强!!!
我也在学Delphi,希望楼主能够提供一个Demo的代码出来,让我们学习一下。
:D

有空的时候可以弄一个,
2005-3-25 10:08
0
游客
登录 | 注册 方可回帖
返回
//