看雪论坛
发新帖

[源码学习] [推荐]汇编实现注入winlogon.exe屏蔽Ctrl+Alt+Del 附lib库 源码和例子

寒晨 2009-5-4 15:58 16860
不敢说原创 消化了某位牛人的代码 写的lib库
主要代码如下
_injection:							;注入部分的代码
        call @F
        szwindowtext     db 'SAS window',0
        @@:
        call @F
        szclass            db 'SAS Window class',0
        @@:
        db 0B8h
        _FindWindow     dd 0
        call eax                 ;查找窗口
        call Local1
        Local1:
        add dword ptr[esp],offset LocalX-offset Local1   ;NewSASProc
        push GWL_WNDPROC
        push eax
        db 0B8h
        _SetWindowLong  dd 0     ;修改窗口处理地址,让我们的代码接管
        call eax
        push eax
        call @F
        OldSASPro    dd 0
        @@:
        pop eax
        pop [eax]
        push 0
        db 0b8h
        _ExitThread     dd 0
        call eax
        LocalX:    
;-------------------------
;新的窗口处理函数
;-------------------------    
NewSASProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
     mov eax,uMsg
     .if  eax==WM_HOTKEY
          .if lParam==02E0003h     
               mov eax,0        ;屏蔽
          .endif
          comment  ~
          ;下面代码与上面代码等价
          mov eax,lParam
         push edx
         mov edx,VK_DELETE
         shl edx,10h
         mov dx,VK_CONTROL
         xor  dx,VK_ALT ;VK_ALT==12h
         cmp eax,edx
         jnz @F 
         mov eax,0
         @@:
         pop edx   ~
     .else
         push lParam
         push wParam
         push uMsg
         push hWin
         call  @F
         @@:
         pop eax
         sub eax,03Eh       ;OldSASPro
         push [eax]
         db        0B8h                     
         _CallWindowProc    dd      0  
         call        EAX
     .endif
     ret
NewSASProc endp
injection_size    equ        $-_injection		;定义注入代码的长度
_KillHotKey		proc
     invoke LoadLibrary,addr szkernel32
     invoke GetProcAddress,eax,addr szExitThread
     mov _ExitThread,eax
     invoke LoadLibrary,addr szuser32
     mov szUserBase,eax
     invoke GetProcAddress,eax,addr szSetWindowLong    
     mov _SetWindowLong,eax
     invoke GetProcAddress,szUserBase,addr szFindWindow
     mov _FindWindow,eax
     invoke GetProcAddress,szUserBase,addr szCallWindowProc
     mov _CallWindowProc,eax
     call _EnableDebugPrivilege						;为我们的进程提升权限准备注入
     invoke    CreateToolhelp32Snapshot, 2, 0		;为所有进程建立一个快照
     mov    hSnapshot, eax
     mov    uProcess.dwSize, sizeof uProcess
     invoke    Process32First, hSnapshot, ADDR uProcess    
     mov    hProcess, eax
     .while hProcess!=0 							;循环获取进程句柄
        lea eax,uProcess.szExeFile
        invoke lstrcmp,addr szWinlogon,eax            ;查找文件名为winlogon.exe的程序
        jnz @F
        invoke  OpenProcess, PROCESS_ALL_ACCESS, NULL,uProcess.th32ProcessID ;返回winlogon.exe进程句柄
        mov        ph, eax
        jmp skip
        @@:
        invoke    Process32Next, hSnapshot, ADDR uProcess     ;进行迭代查找winlogon.exe
        mov    hProcess, eax
     .endw
     skip:
     invoke    CloseHandle, hSnapshot
     invoke       VirtualAllocEx,ph,NULL,injection_size,\  
     				MEM_COMMIT,PAGE_EXECUTE_READWRITE 				;在winlogon.exe开辟一段内存空

间
     mov          injection_base, EAX
     invoke       WriteProcessMemory,ph,EAX,addr _injection,injection_size,NULL 	;_injection写入开辟的空间
     invoke       CreateRemoteThread,ph,NULL, 0,injection_base,NULL, 0, 0			;新空间创建线程调用	
     invoke     CloseHandle,ph
     ret
 _KillHotKey		endp

