注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

Win32汇编实现DLL的远程注入及卸载  

2011-10-15 22:36:38|  分类: Win32汇编写病毒 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

(声明:魏滔序原创,转贴请注明出处。)
        所谓DLL远程注入,就是强迫DLL程序运行在其他进程中,这样做的目的无非有两种:第一是伪装自身,第二是控制宿主。前者常见于病毒或木马,后者则一般用于正规之场合,比如常见的输入法、外挂等等,有时Hook(钩子)也用到该技术。由此可见,技术是把双刃剑,区别在于使用技术的人。

DLL远程注入的方法一般有如下几种:
1.修改注册表,系统启动时自动加载。当然,如果卸载就要关闭系统了,或者使用本文的卸载功能。
2.使用SetWindowsHookEx进行注入,该参数最后一个参数值决定注入的全局与否。
3.BHO,这个没什么可说的,仅局限与浏览器。
4.使用CreateRemoteThread进行注入,也就是本文的主要内容。

注入过程大致是:
1.打开目标进程。
2.在目标进程中申请一块内存,用来存放要注入的dll名称。
3.将dll名称写入该内存。
4.获得LoadLibraryA函数的地址,该函数在任何进程中的地址都相同。
5.创建远程线程,也就是执行LoadLibraryA函数了。当然LoadLibraryA的参数就是上面保存的dll名称。
6.等待线程返回
        到此为止,dll已经被成功在远程进程中运行了,至于运行后该如何工作,那就发挥你无穷的想像力吧。卸载过程与注入过程雷同,只是区别于后面使用了FreeLibrary函数进行卸载。注意,FreeLibrary函数只能传入模块的句柄,可使用GetModuleHandleA函数获得。

源码奉上:

 ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 ; Win32汇编实现DLL的远程注入及卸载  
 ; Programmed by 魏滔序                  
 ; WebSite: http:
//www.chenoe.com        
 ; Blog: http:
//blog.csdn.net/Modest         
 ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  
    .
486            ;   create   32   bit   code 
    .model    flat,    stdcall    ;   
32   bit   memory   model 
    
option    casemap    :none    ;   case   sensitive 
    
    include    windows.inc 
    include    kernel32.inc 
    includelib kernel32.lib 
    
    RemoteInjectModule    PROTO :DWORD,:DWORD
    RemoteUnloadModule    PROTO :DWORD,:DWORD
.data 
    szKernel32     db 
'Kernel32',0
    szGetModuleHandleA db 'GetModuleHandleA',0
    szLoadLibraryA    db 'LoadLibraryA',0
    szFreeLibrary    db 'FreeLibrary',0
.code 

Start:
    
RemoteInjectModule proc dwProcID,pszModule
    LOCAL    hProcess, hThread, dwExitCode
    LOCAL    pszBuffer,pdwAddress
    
    Invoke    OpenProcess,PROCESS_QUERY_INFORMATION 
Or PROCESS_CREATE_THREAD Or PROCESS_VM_OPERATION Or PROCESS_VM_WRITE, 0, dwProcID
    MOV    hProcess,EAX
    .If     hProcess 
== 0
        JMP ErrHandle
    .Endif
    
    Invoke    VirtualAllocEx,hProcess, 
0, MAX_PATH, MEM_COMMIT, PAGE_READWRITE
    MOV    pszBuffer,EAX
    .If     pszBuffer 
== 0 
        JMP ErrHandle
    .Endif
    
    Invoke    WriteProcessMemory,hProcess, pszBuffer, pszModule, MAX_PATH, 
0
    .If     EAX 
== 0
        JMP ErrHandle
    .Endif
    
    Invoke    GetModuleHandle,addr szKernel32
    Invoke    GetProcAddress,EAX, addr szLoadLibraryA
    MOV    pdwAddress,EAX
    .If     pdwAddress 
== 0
        JMP ErrHandle
    .Endif
    
    Invoke    CreateRemoteThread,hProcess, 
0,0, pdwAddress, pszBuffer, 00
    MOV    hThread,EAX
    .If     hThread 
