瑞星卡卡安全论坛

首页 » 技术交流区 » 反病毒/反流氓软件论坛 » 编了一个保护杀毒软件的程序
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核心编程》中曾提到过,但感觉容易出错代码量也很大,俺很少使用!
12
查看完整版本: 编了一个保护杀毒软件的程序