_EnableDebugPrivilege  proc				;提升权限的方法
    local  @hToken
    local  @tp:TOKEN_PRIVILEGES    ;结构数据组的每个项指明了权限的类型和要进行的操作
    szText SE_DEBUG_NAME_Y,"SeDebugPrivilege"
    invoke  GetCurrentProcess
    lea  ecx,@hToken
    invoke  OpenProcessToken,eax,TOKEN_ALL_ACCESS,ecx	;进行指定了写相关的访问权的OpenProcess操作
    mov  @tp.PrivilegeCount,1
    invoke  LookupPrivilegeValue,NULL,addr SE_DEBUG_NAME_Y,addr @tp.Privileges[0].Luid;得到一个权限对应的LUID值
    mov  @tp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
    invoke  AdjustTokenPrivileges,@hToken,FALSE,addr @tp,sizeof @tp,NULL,NULL  ;开始提升权限
    push  eax
    invoke  CloseHandle,@hToken
    pop  eax
    ret
_EnableDebugPrivilege  endp 


上面注释写的很清晰啦

这段代码重写了修改4个API的调用地址
SetWindowLongA
FindWindowA
CallWindowProcA
ExitThread
都是非常常见的函数
在里面插入NewSASProc 函数
实现屏蔽热键

由于本人基础不够扎实,所以注入部分只能依葫芦画瓢
这段代码只是实现屏蔽热键的功能,还有很多方法打开任务管理器
比如 任务栏右键
还有注入还没有办法实现解除。。。。。只能重启
等消化了注入部分的代码 争取写个
调用的话导入 LIB 和INC
导出函数是 _KillHotKey没有参数(貌似废话)
希望有路过的高手讲解一下注入部分

特别是
     .if  eax==WM_HOTKEY
          .if lParam==02E0003h
lParam怎么得到

反汇编的话也太BT了
有没有其他方法

菜鸟起飞  希望大家给点鼓励
上传的附件:
本主题帖已收到 0 次赞赏,累计¥0.00
最新回复 (14)
寒晨 2009-5-6 14:04
2
晕  管理员 吧我的贴弄那儿去了 除了搜索死也找不到帖子 这样的贴0回复太失望了。。。
可能是论坛里的牛人太多了 ,怎么说也要指点一下
自己顶
chengxjj 2009-5-7 14:41
3
帮你消灭0回复!
菜鸟乱飞 2009-5-7 15:22
4
更菜的菜鸟,学习中
6
loudy 2009-5-21 00:34
5
帮顶,值得看下
isbluefish 2009-5-21 01:09
6
顶并快乐着
kmlch 2009-5-21 09:50
7
谢谢。用ASM注入。
2
aa1ss2 2009-5-26 22:47
8
又看到这篇经典之作了,顺便发一下我以前改的一个样板
主要是增加了按ctrl+alt+end解除钩子的功能

.386
.model flat,stdcall
option casemap :none

include windows.inc
include kernel32.inc
include user32.inc
include advapi32.inc

includelib kernel32.lib
includelib  user32.lib
includelib advapi32.lib

NewSASProc PROTO    :HWND,:UINT,:WPARAM,:LPARAM
MyHotKeyId equ 11h
MyMessage equ 401h
szText MACRO Name, Text:VARARG
    LOCAL lbl
       jmp lbl
          Name db Text,0
      lbl:
    ENDM
.data

hProcess                dd 0
hSnapshot                dd 0
ph                    dd 0
hEvent                dd 0
szUserBase                dd 0
szKernelBase                dd 0
injection_base                    dd 0
dwSize                    dd 0
szkernel32                db 'kernel32.dll',0
szuser32                db 'user32.dll',0
szSetWindowLong                    db 'SetWindowLongA',0
szFindWindow                    db 'FindWindowA',0
szCallWindowProc                 db 'CallWindowProcA',0
szExitThread                    db 'ExitThread',0
szWinlogon                db 'winlogon.exe',0
szWinlogon2               db 'WINLOGON.EXE',0
szMessageBoxA                 db 'MessageBoxA',0
szRegisterHotKey         db 'RegisterHotKey', 0
szUnregisterHotKey         db 'UnregisterHotKey' ,0
szSendMessageA                 db 'SendMessageA' ,0
szCreateEventA                db 'CreateEventA' ,0
szCloseHandle                db 'CloseHandle' ,0
szWaitForSingleObject   db 'WaitForSingleObject', 0
szSetEvent                db 'SetEvent' ,0
szResetEvent                db 'ResetEvent' ,0
szSuccessful db '已成功卸载!',0
szFind db '发现钩子,是否从新加载?' ,0

