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 遇到问题需要关闭。我们对此引起的不便表示抱歉。”

解决方案 »

  1.   

    我以为simpletest是ANSI的缘故,改为UNICODE了,问题依旧
      

  2.   

    IMAGE_DOS_HEADER *pidh;
    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);没太看懂为什么要怎么写
      

  3.   

    进一步明确问题出在这段代码上:PROC *pAPIFunction = (PROC *)(pitd_1st->u1.Function);
    为什么NOTEPAD就通过,其他进程就出问题呢?
      

  4.   

    那段hook代码我也是从你这里才看到~~
      

  5.   

    发这贴以后处理了好几个问题,大概是:
    一、IMAGE_IMPORT_BY_NAME不一定存在,如果不存在而仍然使用不安全的字符串操作函数当然会爆进程;
    二、每个DLL对应一个模块基址,而不是所有RVA都是用进程的RVA。