== 0
        JMP ErrHandle
    .Endif
    
    Invoke    WaitForSingleObject,hThread, INFINITE
    Invoke    GetExitCodeThread,hThread,addr dwExitCode
    .If     dwExitCode !
= 0
        Invoke    VirtualFreeEx, hProcess, pszBuffer, 
0, MEM_RELEASE
        Invoke    CloseHandle,hProcess
        MOV    EAX,
1
    .else
        MOV    EAX,
0
    .endif
    
    RET
    
ErrHandle:
    .If     pszBuffer !
= 0
        Invoke    VirtualFreeEx, hProcess, pszBuffer, 
0, MEM_RELEASE
    .Endif
    
    .If     hThread !
= 0
        Invoke    CloseHandle, hThread
    .Endif
    
    .If     hProcess !
= 0
        Invoke    CloseHandle,hProcess
    .Endif
    
    MOV    EAX,
0
    RET
RemoteInjectModule endp 
    
RemoteUnloadModule proc dwProcID,pszModule
    LOCAL    hProcess, hThread, dwExitCode
    LOCAL    pszBuffer,pdwAddress
    
    Invoke    OpenProcess,PROCESS_QUERY_INFORMATION 
Or PROCESS_CREATE_THREAD Or PROCESS_VM_OPERATION Or PROCESS_VM_WRITE, 0, dwProcID
    MOV    hProcess,EAX
    .If     hProcess 
== 0
        JMP ErrHandle
    .Endif
    
    Invoke    VirtualAllocEx,hProcess, 
0, MAX_PATH, MEM_COMMIT, PAGE_READWRITE
    MOV    pszBuffer,EAX
    .If     pszBuffer 
== 0
        JMP ErrHandle
    .Endif
    
    Invoke    WriteProcessMemory,hProcess, pszBuffer, pszModule, MAX_PATH, 
0
    .If     EAX
==0
        JMP ErrHandle
    .Endif
    
    Invoke    GetModuleHandle,addr szKernel32
    Invoke    GetProcAddress,EAX, addr szGetModuleHandleA
    MOV    pdwAddress,EAX
    .If     pdwAddress 
== 0
        JMP ErrHandle
    .Endif
    
    Invoke    CreateRemoteThread,hProcess, 
00, pdwAddress, pszBuffer, 0,0
    MOV    hThread,EAX
    .If     hThread 
== 0
        JMP ErrHandle
    .Endif
    
    Invoke    WaitForSingleObject,hThread, INFINITE
    Invoke    GetExitCodeThread, hThread, addr dwExitCode
    

    
    Invoke    VirtualFreeEx, hProcess, pszBuffer, 
0, MEM_RELEASE
    Invoke    CloseHandle, hThread
    
    Invoke    GetModuleHandle,addr szKernel32
    Invoke    GetProcAddress,EAX, addr szFreeLibrary
    MOV    pdwAddress,EAX
    .If     pdwAddress 
== 0
        JMP ErrHandle
    .Endif
    
    Invoke    CreateRemoteThread,hProcess, 
00, pdwAddress, dwExitCode, 0,0
    MOV    hThread,EAX
    .If     hThread 
== 0
        JMP ErrHandle
    .Endif
    
    Invoke    WaitForSingleObject,hThread, INFINITE
    Invoke    GetExitCodeThread, hThread, addr dwExitCode
    .If     dwExitCode !
= 0
        Invoke    VirtualFreeEx, hProcess, pszBuffer, 
0, MEM_RELEASE
        Invoke    CloseHandle,hProcess
        MOV    EAX,
1
    .else
        MOV    EAX,
0
    .endif
    
    RET
    
ErrHandle:
    .If     pszBuffer !
= 0
        Invoke    VirtualFreeEx, hProcess, pszBuffer, 
0, MEM_RELEASE
    .Endif
    
    .If     hThread !
= 0
        Invoke    CloseHandle, hThread
    .Endif
    
    .If     hProcess !
= 0
        Invoke    CloseHandle,hProcess
    .Endif
    
    MOV    EAX,
0
    RET
RemoteUnloadModule endp

End   Start
  评论这张
 
阅读(180)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017