| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5394 人关注过本帖
标题:注入远程进程,再HOOK键盘。超细注释!
只看楼主 加入收藏
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
结帖率:54.55%
收藏
已结贴  问题点数:0 回复次数:10 
注入远程进程,再HOOK键盘。超细注释!
程序代码:
看到了注入这里。做个练习。

[code]; ml /c /coff ServerDll.asm
; rc ServerDll.rc
; Link  /subsystem:windows /section:.bss,S /Def:ServerDll.def /Dll ServerDll.obj ServerDll.res
;by onepc 153785587
;注入练习
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .386
        .model flat, stdcall
        option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib
include        Advapi32.inc
includelib    Advapi32.lib ;注册表

include ServerDll.inc
includelib ServerDll.lib ;调用自己的HOOK函数


KBDLLHOOKSTRUCT STRUCT
vKcode DWORD ??
scanCode DWORD ??
flags DWORD ??
time DWORD ??
dwExtraInfo DWORD ??
KBDLLHOOKSTRUCT ENDS


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IDD_TEST_DIALOG      equ           102
IDR_MAINFRAME        equ           128
IDC_BUTTON1          equ           1000
IDC_BUTTON2          equ           1001
IDC_EDIT1            equ           1002

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.data?
hInstance    dd    ?
hMain    dd    ?
szTextBuffer db MAX_PATH dup (?)
hHook dd ?   ;钩子句柄
.const
szZhuYe db 'http://www.baidu.com/index.php?tn=onepc_pg',0
;HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main
szRegMain db 'Software\Microsoft\Internet Explorer\Main',0
szRegName db 'Start Page',0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;****************************************************************
;****************************************************************
;****************************************************************
_CALLBACKHOOK proc _dwCode,_wParam,_lParam ;钩子过程 
     .if _dwCode==HC_ACTION   ;有键盘/鼠标消息时处理
        .if (_wParam == WM_KEYDOWN) || (_wParam == WM_SYSKEYDOWN)
            mov edx,_lParam
            assume edx:PTR KBDLLHOOKSTRUCT
            .if ([edx].vKcode == VK_F10)    
                  invoke IsWindowVisible,hMain
                     
                      .if eax
                         invoke ShowWindow,hMain,SW_HIDE
                      .else
                           invoke ShowWindow,hMain,SW_NORMAL
                     .endif
                  
                  assume edx:nothing
                  mov eax,TRUE
                  ret                             
            .endif
        .endif
    .endif
    invoke CallNextHookEx,hHook,_dwCode,_wParam,_lParam ;其他键放到下一个钩子
    assume edx:nothing
    ret
_CALLBACKHOOK endp



_INSTALLHOOK proc     ;安装钩子
invoke SetWindowsHookEx,WH_KEYBOARD_LL,addr _CALLBACKHOOK,hInstance,NULL  ;全局钩子
mov hHook,eax   ;保存钩子
ret
_INSTALLHOOK endp


_UNINSTALLHOOK proc   ;卸载钩子
invoke UnhookWindowsHookEx,hHook  ;卸载钩子
ret
_UNINSTALLHOOK endp
;****************************************************************
;****************************************************************
;****************************************************************

;设置主页
_SetRegMain proc
         local @hRegKey,@dwMainsize
         
     invoke GetDlgItemText,hMain,IDC_EDIT1,offset szTextBuffer,MAX_PATH  ;取文本
     invoke lstrlen,offset szTextBuffer ;计算长度 
     mov @dwMainsize,eax
     invoke RegCreateKeyEx, HKEY_CURRENT_USER ,offset szRegMain,NULL,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,addr @hRegKey,NULL
     invoke RegSetValueEx,@hRegKey,offset szRegName,NULL,REG_SZ,offset szTextBuffer,@dwMainsize
     invoke RegCloseKey,@hRegKey
ret
_SetRegMain endp



;;对话框回调过程
_DlgProc proc uses esi edi ebx hDlg,uMsg,wParam,lParam
.if uMsg==WM_INITDIALOG   ;对话框初始化
    push hDlg
    pop hMain
    invoke LoadIcon,hInstance,IDR_MAINFRAME
    invoke    SendMessage,hDlg,WM_SETICON,ICON_BIG,eax
    invoke SetDlgItemText,hDlg,IDC_EDIT1,offset szZhuYe
    
    invoke _INSTALLHOOK  ;安装
    
