一旦调用我hook的api 就将调用地址改变。 #include<windows.h> #define Max 20 struct myass { DWORD ADDRESS[Max]; int num; }Array; int Add_address(DWORD a) { int i; if (a==0) return 0; for ( i=0;(i<Max)&&(Array.ADDRESS[i]!=0);i++) { if (Array.ADDRESS[i]==a) return 0; } Array.ADDRESS[i]=a; Array.num++; return 1; } void clear_address() { for(int i=0;i<Max;i++) { Array.ADDRESS[i]=0; } Array.num=0; } int main(int innum) { DWORD MBaddress; DWORD oldpoint; DWORD Edit_add; switch(innum) { case 1: Edit_add=Add_address; break; } clear_address(); _asm { mov eax,dword ptr ss:[esp] mov MBaddress,eax } if (Add_address(MBaddress)!=1) return 0; MBaddress=MBaddress-4; if (VirtualProtect((void*)MBaddress,4,PAGE_EXECUTE_READWRITE,&oldpoint))//开启可写属性 { _asm { mov eax,Edit_add mov DWORD PTR CS:[MBaddress],eax } FlushInstructionCache(GetCurrentProcess(), (void*)MBaddress, 4); //'确保执行更改 VirtualProtect((void*)MBaddress, 4, oldpoint, &oldpoint); // '恢复原来的属性 } return 1; }