Trang 2 trên tổng số 4 Đầu tiênĐầu tiên 1234 Cuối cùngCuối cùng
Từ 11 tới 20 trên tổng số 38 kết quả

Đề tài: Thư viện hỗ trợ hook các hàm API

  1. #11
    Ngày gia nhập
    03 2008
    Bài viết
    36

    Mặc định Thư viện hỗ trợ hook các hàm API

    Đây là code mình thử sửa để hook thử hàm MessageBoxA, nhưng khi chương trình gọi đến hàm MessageBoxA thì crash luôn
    Code:
    #include "stdafx.h"
    #include <tchar.h>
    #pragma data_seg(".shared")
    
    DWORD ProtectingPid = 0;
    
    #pragma data_seg()
    
    HMODULE MyModuleHandle;
    HHOOK hhk = NULL;
    DWORD MyPid = 0;
    unsigned char Store[10];
    
    long _stdcall SelfInject();
    long _stdcall SelfEject();
    
    LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam);
    int _stdcall MessageBoxA2(HWND hWnd, LPCSTR lpText, LPCSTR lpCation, UINT uType);
    
    void HookAPI();
    void UnHookAPI();
    
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  reason,
                           LPVOID lpReserved
    					 )
    {
    	if (reason == DLL_PROCESS_ATTACH)
    	{
            MessageBoxA(0, "Hook noi dung","Hook", MB_OK);
    		HookAPI();
    		MyModuleHandle = (HMODULE)hModule;
    	}
    	else if (reason == DLL_PROCESS_DETACH)
    	{
    		UnHookAPI();
    	}
    
    	return TRUE;
    }
    
    long _stdcall SelfInject()
    {
    	//ProtectingPid = MyPid;
    	hhk = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,MyModuleHandle,0);
    	return (hhk != NULL);
    }
    
    long _stdcall SelfEject()
    {
    	return UnhookWindowsHookEx(hhk);
    }
    
    LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
    {  
        if (nCode < 0)
        {
            return CallNextHookEx(hhk,nCode,wParam,lParam);
        }
        if ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
        {
            switch (wParam)
            {
                case VK_F2:
                    MessageBox(0, _T("aaaaa"), _T("bbbbbbb"),MB_OK);
            	    break;
            }
        }
    	return CallNextHookEx(hhk,nCode,wParam,lParam);
    }
    
    void HookAPI()
    {
    	DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
    	HMODULE hmod = GetModuleHandle("user32");
    	long pa = (long)GetProcAddress(hmod,"MessageBoxA");
    	long pa2 = (long)MessageBoxA2;
    	long dAddr = pa2 - pa - 5;
    	unsigned char *p = (unsigned char *)pa;
    	unsigned char *p2 = (unsigned char *)(&dAddr);
    
    	VirtualProtect((void *)pa,5,NewProtect,&OldProtect);
    
    	for (int i=0;i<5;i++)
    		Store[i] = p[i];
    
    	p[0] = (unsigned char)0xE9;
    	for (int i=0;i<4;i++)
    		p[i + 1] = p2[i];
    
    	VirtualProtect((void *)pa,5,OldProtect,&NewProtect);
    }
    
    void UnHookAPI()
    {
    	DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
    	HMODULE hmod = GetModuleHandle("user32");
    	long pa = (long)GetProcAddress(hmod,"MessageBoxA");
    	unsigned char *p = (unsigned char *)pa;
    
    	VirtualProtect((void *)pa,5,NewProtect,&OldProtect);
    
    	for (int i=0;i<5;i++)
    		p[i] = Store[i];
    
    	VirtualProtect((void *)pa,5,OldProtect,&NewProtect);
    }
    
    int _stdcall MessageBoxA2(HWND hWnd, LPCSTR lpText, LPCSTR lpCation, UINT uType)
    {
        MessageBox(0, _T("Test"), _T("Test"), MB_OK);
        return 0;
    }

  2. #12
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    C++ Code:
    1. int _stdcall MessageBoxA2(HWND hWnd, LPCSTR lpText, LPCSTR lpCation, UINT uType)
    2. {
    3.     MessageBox(0, _T("Test"), _T("Test"), MB_OK);
    4.     return 0;
    5. }
    Trong hàm hook của hàm MessageBox mà bạn lại gọi hàm MessageBox thì như vậy sẽ trở thành gọi đệ quy ko điểm dừng => chương trình tràn stack và crash
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #13
    Ngày gia nhập
    03 2008
    Bài viết
    36

    hi mình đã viết lại thay vì hiển thị messagebox thì nó sẽ postmessage vào Notepad
    Đây là code mình đã sửa lại
    Code:
    #include "stdafx.h"
    #include <tchar.h>
    #pragma data_seg(".shared")
    
    DWORD ProtectingPid = 0;
    
    #pragma data_seg()
    
    HMODULE MyModuleHandle;
    HHOOK hhk = NULL;
    DWORD MyPid = 0;
    unsigned char Store[10];
    
    long _stdcall SelfInject();
    long _stdcall SelfEject();
    
    LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam);
    int _stdcall MessageBoxA2(HWND hWnd, LPCSTR lpText, LPCSTR lpCation, UINT uType);
    
    void HookAPI();
    void UnHookAPI();
    
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
    					 )
    {
        if (ul_reason_for_call == DLL_PROCESS_ATTACH)
        {
            MyModuleHandle = (HMODULE)hModule;
            // Khong su dung ham MessageBoxA de thong bao vi ta hook ham MessageBoxA ma
            //    MessageBoxA(0, "Hook noi dung","Hook", MB_OK);
            HookAPI();
    
        }
        else if (ul_reason_for_call == DLL_PROCESS_DETACH)
        {
            UnHookAPI();
        }
    
        return TRUE;
    }
    
    long _stdcall SelfInject()
    {
        //ProtectingPid = MyPid;
        hhk = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,MyModuleHandle,0);
        return (hhk != NULL);
    }
    
    long _stdcall SelfEject()
    {
        return UnhookWindowsHookEx(hhk);
    }
    
    LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
    {  
        if (nCode < 0)
        {
            return CallNextHookEx(hhk,nCode,wParam,lParam);
        }
        if ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
        {
            switch (wParam)
            {
            case VK_F2:
                MessageBox(0, _T("aaaaa"), _T("bbbbb"),MB_OK);
                break;
            }
        }
        return CallNextHookEx(hhk,nCode,wParam,lParam);
    }
    
    void HookAPI()
    {
        DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
        HMODULE hmod = GetModuleHandle("user32");
        long pa = (long)GetProcAddress(hmod,"MessageBoxA");
        long pa2 = (long)MessageBoxA2;
        long dAddr = pa2 - pa - 5;
        unsigned char *p = (unsigned char *)pa;
        unsigned char *p2 = (unsigned char *)(&dAddr);
    
        VirtualProtect((void *)pa,5,NewProtect,&OldProtect);
    
        for (int i=0;i<5;i++)
            Store[i] = p[i];
    
        p[0] = (unsigned char)0xE9;
        for (int i=0;i<4;i++)
            p[i + 1] = p2[i];
    
        VirtualProtect((void *)pa,5,OldProtect,&NewProtect); 
    }
    
    void UnHookAPI()
    {
        DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
        HMODULE hmod = GetModuleHandle("user32");
        long pa = (long)GetProcAddress(hmod,"MessageBoxA");
        unsigned char *p = (unsigned char *)pa;
    
        VirtualProtect((void *)pa,5,NewProtect,&OldProtect);
    
        for (int i=0;i<5;i++)
            p[i] = Store[i];
    
        VirtualProtect((void *)pa,5,OldProtect,&NewProtect);
    }
    
    int _stdcall MessageBoxA2(HWND hWnd, LPCSTR lpText, LPCSTR lpCation, UINT uType)
    {
        HWND hwndtest = FindWindow("Notepad",NULL);
        hwndtest = FindWindowExA(hwndtest,0, "Edit", NULL);
        PostMessage(hwndtest, WM_KEYDOWN, VkKeyScanA('A'),NULL);
        PostMessage(hwndtest, WM_KEYUP, VkKeyScanA('A'),NULL);
        //    MessageBox(0, _T("abc"), _T("def"), MB_OK);
        return 0;
    }
    Mình có 3 vấn đề muốn hỏi:
    1) Sao nó send 2 phím a 1 lúc vào Notepad vậy
    2) Sao mình nhấn phím F2 mà không hiển thị messagebox "aaaaa" vậy
    3) Mình thấy có 2 hàm SelfInject và SelfEject nhưng không thấy trong DLL gọi đến nó
    Mình mới tập làm quen với vấn đề này nên mong được học hỏi nhiều thêm
    Đã được chỉnh sửa lần cuối bởi T4mQu0c : 07-10-2008 lúc 08:17 PM.

  4. #14
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Trích dẫn Nguyên bản được gửi bởi T4mQu0c Xem bài viết
    Mình có 3 vấn đề muốn hỏi:
    1) Sao nó send 2 phím a 1 lúc vào Notepad vậy
    2) Sao mình nhấn phím F2 mà không hiển thị messagebox "aaaaa" vậy
    3) Mình thấy có 2 hàm SelfInject và SelfEject nhưng không thấy trong DLL gọi đến nó
    1) Cái này bạn nên thay bằng WM_CHAR
    2) Bạn phải unhook để phục hồi hàm cũ rồi sau đó gọi lại và truyền tham số vào cho nó, vì đã unhook nên ko sợ bị đệ quy. Sau khi gọi xong thì phải hook lại để duy trì tiếp cho hook.
    3) Hai hàm này mình dùng để nạp thư viện vào tiến trình khác, nó ko liên quan gì ở đây.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  5. #15
    Ngày gia nhập
    03 2008
    Bài viết
    36

    Cám ơn bạn giờ mình đã hiểu ra được nhiều vấn đề

  6. #16
    Ngày gia nhập
    12 2008
    Bài viết
    198

    Mặc định Thư viện hỗ trợ hook các hàm API

    to meoconlongvang :
    cậu sử dụng kỹ thuật override ah
    đoạn mã
    Code:
    void HookAPI()
    {
    	DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
    	HMODULE hmod = GetModuleHandle("kernel32");
    	long pa = (long)GetProcAddress(hmod,"OpenProcess");
    	long pa2 = (long)OpenProcess2;
    	long dAddr = pa2 - pa - 5;
    	unsigned char *p = (unsigned char *)pa;
    	unsigned char *p2 = (unsigned char *)(&dAddr);
    
    	VirtualProtect((void *)pa,5,NewProtect,&OldProtect);
    
    	for (int i=0;i<5;i++)
    		Store[i] = p[i];
    
    	p[0] = (unsigned char)0xE9;
    	for (i=0;i<4;i++)
    		p[i + 1] = p2[i];
    
    	VirtualProtect((void *)pa,5,OldProtect,&NewProtect);
    }
    2 cái dòng đỏ nghĩa là sao,cậu có thể nói sơ qua những bước mà cậu đã làm trong hàm đó không,có phải là cậu thay thế hàm OpenProcess bằng hàm khác( hàm này do cậu lập trình ra) rồi sau đó load hàm này lên và Hook cái hàm mà cậu sử lý phải không

  7. #17
    Ngày gia nhập
    01 2009
    Bài viết
    64

    kỹ thuật gọi hàm override hàm API rất hay,mình nghĩ bạn chỉ cần không gọi hàm API opeprocess trong hàm ( bạn tự tạo ) openprocess2 là sẽ chặn được hàm API openprocess rồi

  8. #18
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    @CPro : lúc đầu vùng nhớ để lưu code thực thi của hàm ko thể ghi được, mình dùng VirtualProtect để set cho nó thuộc tính là ghi được. Sau khi hook xong mình set lại cho nó trỡ về như cũ.

    Code:
    void HookAPI()
    {
    	DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
    	HMODULE hmod = GetModuleHandle("kernel32");
    	long pa = (long)GetProcAddress(hmod,"OpenProcess");
    	long pa2 = (long)OpenProcess2;
    	long dAddr = pa2 - pa - 5;
    	unsigned char *p = (unsigned char *)pa;
    	unsigned char *p2 = (unsigned char *)(&dAddr);
    
    	VirtualProtect((void *)pa,5,NewProtect,&OldProtect);	 // cho phép ghi vào vùng nhớ tại địa chỉ pa
    	
    	for (int i=0;i<5;i++)  // lưu 5 byte trong code cũ của hàm
    		Store[i] = p[i];
    
    	p[0] = (unsigned char)0xE9; // chèn lệnh nhảy đến hàm của mình, code hợp ngữ là jmp ref
    	for (i=0;i<4;i++)
    		p[i + 1] = p2[i];
    
    	VirtualProtect((void *)pa,5,OldProtect,&NewProtect); // set lại thuộc tính gốc cho vùng nhớ
    }
    @cSharp : cách của bạn là chặn luôn, mình muốn tùy trường hợp mà nó chặn hay nó cho chạy tiếp.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  9. #19
    Ngày gia nhập
    09 2008
    Bài viết
    223

    Code:
    HANDLE _stdcall OpenProcess2(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId)
    {
    	if (dwProcessId == ProtectingPid)
    	{
    		return NULL;
    	}
    	else
    	{
    		UnHookAPI();
    		HANDLE ans = OpenProcess(dwDesiredAccess,bInheritHandle,dwProcessId);
    		HookAPI();
    		return ans;
    	}
    }
    Cậu có phương pháp nào để có thể gọi lại hàm API nguyên thủy mà không cần phải UnHook ko? Nếu cứ gọi UnHookAPI() rồi đến HookAPI() lại thì không phải là một ý hay. Nhất là với các hàm API có tần suất gọi lớn -> Dễ dẫn đến chương trình bị Crash.
    Mình chỉ muốn gắn 1 cái móc câu cho nó đi vòng một chút để ta có thể kiểm tra giá trị của các tham số khi gọi hàm và thay đổi nếu cần.
    Tớ cũng có 1 vài ý tưởng không biết khả thi không. Ta có thể lấy 1 địa chỉ nào đó (có thể là 1 hàm khác ít khi xài tới chẳng hạn) rồi chèn 1 đoạn code jmp tới sau địa chỉ hàm jmp trước. Và gọi hàm từ địa chỉ đó...

    Còn 1 câu hỏi nữa. Hình như 5 byte đầu của các hàm giống nhau thì phải. Mình dùng chung 1 biến Store[] để lưu trữ cho nhiều hàm API bị Hook. Kết quả unhook vẫn tốt cho từng hàm.

    Học hành ko ngại đi hỏi. Mong bạn cố gắng trả lời
    Đã được chỉnh sửa lần cuối bởi gianghoplus : 04-08-2009 lúc 10:09 PM.
    Ân oán giang hồ nuôi tôi lớn
    Cuộc đời khốn nạn dạy tôi khôn
    Không đâm không chém đời không nể
    Không tiền không bạc gái không theo

    ----------------------
    Visit my blog: http://nova-soft.net/

  10. #20
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mình nhớ trong bài tut của anh FD bên vvn có nói về vấn đề này rồi. Nếu bạn không muốn unhook thì bạn phải lưu 5 byte gốc của hàm vào một vùng nhớ tạm và set cho vùng nhớ này thuộc tính thực thi. Thướng thì 5 byte gốc tương ứng với 3 lệnh hợp ngữ :
    Code:
    mov edi,edi
    push ebp
    mov ebp,esp
    Nói thì khó hình dung, mình sẽ minh họa bằng asm cho bạn dễ hiểu :

    Đây là hàm api OldFunc đã bị hook :
    Code:
    jmp Hooker ; 5 byte
    .......
    Đây là hàm Hooker :
    Code:
    .....
    ; code của hàm gốc
    mov edi,edi
    push ebp
    mov ebp,esp
    ; không return khi kết thúc hàm mà thay bằng các lệnh dưới
    mov edx,OldFunc
    add edx,5
    jmp edx
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

Các đề tài tương tự

  1. Mouse hook system-wide lại chạy như local hook ???
    Gửi bởi nguoixanh trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 12-11-2013, 04:02 PM
  2. Mouse hook system-wide lại chạy như local hook ???
    Gửi bởi nguoixanh trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 1
    Bài viết cuối: 12-11-2013, 03:01 PM
  3. Hook keyboard và mouse hook trong c# không cần code
    Gửi bởi tienlbhoc trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 7
    Bài viết cuối: 23-06-2013, 01:27 PM
  4. [Kernel Driver] ShaDow SSDT Hook Có Phải là Hook đồ Họa
    Gửi bởi chàng trai dễ thương trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 0
    Bài viết cuối: 11-10-2009, 07:48 AM
  5. chỉ dẫn phương pháp Hook APi bằng inline hook
    Gửi bởi trần trân trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 3
    Bài viết cuối: 22-06-2009, 10:15 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn