找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 6203|回复: 5

还是LdrloadDll 函数的问题

[复制链接]

8

主题

51

回帖

0

精华

铜牌会员

积分
291
发表于 2014-12-23 22:22:34 | 显示全部楼层 |阅读模式
本帖最后由 huangchao209 于 2014-12-23 22:24 编辑

不知道为什么,对微软这个 未公开 LdrloadDll 函数使用搞不懂
之前弄个Delphi 的HOOK 这个函数搞不定,今天再试用C 写的 调用Ldrloaddll 加载 DLL 也没成功
VC 6编译器
现在请老大帮忙看看什么问题

上代码
  1. #include <stdio.h>
  2. #include <windows.h>

  3. typedef struct _UNICODE_STRING
  4. {
  5.         USHORT Length;
  6.         USHORT MaximumLength;
  7.         PWSTR Buffer;
  8. } UNICODE_STRING , *PUNICODE_STRING;

  9. typedef ULONG NTSTATUS ;

  10. typedef struct _LDR_DATA_TABLE_ENTRY
  11. {
  12.         LIST_ENTRY InLoadOrderLinks;
  13.         LIST_ENTRY InMemoryOrderModuleList;
  14.         LIST_ENTRY InInitializationOrderModuleList;
  15.         PVOID DllBase;
  16.         PVOID EntryPoint;
  17.         ULONG SizeOfImage;
  18.         UNICODE_STRING FullDllName;
  19.         UNICODE_STRING BaseDllName;
  20.         ULONG Flags;
  21.         USHORT LoadCount;
  22.         USHORT TlsIndex;
  23.         union
  24.         {
  25.                 LIST_ENTRY HashLinks;
  26.                 PVOID SectionPointer;
  27.         };
  28.         ULONG CheckSum;
  29.         union
  30.         {
  31.                 ULONG TimeDateStamp;
  32.                 PVOID LoadedImports;
  33.         };
  34.         PVOID EntryPointActivationContext;
  35.         PVOID PatchInformation;
  36. } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;

  37. typedef struct _PEB_LDR_DATA {
  38.         ULONG                   Length;
  39.         BOOLEAN                 Initialized;
  40.         PVOID                   SsHandle;
  41.         LIST_ENTRY              InLoadOrderModuleList;          //按加载顺序
  42.         LIST_ENTRY              InMemoryOrderModuleList;        //按内存顺序
  43.         LIST_ENTRY              InInitializationOrderModuleList;//按初始化顺序
  44.         PVOID          EntryInProgress;
  45. } PEB_LDR_DATA, *PPEB_LDR_DATA;

  46. //每个模块信息的LDR_MODULE部分
  47. typedef struct _LDR_MODULE {
  48.         LIST_ENTRY              InLoadOrderModuleList;         
  49.         LIST_ENTRY              InMemoryOrderModuleList;        
  50.         LIST_ENTRY              InInitializationOrderModuleList;
  51.         PVOID                   BaseAddress;
  52.         PVOID                   EntryPoint;
  53.         ULONG                   SizeOfImage;
  54.         UNICODE_STRING          FullDllName;
  55.         UNICODE_STRING          BaseDllName;
  56.         ULONG                   Flags;
  57.         SHORT                   LoadCount;
  58.         SHORT                   TlsIndex;
  59.         LIST_ENTRY              HashTableEntry;
  60.         ULONG                   TimeDateStamp;
  61. } LDR_MODULE, *PLDR_MODULE;

  62. VOID HideModule(HMODULE hLibrary)
  63. {
  64.         PPEB_LDR_DATA        pLdr = NULL;
  65.         PLDR_MODULE                FirstModule = NULL;
  66.         PLDR_MODULE                GurrentModule = NULL;
  67.         __try
  68.         {
  69.                 __asm
  70.                 {
  71.                         mov esi, fs:[0x30]
  72.                         mov esi, [esi + 0x0C]
  73.                         mov pLdr,esi
  74.                 }

  75.                 FirstModule = (PLDR_MODULE)(pLdr->InLoadOrderModuleList.Flink);
  76.                 GurrentModule = FirstModule;
  77.                 while(!(GurrentModule ->BaseAddress == hLibrary))
  78.                 {
  79.                         GurrentModule = (PLDR_MODULE)(GurrentModule->InLoadOrderModuleList.Blink);
  80.                         if(GurrentModule == FirstModule)
  81.                                 break;
  82.                 }
  83.                 if(GurrentModule->BaseAddress != hLibrary)
  84.                         return;

  85.                 //Dll解除链接
  86.                 ((PLDR_MODULE)(GurrentModule -> InLoadOrderModuleList.Flink))->InLoadOrderModuleList.Blink = GurrentModule -> InLoadOrderModuleList.Blink;
  87.                 ((PLDR_MODULE)(GurrentModule->InLoadOrderModuleList.Blink))->InLoadOrderModuleList.Flink = GurrentModule->InLoadOrderModuleList.Flink;
  88.                
  89.                 memset(GurrentModule->FullDllName.Buffer, 0, GurrentModule->FullDllName.Length);
  90.                 memset(GurrentModule, 0, sizeof(PLDR_MODULE));
  91.         }

  92.         __except(EXCEPTION_EXECUTE_HANDLER)
  93.         {
  94.                 return;
  95.         }
  96. }

  97. //LdrLoadDll function prototype
  98. typedef NTSTATUS (WINAPI *fLdrLoadDll)(IN PWCHAR PathToFile OPTIONAL,IN ULONG Flags OPTIONAL,IN PUNICODE_STRING ModuleFileName,OUT PHANDLE ModuleHandle);  

  99. //RtlInitUnicodeString function prototype
  100. typedef VOID (WINAPI *fRtlInitUnicodeString)(PUNICODE_STRING DestinationString,PCWSTR SourceString);  

  101. HMODULE                                        hntdll = NULL;  
  102. fLdrLoadDll                                _LdrLoadDll = NULL;  
  103. fRtlInitUnicodeString        _RtlInitUnicodeString = NULL;  

  104. HMODULE LoadDll(LPCSTR lpFileName)
  105. {  
  106.     if (hntdll == NULL)
  107.         {
  108.                 hntdll = GetModuleHandleA("ntdll.dll");
  109.                 printf("hntdll Handle %x\n",hntdll);
  110.         }  

  111.     if (_LdrLoadDll == NULL)
  112.         {
  113.                 _LdrLoadDll = (fLdrLoadDll)GetProcAddress (hntdll,"LdrLoadDll");
  114.                 printf("_LdrLoadDll Handle %x\n",_LdrLoadDll);
  115.         }  

  116.     if (_RtlInitUnicodeString == NULL)  
  117.     {
  118.                 _RtlInitUnicodeString = (fRtlInitUnicodeString)GetProcAddress (hntdll,"RtlInitUnicodeString");
  119.                 printf("_RtlInitUnicodeString Handle %x\n",_RtlInitUnicodeString);
  120.         }  
  121.        
  122.     int StrLen = lstrlenA(lpFileName);  
  123.     BSTR WideStr = SysAllocStringLen(NULL, StrLen);  
  124.     MultiByteToWideChar(CP_ACP, 0, lpFileName, StrLen, WideStr, StrLen);  
  125.        
  126.     UNICODE_STRING usDllName = { 0 };  
  127.     _RtlInitUnicodeString(&usDllName, WideStr);  
  128.     SysFreeString(WideStr);  
  129.        
  130.     HANDLE DllHandle = NULL;  
  131.     _LdrLoadDll(0, 0, &usDllName, &DllHandle);  
  132.        
  133.     return (HMODULE)DllHandle;  
  134. }

  135. int main()
  136. {
  137.         HMODULE hMydll = LoadDll("C:\Users\Administrator\Desktop\DELPHI DEMO\重载NTDLL\Test.dll");
  138.        
  139.         printf("hmydll Handle %x\n",hMydll);
  140.         printf("Test.dll Handle %x\n", GetModuleHandleA("Test.dll"));
  141.         //HideModule(hMydll);
  142.         MessageBox(NULL,"Hello",NULL,NULL);
  143.         return 0;
  144. }
