首页
社区
课程
招聘
[转帖]使用C/Delphi编写ShellCode
发表于: 2012-9-7 11:48 5842

[转帖]使用C/Delphi编写ShellCode

2012-9-7 11:48
5842
转载自  http://www.bootkitz.com/?p=93  文章谈的很好

                                         使用C/Delphi编写ShellCode

这里说的ShellCode指的是一段x86机器码,无需重定位,在内存任何位置都可以执行的代码.
使用C/Delphi编写代码也是由其编译器特性决定的。
一说起ShellCode,一般人都想到MASM/TASM/FASM/NASM这类汇编语言编译器,但是,汇编语言写ShellCode维护起来总是很麻烦,肯定不如高级语言维护起来方便,尤其是大型的工程,例如PE Virus/Packer这样的工程。
ShellCode可以在内存中任何一个位置独立运行,他不需要外界对其进行任何操作,不需要装载器对其进行装载、重定位、填充IAT这样操作。
因此很多工作都需要自己去做。所以,在编写时需要一定的前置知识:
1.编译器的实现原理.高级语言源代码是怎么变成Opcode的,如何处理局部/全局变量,文件作用域内代码是如何排布的
2.PE文件结构的知识.尤其是EAT方面的,因为在 ShellCode执行过程中调用的API都需要你自己获取到,如何获取?自己写算法实现就好了~
3.操作系统的一些知识~

下面来说一下如何使用C/Delphi来编写 ShellCode
1.Kernel32.dll基址的获取.这个必须用汇编实现,这是最重要的,因为Kernel32.dll提供的LoadLibraryA和 GetProcAddress函数保证了ShellCode中其他功能的实现。
2.API的动态获取.在获取了 Kernel32.dll基址以后,就可以参照PE结构解析导出表获取相关函数的地址了。
3.固定代码的自定位.使用高级语言编写出的代码,里面肯定有类似mov eax,[0040xxxx]这样的代码,类似这样的访问固定地址的代码在ShellCode的执行过程中会造成各种异

常,如何减少这样的问题?内联汇编获取EIP,然后修正即可。选取一个好的数据结构可以很好的解决这个问题。
4.代码的编写。这里讨论的是使用高级语言编写ShellCode,因此我们谈论的主题将是高级语言。虽然高级语言编译器为我们提供了内联汇编的特性,但是这不是本文重点,只有在需要使用内联汇编的时候才使用,如获取Kernel32.dll基址与代码的自定位。编写时需要注意以下几点:
(1)ShellCode函数内部禁止引用全局变量/常量
(2)代码编写要紧凑,并且实现功能的代码的作用域仅限于本文件中,即函数从开始到结束的代码都在一个文件中,不要试图调用其他文件中的函数,这样会造成很严重的后果

只要保证上述几点都能做到,那么写出来的ShellCode将没有任何问题。
使用高级语言编写ShellCode的优点:易于理解,易于调试,易于维护,可以实现复杂的功能。在调用ShellCode前后堆栈、寄存器是平衡的~
使用高级语言编写ShellCode的缺点:编写出的 ShellCode体积较大,不易于优化,在对长度要求较高的场合不适用。

最后着重提一下使用Delphi编写 ShellCode,使用Delphi编写ShellCode的好处就是Delphi语法中的with … do结构可以很好的减少长代码的产生,使代码更易读,不像C语言在调用函数时需要lpShellCodeCrl->fMessageBoxA(…);这么罗嗦了。
再有一个好处就是可以编写涵盖32位~64位平台的ShellCode,Win32~Native环境的ShellCode,覆盖很全面。
由于现有的LCC/VS编译器的64位编译器中不允许使用内联汇编,使得使用C语言编写的ShellCode只能停留在32位下。
新推出的Delphi XE2提供了64位编译器支持的同时,还支持64位内联汇编,这就完美了。

有什么欠缺或不当的地方,还请指出。本文完。

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

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
为啥要改我文章的标题呢?凭空加一个。。。
我这个说的也不是针对x64的啊。。。
2012-9-7 13:03
0
雪    币: 525
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看了一路,我说下我对楼主这种实现方式的理解。
1,对抗AV,模块扫描查杀。
2,可以更容易的实现寄生。比如在系统进程中。
不知道,理解正确不。
2012-9-7 13:52
0
雪    币: 673
活跃值: (278)
能力值: ( LV15,RANK:360 )
在线值:
发帖
回帖
粉丝
4
大体上就是用高级语言写shellcode 功能型shellcode维护很容易

而功能型shellcode比模块等等 更难以被查杀
2012-9-7 15:19
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
那比如一些去挂钩的操作。不是也是要用汇编编写。看不出来用高级语言编写shellcode对于主动防御有什么好处
2012-9-7 15:51
0
雪    币: 673
活跃值: (278)
能力值: ( LV15,RANK:360 )
在线值:
发帖
回帖
粉丝
6
我就说两点好处
1用高级语言写出的shellcode能够实现poison ivy或者灰鸽子这样的远控的全部功能
如果你技术过硬,多态变形的技术的使用使得杀毒软件完全无法查杀你的shellcode
而这样的一个项目下来是使用汇编难以维护的
2前面已经说了 你的shellcode是被注入到一个白进程里 这个白进程你自己选择
可以是具有合法联网的进程也可以是其他的白名单进程 杀毒软件根本没法报  
再加上shellcode可是边解码边执行的,内存查杀太好过了,现在大家都抢着进R0抢权限,R3下能做好的事情
何必进R0呢。此时唯一的痕迹就是在内存shellcode分散在内存的边解密边执行的机器码.......
......其他的你自己想吧
2012-9-7 16:08
0
雪    币: 525
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我想说,现在的难点在注入,在如何执行起来。查杀什么的,还是比较好过,病毒库有限啊。
还有就是自启动比较难。
2012-9-7 17:54
0
雪    币: 673
活跃值: (278)
能力值: ( LV15,RANK:360 )
在线值:
发帖
回帖
粉丝
8
注入的方法  暂时没想到一劳永逸通用的

这东西  仁者见仁智者见智 我就不说了
2012-9-7 18:10
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
使用高级语言容易实现强大的功能,但高级语言对于绕过杀软的主动防御,敏感函数的检测、行为检测比汇编要困难一些。
2012-11-27 10:43
0
游客
登录 | 注册 方可回帖
返回
//