精易论坛

标题: 随手笔记01. 使用 ntdll 的 LdrLoadDll 来加载动态库 [打印本页]

作者: 福仔    时间: 2019-8-20 01:56
标题: 随手笔记01. 使用 ntdll 的 LdrLoadDll 来加载动态库
  
变量名类 型静态数组备 注
hModule整数型 
pLdrLoadDll整数型 
str整数型UNICODE_STRING 结构指针
wzPath字节集dll目录
wzName字节集dll文件名
ulong整数型暂时不知道干嘛用,有知道的回复下
hUser32整数型加载dll后返回的句柄
pMessage整数型测试子程序
hModule = GetModuleHandleA (“ntdll.dll”)
pLdrLoadDll = GetProcAddress (hModule, “LdrLoadDll”)
如果真 (pLdrLoadDll = 0)
返回 ()

str = LocalAlloc ( #LMEM_ZEROINIT, 8)  ' x86是8个字节,一共3个成员,两个短整数,一个指针
wzName = A2W (“user32.dll”, )
wzPath = A2W (“C:\Windows\syswow64”, )
__set_short (str, 0, lstrlenW (取指针_字节集型 (wzName)) × 2)  ' dll文件名的字节数,不包含结束标志
__set_short (str, 2, __get_short (str, 0) + 2)  ' dll文件名的字节数,包含结束标志
__set (str, 4, 取指针_字节集型 (wzName))
如果真 (call_4 (pLdrLoadDll, 取指针_字节集型 (wzPath), 取指针_通用型 (ulong), str, 取指针_通用型 (hUser32)) ≠ 0)
LocalFree (str)
信息框 (“失败”, 0, , )
返回 ()

LocalFree (str)
pMessage = GetProcAddress (hUser32, “MessageBoxA”)
如果真 (pMessage = 0)
返回 ()
call_4 (pMessage, 0, 取指针_文本型 (“使用 LdrLoadDll 加载dll测试结果,能弹这个信息框表示成功”), 取指针_文本型 (“LdrLoadDll”), #MB_OK )




c++代码

  1. typedef struct _UNICODE_STRING {
  2.         USHORT Length;
  3.         USHORT MaximumLength;
  4.         PWSTR Buffer;
  5. } UNICODE_STRING, *PUNICODE_STRING;
  6. typedef NTSTATUS(NTAPI *LdrLoadDll)(PWSTR SearchPath, PULONG DllCharacteristics,
  7.         PUNICODE_STRING DllName, PVOID *BaseAddress);
  8. typedef int(WINAPI *fun_MessageBox)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
  9. int _tmain(int argc, _TCHAR* argv[])
  10. {
  11.         UNICODE_STRING str = { 0 };
  12.         str.Buffer = L"user32.dll";
  13.         str.Length = lstrlenW(str.Buffer) * sizeof(WCHAR);
  14.         str.MaximumLength = str.Length + 2;
  15.         HMODULE hModule = GetModuleHandleW(L"ntdll.dll");
  16.         LdrLoadDll pFun = (LdrLoadDll)GetProcAddress(hModule, "LdrLoadDll");
  17.         if (!pFun)return 0;

  18.         HMODULE hUser32 = 0;
  19.         ULONG ulong = 0;
  20.         HRESULT hr = pFun(L"C:\\Windows\\syswow64", &ulong, &str, (PVOID*)&hUser32);
  21.         if (hr != S_OK)
  22.         {
  23.                 cout << "载入dll失败" << endl;
  24.                 return 0;
  25.         }

  26.         fun_MessageBox pMessage = (fun_MessageBox)GetProcAddress(hUser32, "MessageBoxA");
  27.         if (!pMessage)return 0;
  28.         pMessage(NULL, "使用 LdrLoadDll 加载dll测试结果,能弹这个信息框表示成功", "LdrLoadDll", MB_OK);

  29.         return 0;
  30. }
复制代码


作者: a3780586510    时间: 2019-8-20 03:22
loadlibrareex的第3参数有说明
作者: fengyishen    时间: 2019-8-20 05:18
谢谢分享....
作者: kevin0830    时间: 2019-8-20 06:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: 315215    时间: 2019-8-20 07:45
这个加载有什么意义呢?
作者: xiaoniu1230    时间: 2019-8-20 08:20
感谢分享,又多了个思路 加载dll
作者: liun    时间: 2019-8-20 08:57
大佬  你以为这样我就看懂了嘛
作者: 酷易自绘    时间: 2019-8-20 11:11
加载动态库眼
作者: wjswzj0    时间: 2019-8-20 11:41
支持开源~!感谢分享
作者: 先锋小七    时间: 2019-8-21 10:04
本帖最后由 先锋小七 于 2019-8-21 12:34 编辑


还好我看懂了源码,调用成功

然后强迫症又把 LdrGetProcedureAddress 也加上去了,美滋滋

作者: 见与不见    时间: 2019-11-13 20:22
555555555555555555555555555555555555555555555555555555555555555555555
作者: chen19980515    时间: 2020-3-17 12:57
这个CALL4 是什么啊 可以说下吗 或者发份源码看看 谢谢啦
作者: ujff77    时间: 2020-4-21 17:28
支持开源~!感谢分享




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4