复制代码

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2014-12-24 11:09:38 | 显示全部楼层
我也不懂。。。有好好的LoadLibrary不用非要用LdrloadDll。。。
这种找虐的事情我是懒的看的。

不过如果你的代码确定没问题,可能是你路径的问题。这种API应该是用NT路径的:\??\c:\xxx.exe

还有,你这么隐藏DLL没用的,内核里还有一份数据。你这么隐藏,在ARK里只能让你的DLL更加显眼。

8

主题

51

回帖

0

精华

铜牌会员

积分
291
 楼主| 发表于 2014-12-24 15:11:00 | 显示全部楼层
Tesla.Angela 发表于 2014-12-24 11:09
我也不懂。。。有好好的LoadLibrary不用非要用LdrloadDll。。。
这种找虐的事情我是懒的看的。

受教了,不过,我弄成功了
调用原始 NTDLL 里面 ldrloaddll 可以用
不过不正常调用 重载NTDLL 里面的LdrloadDll 函数
同样的函数 指针 如果调用原始的 ntdll 没问题,调用自己重载的就无法调用

问了下人,人家说重载的dll 不能用 GetProcAddress 获得函数地址,要获得dll的输出表地址才行
不知道是不是

8

主题

51

回帖

0

精华

铜牌会员

积分
291
 楼主| 发表于 2014-12-24 15:12:32 | 显示全部楼层
Tesla.Angela 发表于 2014-12-24 11:09
我也不懂。。。有好好的LoadLibrary不用非要用LdrloadDll。。。
这种找虐的事情我是懒的看的。

LoadLiibray 虽然调用简单,但是很多都不用这个函数 来加载DLL 直接用更底层 LdrloadDll 注入

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2014-12-24 15:16:29 | 显示全部楼层

RE: 还是LdrloadDll 函数的问题

huangchao209 发表于 2014-12-24 15:11
问了下人,人家说重载的dll 不能用 GetProcAddress 获得函数地址,要获得dll的输出表地址才行
不知道是不是


没这一说。还有。如果你真想拦截DLL注入进程,更加靠谱的是在LoadImageNotify里做。

8

主题

51

回帖

0

精华

铜牌会员

积分
291
 楼主| 发表于 2014-12-25 14:43:50 | 显示全部楼层
Tesla.Angela 发表于 2014-12-24 15:16
没这一说。还有。如果你真想拦截DLL注入进程,更加靠谱的是在LoadImageNotify里做。 ...

不过,在重载的ntdllL里面,无法正常调用里面的函数,现在搜索不到想要资料,我只知道有这种方法
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表