又是乙個APIHOOK

2021-07-05 23:57:11 字數 3769 閱讀 5823

又是乙個apihook

借用了海風月影的hookapi 0.5的一些思路;

hookproc的函式型別和原來的api一樣,只是引數比原api多2個

dword winapi hookproc(dword retaddr ,__pfn***x pfn***x, ...);

//引數比原始的api多2個引數

retaddr

//呼叫api的返回位址

pfn*** 

//型別為__pfn***x,待hook的api的宣告型別,用於呼叫未被hook的api

做成了乙個類,構造物件的時候自動hook,析構的時候unhook,注意一下例項的生存期就可以實現臨時hook和全域性hook。

使用例子,注意黃色部分: 

1typedef 

int(winapi 

*__pfnmessageboxw)(hwnd hwnd, lpcwstr lptext, lpcwstr lpcaption, uint utype);23

intwinapi mymessageboxw(

dword retaddr, __pfnmessageboxw pfnloadlibrarya,

hwnd hwnd, lpcwstr lptext,

4lpcwstr lpcaption, uint utype)58

9void

test()

1015

messageboxw(

this

->

m_hwnd,l

"標題應該沒有被修改了",l

"標題",mb_ok);

16} 

apihook.h 1

#pragma once

2typedef 

int(winapi 

*__pfnmessageboxw)( hwnd hwnd, lpcwstr lptext, lpcwstr lpcaption, uint utype);

3class

capihook4;

15 apihook.cpp 1

#include 

"apihook.h"2

#include 

"libdasm.h"3

#pragma comment( lib, 

"libdasmd.lib")

45//00   ff3424        push    dword ptr [esp]6//

03   ff3424        push    dword ptr [esp]7//

06   50            push    eax8//

07   e8 00000000   call    0c9//

0c   58            pop     eax

10//

0d   83c0 0e       add     eax, 0e

11//

10   894424 0c     mov     dword ptr [esp+c], eax

12//

14   58            pop     eax

13//

15   e9 00000000   jmp     1a <== modify

1415

const

byte stub_temp=16

;2324#define

jmp_my_offset (0x15)

25#define

org_head_offset (0x1a)

26#define

stub_length (0x30)

27capihook::capihook(lpctstr lplibname,lpctstr lpprocname,lpvoid lphookproc)

28:m_bhooked(

false)29

,m_stub(null)

30,m_replacecodesize(0)

3137

if(hmod

==null)

3841

lpvoid pfnapi;

42pfnapi

=getprocaddress(hmod,lpprocname);

43if

(pfnapi

==null)

4447

instruction inst;

48int

ireplacecodesize=0

,il;

49dword retsize=0

;50while

(ireplacecodesize

<5)

5157}58

if(ireplacecodesize

>16)

5962

m_stub

=(pbyte)virtualalloc(null,stub_length,mem_commit,page_execute_readwrite);

63if

(m_stub

==null)

6467

__try

6874

dword dwdelta;

75//

set my jump

76dwdelta

=(dword)lphookproc

-(dword)

&m_stub[jmp_my_offset+5

];77

*(dword*)

&m_stub[jmp_my_offset+1

]=dwdelta;

78//

set org jmp

79m_stub[org_head_offset

+ireplacecodesize]

=0xe9;80

dwdelta

=((dword)pfnapi

+ireplacecodesize)

-(dword)

&m_stub[org_head_offset

+ireplacecodesize+5

];81

*(dword*)

&m_stub[org_head_offset

+ireplacecodesize+1

]=dwdelta;

8283

//modify api entry

84byte buf[8];

85dwdelta

=(dword)

&m_stub[0]

-((dword)pfnapi+5

);86

*(dword*)

&buf[1]

=dwdelta;

87buf[0]

=0xe9;88

if(writeprocessmemory(getcurrentprocess(),pfnapi,buf,5,

&retsize)==0

)8992m_bhooked

=true;93

m_pfnapi

=pfnapi;

94m_replacecodesize

=ireplacecodesize;95}

96__finally

97103

}104

}105

106capihook::

~capihook(

void

)107

114}

115116

bool

capihook::hooked()

117

乙個API HOOK的例子

乙個api hook的例子 2010年07月20日 include include 執行緒操作api hinstance hinst 任務例項id hwnd mainfrmhwnd 主視窗控制代碼 hfont globalfont 字型 typedef struct remoteparam 視窗類名...

又是乙個51

記得去年的這個時候還和小崔,小魏他們在漓江邊燒烤呢,呵呵,晚上漓江邊真的很不錯,靜靜的,大家坐在一起聊天,說說未來的打算,談談自己的感受,回憶一下在學校裡的美好時光,桂林的夜景很漂亮,去留不住我的心。51的時候大夥合計著去了躺八角寨,時間真的過得很快,轉眼間感覺大學四年真的很快,而我感覺這一年過得更...

又是乙個51

記得去年的這個時候還和小崔,小魏他們在漓江邊燒烤呢,呵呵,晚上漓江邊真的很不錯,靜靜的,大家坐在一起聊天,說說未來的打算,談談自己的感受,回憶一下在學校裡的美好時光,桂林的夜景很漂亮,去留不住我的心。51的時候大夥合計著去了躺八角寨,時間真的過得很快,轉眼間感覺大學四年真的很快,而我感覺這一年過得更...