uProcess    PROCESSENTRY32    <0>
szfname            db 0  dup(30h)

.code  
_injection:
         
        call @f
        _CallWindowProc    dd      0  
        _CloseHandle        dd 0
        _FindWindow     dd 0
        _CreateEventA dd 0
          _SetWindowLong  dd 0     
        _ExitThread     dd 0
        _SendMessageA dd 0
        _RegisterHotKey dd 0
        _UnregisterHotKey dd 0
        _MessageBoxA dd 0
        _WaitForSingleObject dd 0
        _SetEvent        dd 0
        _ResetEvent        dd 0
        _szEvent         db 'MyEvent' ,0
        szwindowtext     db 'SAS window',0
        szclass            db 'SAS Window class',0
        _MyEventHandle dd 0
        _WindowHandle dd 0
        _Edit                dd 0
        OldSASProc    dd 0
        @@:
        call @F
        @@:
        pop ebx
        sub ebx ,offset @B

        lea ecx , [ebx + offset szwindowtext]
        push ecx
        lea ecx , [ebx + offset szclass]
        push ecx
        call [ebx + _FindWindow]
        
        
        mov [ebx + _WindowHandle] ,eax
        lea ecx , [ebx + NewSASProc]
        push ecx
        push GWL_WNDPROC
        push eax
        call [ebx + _SetWindowLong]
        mov [ebx + OldSASProc] ,eax
        lea ecx , [ebx + offset _szEvent]
        push ecx
        push NULL
        push NULL
        push NULL
        call [ebx + _CreateEventA]
        mov [ebx + _MyEventHandle] ,eax
@Wait:
        push MyHotKeyId
        push NULL
        push MyMessage
        push [ebx + _WindowHandle]
        call [ebx + _SendMessageA]
@@:
        push -1
        push [ebx + _MyEventHandle]
        call [ebx + _WaitForSingleObject]
        push [ebx + _MyEventHandle]
        call [ebx + _ResetEvent]
        mov edi ,[ebx + _Edit]
        cmp byte ptr [ebx + edi + 5] ,075h
        je @b
        mov byte ptr [ebx + edi + 5] ,075h
        jmp @Wait
   
;-------------------------
;新的窗口处理函数
;-------------------------   
NewSASProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
     mov eax,uMsg

@Edit:

     .if  eax==WM_HOTKEY
         .if lParam==02E0003h     
               mov eax,0        ;屏蔽

        .elseif lParam == 0230003h
                pushad
                call @f
                @@:
                pop  ebx
                sub ebx ,@B
                push MyHotKeyId
                push [ebx + _WindowHandle]
                call [ebx + _UnregisterHotKey]
                lea edi ,offset @Edit               
                mov byte ptr [ebx + edi + 5] ,0ebh
                popad
                mov eax ,0
                mov ecx ,1
        .endif
    .elseif eax == MyMessage
                pushad
                call @f
                @@:
                pop ebx
                sub ebx ,@b
                push 23h
                push 3
                push MyHotKeyId
                push [ebx + _WindowHandle]
                call [ebx + _RegisterHotKey]
                lea eax ,offset @Edit
                mov [ebx + _Edit] ,eax
                popad
                mov eax ,1       
         
     .else
         call @f
         @@:
         pop ebx
         sub ebx ,@b         
         push lParam
         push wParam
         push uMsg
         push hWin
         push [ebx + OldSASProc]
         call  [ebx + _CallWindowProc ]
     .endif
     ret
