本帖最后由 jianye112 于 2014-01-12 16:58:10 编辑

解决方案 »

  1.   

    Uses
      PSAPI;EnumProcessModules
      

  2.   


    动态加载的hook loadlibrary/ExA/ExW才能得到,静态的通过输入表加载的是由系统加载的,且不说系统未通过load系函数,系统加载的时候你都没能hook上,所以采用1楼的方法枚举吧。
      

  3.   


    这个是得系统进程的吧?
    我是要列当前程序加载的DLL列表
      

  4.   

    可以绕过LoadLibrary来加载动态库哦!
    这样你Hook这函数就没用咯
      

  5.   

    查了一天资料,搞明白了!EnumProcessModules 列出了。怎么把引用的DLL替换成我自己的呢? 是我自己当前程序的。
    .
      

  6.   


    是你自己程序的话,想加载哪个就加载哪个,别人程序你注入了的话,HOOK LoadLibraryXX之流能替换掉一部分,还有就是你把人家dll改名,比如人家原来叫a.dll,你改成b.dll,自己写个托管dll叫a.dll导出原来a.dll中的所有函数,然后加载b.dll,这个我之前搞过一个现成工具,可供参考。http://www.unpack.cn/thread-28272-1-1.html
      

  7.   

    我的比较简单。
    软件默认是调用c:\windows\system32下的dll
    我就想让我的程序调用当前目录下的相同dll
      

  8.   

    非系统dll的话,且软件是通过输入表,或者LoadLibrary未指明绝对路径的情况下,会优先加载软件目录下的同名dll,系统dll的话得分情况了,xp下直接可以丢入和系统重名的dll进行劫持,当然你得完成函数转发,楼上有小工具可以帮助你进行系统函数转发,vista win7下需要修改注册表,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs这个键值下,对应的系统dll需要删除后重启,劫持才能生效。
      

  9.   

    我hook 前就加载的DLL怎么处理呢?
      

  10.   

    只要不是LoadLibrary指定绝对目录加载的,丢同名dll到软件目录。LoadLibrary加载的,你自然可以在他LoadLibrary之前HOOK上,方法很多,比如你可以添加输入表,或者劫持系统dll注入。
      

  11.   

    MSDN上直接抄#include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    #include <psapi.h>void PrintModules( DWORD processID )
    {
        HMODULE hMods[1024];
        HANDLE hProcess;
        DWORD cbNeeded;
        unsigned int i;    // Print the process identifier.    printf( "\nProcess ID: %u\n", processID );    // Get a list of all the modules in this process.    hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                PROCESS_VM_READ,
                                FALSE, processID );
        if (NULL == hProcess)
            return;    if( EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
        {
            for ( i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ )
            {
                TCHAR szModName[MAX_PATH];            // Get the full path to the module's file.            if ( GetModuleFileNameEx(hProcess, hMods[i], szModName,
                                         sizeof(szModName)/sizeof(TCHAR)))
                {
                    // Print the module name and handle value.                _tprintf(TEXT("\t%s (0x%08X)\n"),
                             szModName, hMods[i]);
                }
            }
        }    CloseHandle( hProcess );
    }
      

  12.   

    这个我已经弄出来了。那个在exe运行前加载的dll怎么hook或替换?procedure TForm1.Button5Click(Sender: TObject);
    var
      i: integer;
      hModule: array[0..1024] of DWORD;
      cb: Cardinal;
      FileName: array[0..MAX_PATH] of char;
    begin
      Memo1.Clear;
      if EnumProcessModules(GetCurrentProcess(), @hModule, sizeof(hModule), cb) then
        begin
          for i := 0 to Math.Floor(cb / sizeof(DWORD)) do
            begin
              GetModuleFileName(hModule[i], @FileName, sizeof(FileName));
              Memo1.Lines.Add(FileName);  
            end;
        end;
    end;