这是通过系统加载PE文件后获得的信息, 还是通过Mapfile等技术自己加载后获得的信息?
如果是你自己加载的,计算时好象要多考虑一个"偏移"...
本人从来没有遇到过这种问题. 

解决方案 »

  1.   

    to han012:是先用GetModuleHandle(null)得到自己的句柄,然后再强制转化成PdosHeader,
    然后由该指针得到dos头,然后……(就是上面我说的了)
      

  2.   

    我按你的说法,随手写了一个输出EXE中隐含调用的DLL名字的小程序.只要将它加入到你的主程序中然后编译,启动主程序,它就可以输出DLL名字. 我测试了工作很正常,也没有出现你说的问题.
    看看我的写法与你的有何不同? 期望得到你的结果.void GetDllName()
    {
    PIMAGE_DOS_HEADER pDosHdr;
    PIMAGE_NT_HEADERS pNTHeader;
    LPBYTE lpByte; HMODULE hModule= GetModuleHandle(NULL); // convert to PIMAGE_DOS_HEADER
    pDosHdr = (PIMAGE_DOS_HEADER)hModule; lpByte = (LPBYTE)pDosHdr; // get IMAGE_NT_HEADERS
    pNTHeader = (PIMAGE_NT_HEADERS)(lpByte + (pDosHdr->e_lfanew)); DWORD importsStartRVA;
    PIMAGE_IMPORT_DESCRIPTOR pImportDesc;
    LPCSTR lpName; importsStartRVA = pNTHeader->OptionalHeader.DataDirectory
                               [IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; // get address of first IMAGE_IMPORT_DESCRIPTOR
    pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)
    (importsStartRVA + pNTHeader->OptionalHeader.ImageBase); // dump DLL name linked implicitly
    while ( 1 )
    {
    // See if we've reached an empty IMAGE_IMPORT_DESCRIPTOR
    if ( (pImportDesc->TimeDateStamp==0 ) && 
                                             (pImportDesc->Name==0) )
    break; lpName = (LPCSTR)(pImportDesc->Name+
                                  pNTHeader->OptionalHeader.ImageBase);
    AfxMessageBox(lpName); pImportDesc++;
    }//end while
    }
      

  3.   

    to han012:很幸运能遇到一位你这么热心的高手。我自我介绍一下吧,我本来是个玩VB的,Delphi和C++都学过不太熟练。近来计划着做一个软件。里面非要用到拦截API的技术。呜!没办法,只有硬着头皮啃了。因为受不了 VC 奇慢的编译速度。所以我是用的Delphi实现的这个程序。我反复检查过,不应该有错。我的QQ是49023868。真诚的希望你能加我。另外有的问题一下子说不清楚,我还是通过QQ把我的Delphi源程序和编译出来的.exe传给你吧。你放心我绝对不会玩mincer那种把戏。
      

  4.   

    你太夸奖我了,我不是什么高手,只是工作时间比较长,接触的东西比较多而已.俗话说丑媳妇也能熬成婆. 说到拦截API,前些日子研究过一些, CSDN中关于此话题的帖子有很多,也有不少好的思想,你可以用关键字"HOOK API","API HOOK","拦截"等在CSDN论坛中检索一下,相信会对你有所帮助. 说实话我对Delphi不了解,只是大学时代学过PASCAL语言,不知道Delphi和PASCAL有多大区别...
    我也没有QQ, 如果你需要你可以发Mail给我. [email protected] 不过我可不一定能及时给你回复的罗.