Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Trang 3 trên tổng số 4 Đầu tiênĐầu tiên 1234 Cuối cùngCuối cùng
Từ 21 tới 30 trên tổng số 38 kết quả

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

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

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

    Cảm ơn mèocon. Mình đã thử làm đủ kiểu nhưng vẫn xảy ra tình trạng crash do gọi hàm gốc không được. Hình như phải truyền tham số trong các lệnh hợp ngữ nữa phải không. Về ASM mình ko rành lắm, ông thầy dạy dc 1 tháng rùi chuồn mất tăm. Mình đã thử theo đúng cấu trúc như hướng dẫn mà vẫn ko gọi được. Bạn có thể minh họa cho mình bằng 1 ví dụ được không (giải thích nữa thì tốt quá). Cảm ơn !
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Â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/

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

    Đây là một ví dụ nhỏ :
    Attached Files Attached Files
    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. #23
    Ngày gia nhập
    09 2008
    Bài viết
    223

    EDIT____
    Cảm ơn mèo con nhiều. Mình đã tự làm được
    Đã được chỉnh sửa lần cuối bởi gianghoplus : 09-08-2009 lúc 09:19 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/

  4. #24
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    thay vì cứ ghi đi ghi lại 5 byte đầu của hàm bạn có thể lưu địa chỉ của hàm ( bạn lấy bằng cách get trực tiếp từ dll bằng hàm GetProcAddress) vào 1 biến cố định rồi khi nào cần gọi lại hàm chưa bị hook thì gọi từ địa chỉ đó ra,làm việc đó thì đỡ phải như ghi đi ghi lại 5 byte,rất dễ gây crash
    Code:
    HANDLE _stdcall OpenProcess2(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId)
    {
    	if (dwProcessId == ProtectingPid)
    	{
    		return NULL;
    	}
    	else
    	{
    		//UnHookAPI();
    		//HANDLE ans = //OpenProcess(dwDesiredAccess,bInheritHandle,dwProcessId);
    gọi đến địa chỉ thực của hàm OpenProcess được lấy bằng hàm  GetProcAddress 
    		//HookAPI();
    		//return ans;
    	}
    }
    Đã được chỉnh sửa lần cuối bởi AlexF : 11-08-2009 lúc 09:09 AM.

  5. #25
    Ngày gia nhập
    01 2011
    Bài viết
    14

    Code:
    #include "stdafx.h"
    #include <tchar.h>
    #include <winsock2.h>
    
    #pragma data_seg(".shared")
    
    DWORD ProtectingPid = 0; 
    
    #pragma data_seg()
    
    HMODULE MyModuleHandle;
    
    HHOOK hhk = NULL;
    DWORD MyPid = 0;
    unsigned char Store[10];
    
    LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam);
    
    int _stdcall send2( SOCKET s, const char *buf,  int len, int flags  );
    
    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;
    		HookAPI();
    
    	}
    	else if (ul_reason_for_call == DLL_PROCESS_DETACH)
    	{
    		UnHookAPI();
    	}
    
    	return TRUE;
    }
    
    LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
    {  
    	if (nCode < 0)
    	{
    		return CallNextHookEx(hhk,nCode,wParam,lParam);
    	}
    	return CallNextHookEx(hhk,nCode,wParam,lParam);
    }
    
    void HookAPI()
    {
    	DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
    	HMODULE hmod = GetModuleHandle("Ws2_32");
    	long pa = (long)GetProcAddress(hmod,"send");
    	long pa2 = (long)send2;
    	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("Ws2_32");
    	long pa = (long)GetProcAddress(hmod,"send");
    	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 send2( SOCKET s,  const char *buf,   int len,   int flags )
    {
    	UnHookAPI();
    	send( s, buf,    len,   flags );
    	HookAPI();
    	return 0;
    }
    Mình hook hàm send,khi chuyển hướng sang hàm khác thì hàm hoạt động hiệu quả,nhưng mình muốn chỉnh sửa các tham số và gọi chính hàm send khi chưa hook thì khi build bị báo lỗi
    Error 1 error LNK2019: unresolved external symbol __imp__send@16 referenced in function "int __stdcall send2(unsigned int,char const *,int,int)" (?send2@@YGHIPBDHH@Z) Hook.obj
    Error 2 fatal error LNK1120: 1 unresolved externals c:\Users\Nobita_cpp\Desktop\APIHook_DLL_Demo(thanh cong)\debug\Hook.dll

    Ai giải thích hộ mình với.
    Con người sinh ra không phải để tan biến đi như một hạt cát vô danh. Họ sinh ra để in dấu lại trên mặt đất, in dấu lại trong trái tim người khác.

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

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

    Hình như lỗi này là do bạn chưa khai báo file lib cho winsock.
    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.

  7. #27
    Ngày gia nhập
    01 2011
    Bài viết
    14

    Cám ơn mèo,do mình thiếu khai báo #pragma comment(lib, "ws2_32.lib") nên khi build bị lỗi đấy.Bạn alexf có nói cách gọi hàm tại địa chỉ cũ,mình đã thêm vào dòng lệnh
    Code:
    typedef int (*_send)( SOCKET s, const char *buf,  int len, int flags  );//khai bao nguyen mẫu hàm
    _send sendold; //biến toàn cục
    
    //ở hàm HookAPI
    HMODULE hmod = GetModuleHandle("Ws2_32");
    long pa = (long)GetProcAddress(hmod,"send");
     sendold	= (_send)pa;
    Khi gọi hàm,mình gọi hàm
    int _stdcall send2( SOCKET s, const char *buf, int len, int flags )
    {
    return sendold( s, buf, len, flags );
    }
    thì thấy process hook bị thoát luôn khi gọi hàm send.Ai sửa giúp mình được không.
    Con người sinh ra không phải để tan biến đi như một hạt cát vô danh. Họ sinh ra để in dấu lại trên mặt đất, in dấu lại trong trái tim người khác.

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

    Những hảm của winsock ko gọi theo kiểu winapi mà dùng pascal call. Bạn có thể vào file .h của winsock để xem cách khai báo hàm, cách gọi hàm rồi sửa lại code hook cho đúng hoàn cảnh.
    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. #29
    Ngày gia nhập
    01 2011
    Bài viết
    14

    nếu mình khai báo
    typedef int WSAAPI (*_send)( SOCKET s, const char *buf, int len, int flags );
    _send sendold;
    thì khi dịch sẽ báo lỗi,vậy nên mình phải bỏ WSAAPI đi.Hàm chuyển hướng mình đã khai báo
    int WSAAPI send2( SOCKET s, const char FAR * buf, int len, int flags )
    Khi build rùi load dll thì vẫn bị out process khi gọi hàm send.

    Cho mình hỏi thêm,là khi hàm apihook có đoạn
    long dAddr = pa2 - pa - 5;
    unsigned char *p2 = (unsigned char *)(&dAddr);
    Mèo có thể giải thích sao lại là pa2-pa vậy,pa2 là địa chỉ bộ nhớ bắt đầu hàm chuyển hướng,pa là địa chỉ bắt đầu hàm gốc,vậy khi trừ đi thì nó ra 1 địa chỉ rất lạ.
    Đã được chỉnh sửa lần cuối bởi Nobita_cpp : 10-05-2011 lúc 05:33 AM.
    Con người sinh ra không phải để tan biến đi như một hạt cát vô danh. Họ sinh ra để in dấu lại trên mặt đất, in dấu lại trong trái tim người khác.

  10. #30
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    520

    bạn thử khai báo là thế này xem
    Code:
    typedef int (WSAAPI *_send)( SOCKET s, const char *buf, int len, int flags );
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

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