zjjmj2002 - 2007-2-28 9:58:00
看了这几次什么威金、熊猫烧香等病毒肆虐后,心中比较郁闷,说实在说这些病毒水平的确不高呀,都是采用改写注册表(而且是个土得不能再土的键值,呵呵)来实现自启动的,感染PE文件的方式更是让人笑掉大牙(拜托先学习一下PE文件头、内存重定位、查找API地址后再编PE病毒吧),本来杀毒软件是可以发现并报警的,但问题是狡猾的病毒在运行时已经把杀毒软件Kill了,于是俺闲着没事编了个程序来保护一下杀毒软件不被杀,原理也很简单,就是HOOK了kernel32.dll中的TerminateProcess函数,抛砖引玉,高手莫笑哈!以下是源代码!masm32编译成一个DLL文件!自已编个文件调用也可,用Rundll32.exe dll.dll,InstallHook调动也可。俺的程序没法上传,打包成了zip文件传在另一处,呵呵。目前仅支持Xp,不支持9X哈。
附件地址:http://b.py99.net/zip/f?v=20072/28945164.zip
.586
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
HOOKAPI struct
a byte ?
PMyapi DWORD ?
d BYTE ?
e BYTE ?
HOOKAPI ends
WriteApi proto :DWORD ,:DWORD,:DWORD,:DWORD
MyAPI proto :DWORD ,:DWORD
GetApi proto :DWORD,:DWORD
.data
hInstance dd 0
WProcess dd 0
hacker HOOKAPI <>
CommandLine LPSTR ?
Papi1 DWORD ?
Myapi1 DWORD ?
ApiBak1 db 10 dup(?)
DllName1 db "kernel32.dll",0
ApiName1 db "TerminateProcess",0
mdb db "下面的程序妄图终止别的进程,要保持阻止吗?",0
.data?
hHook dd ?
hWnd dd ?
.code
DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD
.if reason==DLL_PROCESS_ATTACH
push hInst
pop hInstance
invoke GetCommandLine
mov CommandLine,eax
mov hacker.a,0B8h ;mov eax,
;mov hacker.d PMyapi ;0x000000
mov hacker.d,0FFh ;jmp
mov hacker.e, 0E0h ;eax
invoke GetCurrentProcess ;取进程伪句柄
mov WProcess ,eax
invoke GetApi,addr DllName1,addr ApiName1 ;取API地址
mov Papi1,eax ;保存API地址
invoke ReadProcessMemory,WProcess,Papi1,addr ApiBak1,8,NULL ;备份原API的前8字节
mov hacker.PMyapi,offset MyAPI ;0x0000,这里设置替代API的函数地址
invoke WriteApi,WProcess,Papi1, addr hacker ,size HOOKAPI ;HOOK API
.endif
.if reason==DLL_PROCESS_DETACH
invoke WriteApi,WProcess,Papi1, addr ApiBak1 ,8 ;还原API
.endif
mov eax,TRUE
ret
DllEntry Endp
GetMsgProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
invoke CallNextHookEx,hHook,nCode,wParam,lParam
mov eax,TRUE
ret
GetMsgProc endp
InstallHook proc
invoke SetWindowsHookEx,WH_GETMESSAGE,addr GetMsgProc,hInstance,NULL
invoke WriteApi,WProcess,Papi1, addr hacker ,sizeof HOOKAPI
mov hHook,eax
ret
InstallHook endp
UninstallHook proc
invoke UnhookWindowsHookEx,hHook
invoke WriteApi,WProcess,Papi1, addr ApiBak1 ,8
ret
UninstallHook endp
GetApi proc DllNameAddress:DWORD,ApiNameAddress:DWORD
invoke GetModuleHandle,DllNameAddress ;取DLL模块句柄
.if eax==NULL
invoke LoadLibrary ,DllNameAddress ;加载DLL
.endif
invoke GetProcAddress,eax,ApiNameAddress ;取API地址
mov eax,eax
ret
GetApi endp
WriteApi proc Process:DWORD ,Papi:DWORD,Ptype:DWORD,Psize:DWORD
LOCAL mbi:MEMORY_BASIC_INFORMATION
LOCAL msize:DWORD
;返回页面虚拟信息
invoke VirtualQueryEx,Process, Papi,addr mbi,SIZEOF MEMORY_BASIC_INFORMATION
;修改为可读写模式
invoke VirtualProtectEx,Process, mbi.BaseAddress,8h,PAGE_EXECUTE_READWRITE,addr mbi.Protect
;开始写内存
invoke WriteProcessMemory,Process, Papi, Ptype,Psize ,NULL
PUSH eax
;改回只读模式
invoke VirtualProtectEx,Process,mbi.BaseAddress,8h,PAGE_EXECUTE_READ,addr mbi.Protect
pop eax
ret
WriteApi endp
;替代的API,参数要和原来一样
MyAPI proc dwa:DWORD , dwb:DWORD
invoke MessageBox, NULL, CommandLine, addr mdb, MB_YESNO ;弹出信息框选择是否阻止
.if eax==7 ;如果选择否
invoke WriteApi,WProcess,Papi1, addr ApiBak1 ,8 ;先还原API
invoke TerminateProcess, dwa, dwb ;再调用API
invoke WriteApi,WProcess,Papi1, addr hacker ,sizeof HOOKAPI ;调用完后再改回来
.endif
mov eax,TRUE
ret
MyAPI endp
End DllEntry
姑苏残月 - 2007-2-28 10:00:00
看不懂,我沉默
logicl - 2007-2-28 10:01:00
看不懂..高手来指点一下..关注..
奇迹天下 - 2007-2-28 10:28:00
用C写的?
直接用SSM把瑞星的进程添加一条规则保护起来不就可以了嘛...
SSM有保护进程不被挂起,保护进程不被中止等等功能
相信稳定性和安全性比楼主写的要好很多
jieqiunan - 2007-2-28 10:29:00
顶下...
路过.....
我不怎么懂!~~~~.....
呵呵!~
afkp4e7 - 2007-2-28 10:36:00
路过
羡慕
天天寻龙 - 2007-2-28 10:41:00
路过,看不懂啊,只有羡慕了啊!@!
凝逸飘飞 - 2007-2-28 11:49:00
凝逸杀毒
503165656.ys168点com
TM群:24874517
功能:
1.清除程序文件中的病毒!没有杀在运行中的病毒!
清除:威金,熊猫烧香,金猪(Worm.Nimaya.cb),Worm.Delf.bg,Worm.Death.c,未知木马,未知病毒
[病毒样本库]
未知木马
未知病毒
威金
熊猫烧香
金猪(Worm.Nimaya.cb)
Worm.Delf.bg
Trojan.Inject.st
Worm.Death.c+
Worm.Delf.dy+
杀不了的病毒样本,请压缩后发到[503165656@qq.com]
zjjmj2002 - 2007-2-28 11:52:00
不是用C编的,用的汇编,开发工具为MASM32。
程序先修改Kernel32.dll的TerminateProcess函数前八位字节,jmp到MyApi子程序,通过这个原理来HookApi函数的!
奇迹天下 - 2007-2-28 11:54:00
不好意思,还没学到汇编
看着和C有点像....||
有空研究下SSM,觉得真的很有用
大怪怪框框 - 2007-2-28 11:54:00
羡慕死楼主了..
zjjmj2002 - 2007-2-28 15:03:00
SSM是System Safety Monitor吧?
还可以,不过Hook了太多的Api,实在是很拖速度呀!
俺其实很少用杀毒软件,有Ghost这样的好东西不就够了么,呵呵。
zjjmj2002 - 2007-2-28 16:57:00
为什么这个论坛不允许上传zip文件,怕俺们上传一个ASP木马的说?
奇迹天下 - 2007-2-28 17:06:00
何止啊
练多后缀都不行!
上传个1.1.jpg也不行
hongmeisu - 2007-2-28 17:06:00
搂主厉害,要能改进一下,多HOOK几个函数防止病毒修改注册表修改和改写exe\dll文件就更完美了,没有杀毒也不怕熊猫
奇迹天下 - 2007-2-28 17:12:00
汇编执行起来效率很高的,如果能编写的好,当然很不错的
zjjmj2002 - 2007-2-28 17:14:00
不行的,很多合法程序都会调用RegOpenKeyEx,CreateFile等函数,如果全部HOOK了,用户会被不停出现的提示对话框烦死的!想想SSM、瑞星不停弹出的对话吧,呵呵。
桃子CiCi - 2007-2-28 17:19:00
汇编.写的
果然强大啊
学习了
zjjmj2002 - 2007-2-28 17:20:00
俺倒认为远程注入CreateRemoteThread()函数除了病毒、木马会用一下,别的程序似乎都没有用过,真不知道是拿来做什么的?
196TSV - 2007-2-28 17:23:00
很好,尤其对于俺们这些菜鸟,但不知不点停止点退出后能否保护。
196TSV - 2007-2-28 17:32:00
能否升级一下,开机自动启动,期待…………另外这种好帖,斑竹怎么不关注一下呢?
zjjmj2002 - 2007-2-28 17:54:00
退出后就不能保护了,要自动启动你放到启动组里不就可以了么?
俺总觉得改注册表不绿色呀,呵呵!
hongmeisu - 2007-2-28 18:21:00
可以只防止exe和dll的改写,平时这类文件只是在安装软件或升级时才会写入,做两个选项能禁止和打开,不用都弹出窗口,有个Winpooch可以办到,可能功能多复杂了,不稳定,你可以写的比它简单点,呵呵
UFO不幸外人 - 2007-2-28 18:25:00
| 引用: |
【hongmeisu的贴子】搂主厉害,要能改进一下,多HOOK几个函数防止病毒修改注册表修改和改写exe\dll文件就更完美了,没有杀毒也不怕熊猫 ……………… |
所有计算机文件都用不了了
很多文件都要执行这个操作
闪电风暴 - 2007-2-28 18:28:00
这种方法不太管用的.恶意程序可以直接调用 ntdll.dll转ntoskrnl中的NtTerminateProcess或者PspTerminateProcess,最简单的.来一个QueueUserAPC就可以结束杀毒软件
您采用的User Level由于要反复挂钩和解钩.好像会导致线程同步问题
其实偶写的KsIceProcess也可以实现这个功能(签名里有下载,不过用的是修改导入表).不过Ring3的HookAPI总是不尽如人意.因而只能唬弄简单的木马.唉,偶还得努力啊.
闪电风暴 - 2007-2-28 18:29:00
或者一个命令行:ntsd.exe -c q -p就可以结束
问题是太部分杀毒软件都有保护不被TerminateProcess终止的功能。依然被终止
闪电风暴 - 2007-2-28 18:37:00
| 引用: |
【zjjmj2002的贴子】SSM是System Safety Monitor吧?
还可以,不过Hook了太多的Api,实在是很拖速度呀!
俺其实很少用杀毒软件,有Ghost这样的好东西不就够了么,呵呵。 ……………… |
SSM不是HookApi,而是Hook SSDT,SSDT是系统服务派遣表,所有API的最终调用都是这里.
熊猫烧香可以让你觉得Ghost也有致命弱点的
闪电风暴 - 2007-2-28 18:43:00
| 引用: |
【zjjmj2002的贴子】俺倒认为远程注入CreateRemoteThread()函数除了病毒、木马会用一下,别的程序似乎都没有用过,真不知道是拿来做什么的? ……………… |
那可不一定.比如有的安全软件要卸除系统进程中的恶意DLL,大部分要用到
VirtualAllocEx()申请内存空间.
WriteProcessMemory()写内存空间.
用CreateRemoteThread(),FreeLibrary作为线程函数,卸除DLL.
IceSword 对于进程中的DLL,"卸除"就是差不多利用这个原理的.(当前也可能是APC,"强制卸除"是另一种卸除方法)
zjjmj2002 - 2007-2-28 19:57:00
熊猫烧香会删除*.gho文件嘛,不过俺早就改了名了,呵呵。
而且那种把文件名第一个字节改为E5的简单删除方法对于俺来说根没有删除完全一样!
zjjmj2002 - 2007-2-28 20:02:00
修改导入表HookApi的办法Jeffrey Richter在《Windows核心编程》中曾提到过,但感觉容易出错代码量也很大,俺很少使用!
© 2000 - 2026 Rising Corp. Ltd.