通过调用VirtualProtectEx来修改,通过修改main()函数的入口地址来达到修改打印内容的目的。
完整的代码如下:
int
main(
int
argc,
char
*
argv[]);
int mine()
... {
cout << "白日依山尽, 黄河入海流, 欲穷千里目, 更上一层楼. ";
return 0;
}
int SetHook()
... {
DWORD flag = PAGE_EXECUTE_READWRITE;
DWORD mineAddr = (DWORD)mine;
DWORD mainAddr = (DWORD)main;
mineAddr -= (mainAddr + 5);
VirtualProtectEx(GetCurrentProcess(), (BYTE*)mainAddr, 200, flag, &flag);
((BYTE*)mainAddr)[0] = 0xe9;
((BYTE*)mainAddr)[1] = (BYTE)(mineAddr);
((BYTE*)mainAddr)[2] = (BYTE)(mineAddr>>8);
((BYTE*)mainAddr)[3] = (BYTE)(mineAddr>>16);
((BYTE*)mainAddr)[4] = (BYTE)(mineAddr>>24);
VirtualProtectEx(GetCurrentProcess(), (BYTE*)mainAddr, 200, flag, &flag);
return 0;
}
int s = SetHook();
int main( int argc, char * argv[])
... {
cout << "白日依山尽, ";
return 0;
}
int mine()
... {
cout << "白日依山尽, 黄河入海流, 欲穷千里目, 更上一层楼. ";
return 0;
}
int SetHook()
... {
DWORD flag = PAGE_EXECUTE_READWRITE;
DWORD mineAddr = (DWORD)mine;
DWORD mainAddr = (DWORD)main;
mineAddr -= (mainAddr + 5);
VirtualProtectEx(GetCurrentProcess(), (BYTE*)mainAddr, 200, flag, &flag);
((BYTE*)mainAddr)[0] = 0xe9;
((BYTE*)mainAddr)[1] = (BYTE)(mineAddr);
((BYTE*)mainAddr)[2] = (BYTE)(mineAddr>>8);
((BYTE*)mainAddr)[3] = (BYTE)(mineAddr>>16);
((BYTE*)mainAddr)[4] = (BYTE)(mineAddr>>24);
VirtualProtectEx(GetCurrentProcess(), (BYTE*)mainAddr, 200, flag, &flag);
return 0;
}
int s = SetHook();
int main( int argc, char * argv[])
... {
cout << "白日依山尽, ";
return 0;
}