.elseif uMsg==WM_COMMAND
    mov eax,wParam
    .if ax==IDC_BUTTON1
      call _SetRegMain
    .endif
    
    .if ax==IDC_BUTTON2
      invoke _UNINSTALLHOOK
      invoke EndDialog,hDlg,FALSE
      
    .endif
.elseif uMsg==WM_CLOSE
   invoke _UNINSTALLHOOK
    invoke EndDialog,hDlg,FALSE

.else
    mov eax,FALSE
    ret
.endif
mov eax,TRUE
ret
_DlgProc endp
;;对话框回调过程





_CreateDialog proc
invoke DialogBoxParam,hInstance,IDD_TEST_DIALOG,NULL,addr _DlgProc,NULL
ret
_CreateDialog endp



;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DllEntry    proc    _hInstance,_dwReason,_dwReserved
        local    @dwThreadID

        .if    _dwReason == DLL_PROCESS_ATTACH ;表示动态链接库刚被映射到某个进程的地址空间,返回TRUE表示初始化成功 
            ;返回FALSE表示初始化出错,这样库的装入就会失败
            push    _hInstance
            pop    hInstance
            invoke    CreateThread,NULL,0,offset _CreateDialog,NULL,\
                NULL,addr @dwThreadID ;装入时建一个线程创建对话框
            invoke    CloseHandle,eax
        .endif
        mov    eax,TRUE
        ret

DllEntry    Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
End    DllEntry



ServerDll.def
EXPORTS
        _INSTALLHOOK
        _UNINSTALLHOOK

ServerDll.inc
_INSTALLHOOK proto
_UNINSTALLHOOK proto





加载程序

程序代码:
;注入练习
;by onepc 153785587
.386
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
include kernel32.inc
;include gdi32.inc  ;图形

includelib user32.lib
includelib kernel32.lib
;includelib gde32.lib

include advapi32.inc
includelib advapi32.lib ;提权
include psapi.inc
includelib psapi.lib;快照

include macro.asm  ;ctxt("")


.data

szKernel    db    'Kernel32.dll',0
szLoadLibrary    db    'LoadLibraryA',0
szDll        db    '\ServerDll.dll',0

szExplorer db 'EXPLORER.EXE',0 ;explorer.exe在注入的进程

szPrivilegeName      db 'SeDebugPrivilege',0   ;SeDebugPrivilege权限可以关闭服务进程
;通过设置正在运行的进程 SeDebugPrivilege 权限,
;您可以获取任何正在运行的应用程序进程句柄。
;获取进程句柄时, 可以指定 PROCESS_ALL_ACCESS 
;标志将允许可以正常情况下不执行该进程句柄时的各种 Win 32 API 的调用

.data?
hInstance dd ?  ;模块句柄
lpLoadLibrary dd ? ;LoadLibraryA的地址
lpProcessMem dd ? ;指向申请到的线性地址

szDllFull db MAX_PATH dup (?) ;dll文件名


hSanp dd ?   ;快照句柄
stSanp PROCESSENTRY32 <?>  ;快照的结构

hProcess dd ? ;explorer.exe的进程句柄

.const

.code

