飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4506|回复: 7

汇编实现HOOK API

[复制链接]

该用户从未签到

发表于 2006-6-28 18:18:25 | 显示全部楼层 |阅读模式
===============hookdll.dll===========================
.486
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib


HOOKAPI struct
a  byte ?
PMyapi DWORD ?   
d BYTE ?  
e BYTE ?
HOOKAPI ends


WriteApi proto :DWORD ,:DWORD,:DWORD,:DWORD
MyAPI proto  :DWORD  ,:DWORD
GetApi proto  :DWORD,:DWORD


.data
hInstance dd 0
WProcess dd 0
hacker HOOKAPI <>
CommandLine LPSTR ?

Papi1 DWORD ?
Myapi1 DWORD ?
ApiBak1 db 10 dup(?)
DllName1  db "user32.dll",0
ApiName1  db "ExitWindowsEx",0
mdb db "下面的程序想关闭计算机,要保持阻止吗?",0


.data?
hHook dd ?
hWnd dd ?


.code
DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD
   
  
.if reason==DLL_PROCESS_ATTACH
        push hInst
        pop hInstance

invoke GetCommandLine   
mov CommandLine,eax                                         ;取程序命令行

mov hacker.a,0B8h     ;mov eax
mov hacker.d,0FFh     ;jmp
;mov hacker.d PMyapi  ;0x000000
mov hacker.e, 0E0h    ;eax

;简单的说就是改写API的入口点为: mov eax; jmp 0x000000,eax


invoke   GetCurrentProcess                                   ;取进程伪句柄

mov WProcess ,eax
   
invoke GetApi,addr DllName1,addr ApiName1                    ;取API地址
  
mov Papi1,eax                                               ;保存API地址

invoke ReadProcessMemory,WProcess,Papi1,addr ApiBak1,8,NULL  ;备份原API的前8字节

mov hacker.PMyapi,offset MyAPI   ;0x000010                  ;要替代API的函数地址

invoke WriteApi,WProcess,Papi1, addr hacker ,size HOOKAPI    ;HOOK API

.endif

.if  reason==DLL_PROCESS_DETACH

invoke WriteApi,WProcess,Papi1, addr ApiBak1 ,8               ;还原API

.endif

mov  eax,TRUE
    ret
DllEntry Endp

GetMsgProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
    invoke CallNextHookEx,hHook,nCode,wParam,lParam
     mov eax,TRUE
     
      ret
GetMsgProc endp

InstallHook proc
   
    invoke SetWindowsHookEx,WH_GETMESSAGE,addr GetMsgProc,hInstance,NULL
    mov hHook,eax
    ret
InstallHook endp

UninstallHook proc
    invoke UnhookWindowsHookEx,hHook
   invoke WriteApi,WProcess,Papi1, addr ApiBak1 ,8
  ret
UninstallHook endp

GetApi proc DllNameAddress:DWORD,ApiNameAddress:DWORD

invoke  GetModuleHandle,DllNameAddress     ;取DLL模块句柄
   
  .if eax==NULL
  
  invoke LoadLibrary ,DllNameAddress    ;加载DLL
  
   .endif
  
invoke GetProcAddress,eax,ApiNameAddress  ;取API地址
   

mov eax,eax
       
ret

GetApi endp


WriteApi proc Process:DWORD ,Papi:DWORD,Ptype:DWORD,Psize:DWORD

LOCAL mbi:MEMORY_BASIC_INFORMATION
LOCAL msize:DWORD


;返回页面虚拟信息
invoke VirtualQueryEx,Process, Papi,addr mbi,SIZEOF MEMORY_BASIC_INFORMATION

;修改为可读写模式

invoke VirtualProtectEx,Process, mbi.BaseAddress,8h,PAGE_EXECUTE_READWRITE,addr mbi.Protect

;开始写内存

invoke  WriteProcessMemory,Process, Papi, Ptype,Psize ,NULL

PUSH eax

;改回只读模式
invoke VirtualProtectEx,Process,mbi.BaseAddress,8h,PAGE_EXECUTE_READ,addr mbi.Protect

pop eax

ret

WriteApi endp

MyAPI proc  bs:DWORD  ,dwReserved:DWORD                       ;替代的API,参数要和原来一样

invoke MessageBox, NULL,  CommandLine, addr mdb, 4            ;弹出信息框选择是否阻止

.if eax==7                                                    ;如果选择否

invoke WriteApi,WProcess,Papi1, addr ApiBak1 ,8              ;先还原API

invoke ExitWindowsEx,bs,dwReserved                           ;再调用API

invoke WriteApi,WProcess,Papi1, addr hacker ,sizeof HOOKAPI  ;调用完后再改回来
       
.endif

mov eax,TRUE
ret

MyAPI endp

End DllEntry


============================hookdll.def=========================

LIBRARY hookdll
EXPORTS InstallHook
EXPORTS UninstallHook
=================================================

注意;连接时要加上"SECTION:.bss[S]"设置共享段


输出InstallHook和UninstallHook这2个函数

调用InstallHook便安置全局勾子,勾住系统API函数ExitWindowsEx,在系统中的程序关机前拦截并提示

用户,类防火墙,防止未授权程序关闭计算机,可用于防止有反调式功能的程序关闭计算机


我打包上来吧,DLL源码:

[ 本帖最后由 hacker0058 于 2006-7-11 19:26 编辑 ]

hookdll060711.zip

23.64 KB, 下载次数: 25, 下载积分: 飘云币 -2 枚

PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2006-7-11 19:13:44 | 显示全部楼层
郁闷,怎么没人顶啊
PYG19周年生日快乐!

该用户从未签到

发表于 2006-7-12 22:50:39 | 显示全部楼层
帮你顶下。。。。。。。
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-9-27 21:14
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2006-8-12 08:42:41 | 显示全部楼层
    谢谢!学习中
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-8-16 00:28:34 | 显示全部楼层
    /:Dccc
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-8-25 16:14:24 | 显示全部楼层
    要HOOK的函数没有办法自己定义吗?
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2006-8-31 15:25:54 | 显示全部楼层
    原帖由 特别 于 2006-8-25 16:14 发表
    要HOOK的函数没有办法自己定义吗?



    API函数因为参数各不相同,所以不能统一定以
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    前天 15:35
  • 签到天数: 1637 天

    [LV.Master]伴坛终老

    发表于 2006-8-31 21:25:44 | 显示全部楼层
    多提供些hook资料。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表