Đây là một ví dụ nhỏ :
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 !
Â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/
Đây là một ví dụ 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.
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/
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.
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ỗiCode:#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; }
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.
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.
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
Khi gọi hàm,mình gọi hàmCode: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;
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.
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.
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.
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 );