;********************************************************************
; 提升权限 start
;********************************************************************
_SeDebugPrivilege proc
       local @stTkp:TOKEN_PRIVILEGES,@stLuid:LUID
       local @hToKen;:DWORD
     invoke GetCurrentProcess  ;GetCurrentProcess得到得到的称之为"伪句柄"只是一个标识,你可以发现,其实就是返回$FFFFFFFF
    ;每个进程得句柄都是一样得,只是实用于进程内部得使用.
    ;如果你想得到实际得句柄,在进程间进行通讯,必需要进行转化,
    ;调用DuplicateHandle,注意,得实句柄使用完成以后,你必须要调用CloseHandle去关闭.
    ;其实,你应该明白了为何"伪句柄"得存在,就是使用简单,不用关闭,
    ;不会造成内存泄漏.
    mov ecx,eax  ;直接用eax会出现register value overwritten by INVOKE
    invoke OpenProcessToken,ecx,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,addr @hToKen
    ;.if !eax  ;返回0则表示出错
    ;   invoke MessageBox,NULL,CTXT("获取访问令牌句柄失败!"),CTXT("出错"),0
    ;   ret
    ;.endif
        
    ;invoke LookupPrivilegeValue,NULL,addr szPrivilegeName, addr @stTkp.Privileges[0].Luid
    invoke LookupPrivilegeValue,NULL,addr szPrivilegeName, addr @stLuid
    ;.if !eax
    ;   invoke MessageBox,NULL,CTXT("获取当前进程权限失败!"),CTXT("出错"),0
    ;  ret
    ;.endif  
    ;这些函数用在NT以上的系统,也可以在之前判断本系统是否是NT以上的系统。
    ;第一个参数表示所要查看的系统,本地系统直接用NULL 
    ;第二个参数表示所要查看的特权信息的名称,定义在winnt.h中
    ;第三个参数用来接收所返回的制定特权名称的信息。
    mov @stTkp.PrivilegeCount,1
    ;***********************************************
    ;invoke LookupPrivilegeValue,NULL,addr szPrivilegeName, addr @stTkp.Privileges[0].Luid
    ;用这个,下面这个push可以不要。因为直接已把特权信息放到@stTkp.Privileges[0].Luid中。
    PUSH    @stLuid.LowPart
    POP    @stTkp.Privileges[0].Luid.LowPart
    PUSH    @stLuid.HighPart
    POP    @stTkp.Privileges[0].Luid.HighPart
    ;***********************************************
    MOV    @stTkp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
   
    invoke AdjustTokenPrivileges,@hToKen,FALSE, addr @stTkp,sizeof TOKEN_PRIVILEGES,NULL,NULL 
    ;.if !eax
    ;   invoke MessageBox,NULL,CTXT("提升访问令牌权限失败!"),CTXT("出错"),0
    ;   ret
    ;.endif
    
    
    invoke CloseHandle,@hToKen
    ;invoke MessageBox,NULL,CTXT("权限已提升"),CTXT("OK"),0
ret
_SeDebugPrivilege endp
;********************************************************************
; 提升权限  end
;********************************************************************



;********************************************************************
;获取dll的全路径文件名、获取LoadLibrary函数地址
;********************************************************************
_DllPath proc
        invoke    GetCurrentDirectory,MAX_PATH,addr szDllFull ;程序当前目录
        invoke    lstrcat,addr szDllFull,addr szDll ;现在是全路径了
        invoke    GetModuleHandle,addr szKernel ;得到Kernel32.dll的模块句柄
        invoke    GetProcAddress,eax,offset szLoadLibrary ;从Kernel32.dll里得到LoadLibraryA的函数地址
        mov    lpLoadLibrary,eax
        ret
_DllPath endp
;********************************************************************
; 获取dll的全路径文件名、获取LoadLibrary函数地址
;********************************************************************





;********************************************************************
;进程列举 Explorer.exe进程句柄打开及注入dll
;********************************************************************
_ProcessListInDll proc
mov stSanp.dwSize,sizeof stSanp  ;使用结构之前,要先设置大小
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,NULL ;得到当前的系统进程快照
mov hSanp,eax  ;快照句柄传给hSanp   Process32First
invoke Process32First,hSanp,addr stSanp   ;首次从快照得到一个进程信息
.while eax
invoke CharUpper,addr stSanp.szExeFile ;把程序名转为大写
invoke lstrcmp,addr szExplorer,addr stSanp.szExeFile   ;lstrcmp 两字符串比较。区分大小写,相等则返回0
 .if !eax ;相等
     invoke OpenProcess,PROCESS_ALL_ACCESS, FALSE,stSanp.th32ProcessID
        .if eax
            mov hProcess,eax ;找到一个Explorer.exe进程句柄就退出枚举
            ;*******************************************************
            invoke    VirtualAllocEx,hProcess,NULL,MAX_PATH,MEM_COMMIT,PAGE_READWRITE  ;从explorer.exe进程的线性地址中申请内存 若申请成功则返回指向申请到的内存的地址
               .if eax
                   mov lpProcessMem,eax
                   invoke    WriteProcessMemory,hProcess,lpProcessMem,offset szDllFull,MAX_PATH,NULL ;在explorer.exe申请到的地址里写入dll的文件路径
                   invoke    CreateRemoteThread,hProcess,NULL,0,lpLoadLibrary,lpProcessMem,0,NULL
                   ;在倒数第三个参数中表示的是dll的文件名,即创建的线程是,用LoadLibraryA函数加载DLL文件
                       invoke    CloseHandle,eax
               .endif
            ;*******************************************************
           invoke CloseHandle,hProcess
           invoke CloseHandle,hSanp
           ret
        .endif
 .endif
