DLL劫持之IAT类型(Loadlibrary)

Loadlibrary

Loadlibrary的底层是LoadLibraryEx

第三个参数:

  1. DONT_RESOLVE_DLL_REFERENCES : 这个标志用于告诉系统将DLL映射到调用进程的地址空间中,但是不调用DllMain并且不加载依赖Dll(只映射自己本身)。

  2. LOAD_LIBRARY_AS_DATAFILE : 这个标志与DONT_RESOLVE_DLL_REFERENCES标志相类似,因为系统只是将DLL映射到进程的地址空间中,就像它是数据文件一样。系统并不花费额外的时间来准备执行文件中的任何代码。

  3. LOAD_LIBRARY_SEARCH_USER_DIRS : 搜索路径的使用使用AddDllDirectorySetDllDirectory设置的路径(保护Dll自己和依赖Dll)。

  4. LOAD_LIBRARY_SEARCH_SYSTEM32 : 从%windows%\system32加载Dll和其依赖项。

  5. LOAD_LIBRARY_SEARCH_APPLICATION_DIR : 应用程序安装路径搜索Dll和其依赖项。

  6. LOAD_WITH_ALTERED_SEARCH_PATH: 按照如下目录搜索:

默认环境下LoadLibrary按照以下目录搜索

SetDllDirectory函数如下

跟到KernelBaseGetGlobalData

跟到0环可以发现,在转换之后可以得到路径

LoadLibraryExW函数原型

首先通过BaseGetProcessDllPath获取路径,然后调用LdrLoadDll加载dll

NTSTATUS __stdcall LdrLoadDll(PWSTR SearchPath, PULONG LoadFlags, PUNICODE_STRING DllName, PVOID *BaseAddress)
{
  //...
  if ( SearchPath )
  {
    result = RtlInitUnicodeStringEx(&DestinationString, SearchPath);
    if ( result < 0 )
      return result;
    NewSearchPath = &DestinationString;
  }
  else
  {
    NewSearchPath = &LdrpDefaultPath;
  }
  //...
  v7 = LdrpLoadDll(DllName, (int)NewSearchPath, v6, 1, 0, (int)&DllName);
  //...
  return v7;
}

再调用LdrpLoadDll

int __stdcall LdrpLoadDll(PCUNICODE_STRING Source, int a2, int a3, char a4, int a5, int a6)
{
    //...
    if ( !LdrpInLdrInit )
      RtlEnterCriticalSection(&LdrpLoaderLock);
    
    //...
    LdrpFindOrMapDll(*(PCUNICODE_STRING *)((char *)&v31 + 1), v29, a3, v27[0], (int)&v33, (int)&v31);

    //...
    if ( v21 & 0x1000000 )
        v22 = LdrpCorProcessImports((void *)v21, v33);
    else
        v22 = LdrpProcessStaticImports(v33, v29);
    //...

    LdrpRunInitializeRoutines(0);

    //...

    if ( !LdrpInLdrInit )
      RtlLeaveCriticalSection(&LdrpLoaderLock);
}

通过分析函数,其流程如下

  1. 加载锁RtlEnterCriticalSection(&LdrpLoaderLock)

  2. 通过LdrpFindOrMapDll加载dll

  3. 处理导入表信息

  4. 运行回调函数LdrpRunInitializeRoutines

  5. 释放锁RtlLeaveCriticalSection(&LdrpLoaderLock)

在第4步运行LdrpRunInitializeRoutines其实就是调用DllMain,也就是说加载dll首先会加载锁,再调用DllMain

相关推荐

  1. winhttp劫持dll

    2024-01-28 13:06:03       8 阅读
  2. 四、MySQLDML && DQL

    2024-01-28 13:06:03       31 阅读
  3. Web 安全点击劫持(Clickjacking)攻击详解

    2024-01-28 13:06:03       32 阅读
  4. 3.2 Python整数类型int

    2024-01-28 13:06:03       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-28 13:06:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-28 13:06:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-28 13:06:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-28 13:06:03       18 阅读

热门阅读

  1. ES如何搜索两个索引

    2024-01-28 13:06:03       32 阅读
  2. pnpm 用法

    2024-01-28 13:06:03       33 阅读
  3. 11.28校招 实习 内推 面经

    2024-01-28 13:06:03       28 阅读
  4. 在Python中的类是什么

    2024-01-28 13:06:03       38 阅读
  5. 2023华为od机试C卷【跳马问题】C语言 实现

    2024-01-28 13:06:03       31 阅读