NewSASProc endp
injection_size    equ        $-_injection
Start:
     invoke CreateEventA ,NULL ,NULL ,NULL ,addr _szEvent
     mov hEvent ,eax
     invoke GetLastError
     .if eax == 0b7h
        invoke MessageBoxA ,NULL ,addr szFind ,NULL ,MB_YESNO
                .if eax == IDYES
                       
                        invoke SetEvent ,hEvent
                        invoke ExitProcess ,NULL
                .else
                        invoke ExitProcess ,NULL
                .endif

     .endif
     invoke LoadLibrary,addr szkernel32
     mov szKernelBase,eax
     invoke GetProcAddress,eax,addr szExitThread
     mov _ExitThread,eax
     invoke GetProcAddress,szKernelBase ,addr szCreateEventA
     mov _CreateEventA ,eax
     invoke GetProcAddress,szKernelBase ,addr szCloseHandle
     mov _CloseHandle ,eax
     invoke GetProcAddress,szKernelBase ,addr szWaitForSingleObject
     mov _WaitForSingleObject ,eax
     invoke GetProcAddress,szKernelBase ,addr szSetEvent
     mov _SetEvent ,eax
     invoke GetProcAddress,szKernelBase ,addr szResetEvent
     mov _ResetEvent ,eax
     invoke LoadLibrary,addr szuser32
     mov szUserBase,eax
     invoke GetProcAddress,eax,addr szSetWindowLong   
     mov _SetWindowLong,eax
     invoke GetProcAddress,szUserBase,addr szFindWindow
     mov _FindWindow,eax
     invoke GetProcAddress,szUserBase,addr szRegisterHotKey
     mov _RegisterHotKey ,eax
     invoke GetProcAddress,szUserBase,addr szUnregisterHotKey
     mov _UnregisterHotKey ,eax
     invoke GetProcAddress,szUserBase,addr szMessageBoxA
     mov _MessageBoxA ,eax
     invoke GetProcAddress,szUserBase,addr szSendMessageA
     mov _SendMessageA ,eax
     invoke GetProcAddress,szUserBase,addr szCallWindowProc
     mov _CallWindowProc,eax
     call _EnableDebugPrivilege
     invoke    CreateToolhelp32Snapshot, 2, 0
     mov    hSnapshot, eax
     mov    uProcess.dwSize, sizeof uProcess
     invoke    Process32First, hSnapshot, ADDR uProcess
     mov    hProcess, eax
     .while hProcess!=0
        lea eax,uProcess.szExeFile
        invoke lstrcmp,addr szWinlogon,eax
        push eax
        lea eax,uProcess.szExeFile
        invoke lstrcmp,addr szWinlogon2,eax
        pop ecx
        and eax,ecx
        jnz @F
        invoke  OpenProcess, PROCESS_ALL_ACCESS, NULL,uProcess.th32ProcessID
        mov        ph, eax
        jmp skip
        @@:
        invoke    Process32Next, hSnapshot, ADDR uProcess
        mov    hProcess, eax
     .endw
     skip:
     invoke    CloseHandle, hSnapshot

     invoke       VirtualAllocEx,ph,NULL,injection_size,MEM_COMMIT,PAGE_EXECUTE_READWRITE
     mov          injection_base, EAX
     invoke       WriteProcessMemory,ph,EAX,addr _injection,injection_size,NULL
     invoke       CreateRemoteThread,ph,NULL, 0,injection_base,NULL, 0, 0
     invoke     CloseHandle,ph
     invoke Sleep ,500
     invoke CloseHandle ,hEvent
     invoke       ExitProcess,NULL
_EnableDebugPrivilege  proc
    local  @hToken
    local  @tp:TOKEN_PRIVILEGES
    szText SE_DEBUG_NAME_Y,"SeDebugPrivilege"
    invoke  GetCurrentProcess
    lea  ecx,@hToken
    invoke  OpenProcessToken,eax,TOKEN_ALL_ACCESS,ecx
    mov  @tp.PrivilegeCount,1
    invoke  LookupPrivilegeValue,NULL,addr SE_DEBUG_NAME_Y,addr @tp.Privileges[0].Luid
    mov  @tp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
    invoke  AdjustTokenPrivileges,@hToken,FALSE,addr @tp,sizeof @tp,NULL,NULL
    push  eax
    invoke  CloseHandle,@hToken
    pop  eax
    ret
_EnableDebugPrivilege  endp   
end Start
王黎 2009-5-30 13:05
9
帮你顶一下,呵呵
hehz 2010-2-4 20:57
10
帮你顶一下,呵呵
yangyy 2010-2-5 06:44
11
学习一下,顶。。
pedisbest 2015-4-21 21:17
12
现在还没有权限附件无法下载,如果能win7下有效就好了。

明天下载测试
z许 2015-4-22 10:33
13
哈哈哈哈。

之前做屏蔽这三个键。。

直接睡了winlogin。
jerryroxet 2015-12-24 09:17
14
这思路很好
1
Thvoifar 2017-8-1 22:13
15
win7下有效吗?
返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 微信公众号:ikanxue
Time: 0.014, SQL: 10 / 京ICP备10040895号-17