http://topic.csdn.net/u/20100906/14/d480e814-f571-43e6-b7ba-21b7e4d4f8eb.html
这个贴里已经能够成功了,按照IAMSHUKE的帮助,然后自己把EXE里面那个未定义的消息随意给了一个自定义消息(WMUSER+114),再把那两个应该是按钮成员变量的无关根本的代码去掉,增加内存操作权限(加EXECUTE),能够成功的HOOK到NOTEPAD的MESSAGEBOX。
但是把EXE里面的pg_data->hWndTarget = ::FindWindow("NotePad",NULL);替换为
pg_data->hWndTarget = ::FindWindow(0,"simpletest");
其中simpletest是自己写的一个最简单的对话框程序,只有一个按钮,响应函数里也只有一句MESSAGEBOX。结果一启动HOOK程序,simpletest就关闭,提示“simpletest.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉。”
这个贴里已经能够成功了,按照IAMSHUKE的帮助,然后自己把EXE里面那个未定义的消息随意给了一个自定义消息(WMUSER+114),再把那两个应该是按钮成员变量的无关根本的代码去掉,增加内存操作权限(加EXECUTE),能够成功的HOOK到NOTEPAD的MESSAGEBOX。
但是把EXE里面的pg_data->hWndTarget = ::FindWindow("NotePad",NULL);替换为
pg_data->hWndTarget = ::FindWindow(0,"simpletest");
其中simpletest是自己写的一个最简单的对话框程序,只有一个按钮,响应函数里也只有一句MESSAGEBOX。结果一启动HOOK程序,simpletest就关闭,提示“simpletest.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉。”
解决方案 »
- Help!~~FD_OOB_BIT这个事件是个什么东东啊。
- 请教窗口贴图时的边框问题,如何去除窗口边框
- 疑问? 当执行一网络命令(比如:Ping www.263.net)的时候,如果当时机器上有多个 modem 的时候,它如何选择路径呢?
- 哪位高手能给我讲一讲http隧道技术!
- 怎样判断文件读到尾??
- 请问--声音文件如何存储到数据库里
- 请问一个计算方法的小问题,大家一起来想想办法!
- 寻找c及C++专业网站!
- 程序可以compile跟build,为什么execute时没有反应
- 多线程两线程用临界区切换输出数字
- 对话框在OnPaint与OnEraseBkgnd更换背景位图的区别
- malloc 问题
IMAGE_NT_HEADERS *pinh;
IMAGE_DATA_DIRECTORY *pSymbolTable;
IMAGE_IMPORT_DESCRIPTOR *piid; pidh = (IMAGE_DOS_HEADER *)ImageBase;
pinh = (IMAGE_NT_HEADERS *)((DWORD)ImageBase + pidh->e_lfanew);
pSymbolTable = &pinh->OptionalHeader.DataDirectory[1];
piid =(IMAGE_IMPORT_DESCRIPTOR *)((DWORD)ImageBase + pSymbolTable->VirtualAddress);
IMAGE_THUNK_DATA *pitd_org,*pitd_1st;
IMAGE_IMPORT_BY_NAME *piibn;
do
{
pitd_org = (IMAGE_THUNK_DATA *)((DWORD)ImageBase + piid->OriginalFirstThunk);
pitd_1st = (IMAGE_THUNK_DATA *)((DWORD)ImageBase + piid->FirstThunk);
do
{
piibn = (IMAGE_IMPORT_BY_NAME *)((DWORD)ImageBase + *((DWORD *)pitd_org));
PROC *pAPIFunction = (PROC *)(pitd_1st->u1.Function);
if (!strcmp(szApiName,(char *)piibn->Name))
{
DWORD addrNewAPIFunction = (DWORD)MyCreateFileW;
DWORD written = 0;
DWORD oldAccess; pg_data->oldAPIFunction = (tAPIFunction)(pAPIFunction);
/*Change Memeory State*/
VirtualProtect(&pitd_1st->u1.Function,sizeof(DWORD),PAGE_EXECUTE_READWRITE,&oldAccess);
showerr("VirtualProtect");
pg_data->addrAPIEntryPoint = (DWORD)&pitd_1st->u1.Function;
/*Write Process Memory*/
WriteProcessMemory(GetCurrentProcess(),&pitd_1st->u1.Function
, &addrNewAPIFunction,sizeof(DWORD), &written);
showerr("WriteProcessMemory on Hook");
}
pitd_org++;
pitd_1st++;
}
while (pitd_1st->u1.Function);
piid++;
} while (piid->FirstThunk + piid->Characteristics + piid->ForwarderChain + piid->Name + piid->TimeDateStamp);/****************************************/
初步怀疑是这两个循环的判断条件有问题,特别是最后这句while (piid->FirstThunk + piid->Characteristics + piid->ForwarderChain + piid->Name + piid->TimeDateStamp);没太看懂为什么要怎么写
为什么NOTEPAD就通过,其他进程就出问题呢?
一、IMAGE_IMPORT_BY_NAME不一定存在,如果不存在而仍然使用不安全的字符串操作函数当然会爆进程;
二、每个DLL对应一个模块基址,而不是所有RVA都是用进程的RVA。