病毒编程技术之恶意代码的亲密接触
日期:2008年6月15日 作者: 查看:[大字体 中字体 小字体]-
该结构偏移12字节处就是最后执行的浮点指令的运行时地址,因此我们也可以用如下一段指令获取delta offset:
fpu_addr:
fnop
call GetPhAddr
sub ebp,fpu_addr
GetPhAddr:
sub esp,16
fnstenv [esp-12]
pop ebp
add esp,12
ret
delta offset 也不一定非要放在ebp 中,只不过是ebp 作为栈帧指针一般过程都不将该寄存器用于其它用途,因此大部分病毒作者都习惯于将delta offset 保存在ebp 中,其实用其他寄存器也完全可以。
在优化过的病毒代码中并不经常直接使用上述直接计算delta offset 的代码,比如在Elkern开头写成了类似如下的代码:
call _start_ip
_start_ip:
pop ebp
;...
;使用
call [ebp+addrOpenProcess-_start_ip]
;...
addrOpenProcess dd 0
;而不是
call _start_ip
_start_ip:
pop ebp
sub ebp,_start_ip
call [ebp+addrOpenProcess]
为什么不采用第二种书写代码的方式?其原因在于尽管第一种格式在书写源码时显得比较罗嗦, 但是addrOpenProcess-_start_ip 是一个较小相对偏移值,一般不超过两个字节,因此生成的指令较短,而addrOpenProcess在32 Win32编译环境下一般是4 个字节的地址值,生成的指令也就较长。有时对病毒对大小要求很苛刻,更多时候也是为了显示其超俗的编程技巧,病毒作者大量采用这种优化,对这种优化原理感兴趣的读者请参阅Intel手册卷2中的指令格式说明。
API 函数地址的获取
在能够正确重定位之后,病毒就可以运行自己代码了。但是这还远远不够,要搜索文件、读写文件、进行进程枚举等操作总不能在有Win32 API 的情况下自己用汇编完全重新实现一套吧,那样的编码量过大而且兼容性很差。
Win9X/NT/2000/XP/2003系统都实现了同一套在各个不同的版本上都高度兼容的Win32 API,因此调用系统提供的Win32 API实现各种功能对病毒而言就是自然而然的事情了。所以接下来要解决的问题就是如何动态获取Win32 API的地址。最早的PE病毒采用的是预编码的方法,比如windows 2000 中CreateFileA 的地址是0x7EE63260,那么就在病毒代码中使用call [7EE63260h]调用该API,但问题是不同的Windows 版本之间该API 的地址并不完全相同,使用该方法的病毒可能只能在Windows 2000的某个版本上运行。
因此病毒作者自然而然地回到PE结构上来探求解决方法,我们知道系统加载PE 文件的时候,可以将其引入的特定DLL 中函数的运行时地址填入PE的引入函数表中,那么系统是如何为PE引入表填入正确的函数地址的呢?答案是系统解析引入DLL 的导出函数表,然后根据名字或序号搜索到相应引出函数的的RVA(相对虚拟地址),然后再和模块在内存中的实际加载地址相加,就可以得到API 函数的运行时真正地址。在研究操作系统是如何实现动态PE文件链接的过程中,病毒作者找到了以下两种解决方案:
A)在感染PE 文件的时候,可以搜索宿主的函数引入表的相关地址,如果发现要使用的函数已经被引入,则将对该API 的调用指向该引入表函数地址,若未引入,则修改引入表增加该函数的引入表项,并将对该API 的调用指向新增加的引入函数地址。这样在宿主程序启动的时候,系统加载器已经把正确的API 函数地址填好了,病毒代码即可正确地直接调用该函数。
B)系统可以解析DLL 的导出表,自然病毒也可以通过这种手段从DLL 中获取所需要的API地址。要在运行时解析搜索DLL 的导出表,必须首先获取DLL 在内存中的真实加载地址,只有这样才能解析从PE 的头部信息中找到导出表的位置。应该首先解析哪个DLL 呢?我们知道Kernel32.DLL几乎在所有的Win32 进程中都要被加载,其中包含了大部分常用的API,特别是其中的LoadLibrary 和GetProcAddress 两个API可以获取任意DLL 中导出的任意函数,在迄今为止的所有Windows 平台上都是如此。只要获取了Kernel32.DLL在进程中加载的基址,然后解析Kernel32.DLL 的导出表获取常用的API 地址,如需要可进一步使用Kernel32.DLL 中的LoadLibrary 和GetProcAddress 两个API 更简单地获取任意其他DLL 中导出函数的地址并进行调用。 - 上一页 [1] [2] [3] [4] [5] [6] 下一页
-
- 病毒编程技术之恶意代码的亲密接触 相关文章:
- ·梦幻西游盗号木马下载病毒并盗号
- ·木马病毒的启动方式介绍
- ·修改注册表权限加强对木马、病毒的防范
- ·recycle.exe病毒手动解决的方法
- ·木马病毒下载恶意程序
- ·警惕Trojan-PSW.Win32.WOW.ck木马病毒
- ·魔波病毒补丁下载
- ·Love Letter病毒源代码
- ·安全学习之制作编写超级批处理病毒方法
- ·反病毒知识:如何让你的移动硬盘在DOS下杀毒
- 病毒编程技术之恶意代码的亲密接触 相关软件
- ·USBKiller(U盘病毒专杀工具) 2.3 Build0610
- ·数据病毒木马暴力杀灭天王 PowerRmv V1.0
- ·AntiPopVirus(流行病毒木马专杀工具) V1.1
- ·U盘病毒专杀工具-USBCleaner 6.0 Build 20080708
- ·超级巡警之U盘病毒免疫器V1.4 正式版
- ·Autorun病毒防御者 v2.3.1.125
- ·金山毒霸“魔鬼波”病毒专杀工具 V3.2
- ·冲击波病毒专杀工具包 V 1.0
- ·McAfee VirusScan SuperDAT(Engine + DAT) 5081 病毒码
- ·大蜘蛛Dr.Web杀毒软件病毒库升级包 2008.05.13
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
上一篇:编写QQ外挂插件的原理和方法
精品推荐
热点TOP10
- ·游戏外挂设计技术探讨
- ·编写QQ外挂插件的原理和方法
- ·GIF文件格式
- ·使用SAFEARRAY传送对象
- ·1.3.4 高级数据和信息系统与高级应用
- ·网络游戏外挂核心封包揭密
- ·Solaris 10 安装及SVC管理及X及Vmware及其它可能遇到的一些问题
- ·代码静态分析工具PC-LINT安装配置
- ·DirectDraw之C#入门攻略
- ·网游外挂编写完全攻略
- ·Spring让LOB数据操作变得简单易行
- ·开发WDM型的USB设备驱动程序
- ·利用表空间的备份快速恢复IBM DB2数据库
- ·Windows完成端口编程
- ·使用BHO定制你的IE浏览器
- ·Unix和Windows跨系统通讯编程
- ·CMMI 综述
- ·利用HOOK拦截封包原理
- ·简单对象访问协议(SOAP)初级指南
- ·使用串行化传送对象