invoke  Process32Next,hSanp,addr stSanp  ;用Process32Next循环从快照取得进程信息,直到取完进程,然后返回flase 从而退出
.endw
invoke CloseHandle,hSanp ;关闭快照句柄
ret
_ProcessListInDll endp
;********************************************************************
;进程列举 Explorer.exe进程句柄打开及注入dll
;********************************************************************


start:
invoke GetModuleHandle,NULL
mov hInstance,eax
;invoke ExitWindowsEx,EWX_REBOOT,0
;.if !eax
;  invoke MessageBox,NULL,CTXT("失败"),CTXT("OK"),0
;.endif
call _SeDebugPrivilege  ;提升权限
call _DllPath  ;取得dll文件名及LoadLibraryA函数地址
call _ProcessListInDll ;在远程进程注入DLL文件并创建线程


invoke ExitProcess,NULL

end start


资源.rc

#include "resource.h"

#define IDD_TEST_DIALOG                 102
#define IDR_MAINFRAME                   128
#define IDC_BUTTON1                     1000
#define IDC_BUTTON2                     1001
#define IDC_EDIT1                       1002


IDR_MAINFRAME           ICON    DISCARDABLE     "test.ico"

IDD_TEST_DIALOG DIALOGEX 0, 0, 259, 185
STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE |
    WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "32ASM - 注入Test"
FONT 9, "宋体"
BEGIN
    PUSHBUTTON      "OK",IDC_BUTTON1,65,148,50,14
    PUSHBUTTON      "EXIT",IDC_BUTTON2,132,148,50,14
    EDITTEXT        IDC_EDIT1,49,43,193,14,ES_AUTOHSCROLL
    LTEXT           "主页:",IDC_STATIC,27,47,25,8
END

[/code]
收到的鲜花
  • zklhp2009-10-13 12:38 送鲜花  50朵   附言:我很赞同
搜索更多相关主题的帖子: 超细 键盘 进程 HOOK 注释 
2009-10-13 10:50
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:6 
支持  最好把代码打个包上传 看着方便~
2009-10-13 12:38
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
收藏
得分:0 
注入.rar (8.87 KB)
2009-10-13 16:22
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:8 
写得不错,条理挺清晰的。

如果能把注入内存的回收,注入主程序与被注入DLL的通讯再有一个完备的考虑。就可以作为一个‘游戏外挂’模版了。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-10-13 18:06
knight2010
Rank: 1
等 级:新手上路
帖 子:1
专家分:6
注 册:2009-10-16
收藏
得分:6 
怎么下下来提示的是病毒呢
2009-10-16 09:35
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
收藏
得分:0 
其实是没毒的。
2009-10-16 09:49
er124585
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-8-17
收藏
得分:0 
下来学习下,感谢楼主
2009-11-30 16:07
zd零
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2009-12-22
收藏
得分:0 
钩子回调函数,那是个什么结构啊,还有您的钩子类型WH_KEYBOARD_LL 与 WH_KEYBOARD 有什么区别啊??
2009-12-22 14:00
zxdg888
Rank: 2
等 级:论坛游民
帖 子:55
专家分:21
注 册:2011-8-15
收藏
得分:0 
这个帅呆了   我新在是新手,就学一个汇编基础  练Win32都没看那
2011-11-03 12:55
geekcat
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2008-11-15
收藏
得分:0 
很好
学习了
2014-07-27 19:49
快速回复:注入远程进程,再HOOK键盘。超细注释!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033848 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved