首页
社区
课程
招聘
未解决 获取内存加载的dll的句柄或基址 50.00雪花
发表于: 2018-12-13 19:40 4954

未解决 获取内存加载的dll的句柄或基址 50.00雪花

2018-12-13 19:40
4954
一个dll放到资源里然后 加载到内存在调用里面的导出 函数,请问可以通过什么方法 知道这个资源里dll的地址或者dll句柄 !或者说在我不知道这个dll的名字情况下如何获取这个DLL的名字或者地址句柄   通过什么方式可以遍历出来!帮忙写下C代码最好注释 谢谢看雪大神们

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 6551
活跃值: (3822)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
exe 是自己写的吗。 如果是的话 无需知道 dll名称 和 句柄
2018-12-14 00:47
1
雪    币: 4006
活跃值: (631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
名字应该可以根据pe信息得到,内存加载可以通过查询内存属性得到?
2018-12-14 10:49
0
雪    币: 4831
活跃值: (479)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
或许换个思路?Frida Hook
frida -p pid
Process.enumerateModules(
{             
              onMatch: function(module){console.log(module.name,module.base)},
              onComplete: function(){console.log("Find it!!!!!!")}
})
最后于 2018-12-14 13:11 被xiaokangpwn编辑 ,原因:
2018-12-14 13:08
0
雪    币: 130
活跃值: (639)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
EXE不是自己 写的 DLL名字也不知道现在在想 怎么通过遍历得到
2018-12-14 20:59
0
雪    币: 199
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不需要遍历
1.打开LordPE.EXE
2.pe编辑器 -选择你要编辑的exe
3.选目录
4.选输入表   【...】
5.输入表里,如果这里没有你的dll,在这里添加
6.选中dll
7.搜你要调用的函数
8.勾选总是查看 FirstThunk
9.复制 thunk偏移
10.打开计算器程序员模式, 16进制粘贴地址+镜像地址00400000  = 你要的CALL 地址
这个地址只是固定的指针地址哦
汇编调用的时候要这样  call dword ptr ds:[地址] 而不是 call 地址

附贴图

2018-12-19 15:26
0
雪    币: 4076
活跃值: (2788)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
7

通过TEB遍历dll

nt!_TEB
   +0x000 NtTib            : _NT_TIB
   +0x01c EnvironmentPointer : Ptr32 Void
   +0x020 ClientId         : _CLIENT_ID
   +0x028 ActiveRpcHandle  : Ptr32 Void
   +0x02c ThreadLocalStoragePointer : Ptr32 Void
   +0x030 ProcessEnvironmentBlock : Ptr32 _PEB //找到PEB地址
   +0x034 LastErrorValue   : Uint4B
   +0x038 CountOfOwnedCriticalSections : Uint4B
   +0x03c CsrClientThread  : Ptr32 Void
   +0x040 Win32ThreadInfo  : Ptr32 Void
   +0x044 User32Reserved   : [26] Uint4B
   +0x0ac UserReserved     : [5] Uint4B
   +0x0c0 WOW32Reserved    : Ptr32 Void
   +0x0c4 CurrentLocale    : Uint4B
   +0x0c8 FpSoftwareStatusRegister : Uint4B
   +0x0cc SystemReserved1  : [54] Ptr32 Void
   +0x1a4 ExceptionCode    : Int4B
   +0x1a8 ActivationContextStack : _ACTIVATION_CONTEXT_STACK
   +0x1bc SpareBytes1      : [24] UChar
   +0x1d4 GdiTebBatch      : _GDI_TEB_BATCH
   +0x6b4 RealClientId     : _CLIENT_ID
   +0x6bc GdiCachedProcessHandle : Ptr32 Void
   +0x6c0 GdiClientPID     : Uint4B
   +0x6c4 GdiClientTID     : Uint4B
   +0x6c8 GdiThreadLocalInfo : Ptr32 Void
   +0x6cc Win32ClientInfo  : [62] Uint4B
   +0x7c4 glDispatchTable  : [233] Ptr32 Void
   +0xb68 glReserved1      : [29] Uint4B
   +0xbdc glReserved2      : Ptr32 Void
   +0xbe0 glSectionInfo    : Ptr32 Void
   +0xbe4 glSection        : Ptr32 Void
   +0xbe8 glTable          : Ptr32 Void
   +0xbec glCurrentRC      : Ptr32 Void
   +0xbf0 glContext        : Ptr32 Void
   +0xbf4 LastStatusValue  : Uint4B
   +0xbf8 StaticUnicodeString : _UNICODE_STRING
   +0xc00 StaticUnicodeBuffer : [261] Uint2B
   +0xe0c DeallocationStack : Ptr32 Void
   +0xe10 TlsSlots         : [64] Ptr32 Void
   +0xf10 TlsLinks         : _LIST_ENTRY
   +0xf18 Vdm              : Ptr32 Void
   +0xf1c ReservedForNtRpc : Ptr32 Void
   +0xf20 DbgSsReserved    : [2] Ptr32 Void
   +0xf28 HardErrorsAreDisabled : Uint4B
   +0xf2c Instrumentation  : [16] Ptr32 Void
   +0xf6c WinSockData      : Ptr32 Void
   +0xf70 GdiBatchCount    : Uint4B
   +0xf74 InDbgPrint       : UChar
   +0xf75 FreeStackOnTermination : UChar
   +0xf76 HasFiberData     : UChar
   +0xf77 IdealProcessor   : UChar
   +0xf78 Spare3           : Uint4B
   +0xf7c ReservedForPerf  : Ptr32 Void
   +0xf80 ReservedForOle   : Ptr32 Void
   +0xf84 WaitingOnLoaderLock : Uint4B
   +0xf88 Wx86Thread       : _Wx86ThreadState
   +0xf94 TlsExpansionSlots : Ptr32 Ptr32 Void
   +0xf98 ImpersonationLocale : Uint4B
   +0xf9c IsImpersonating  : Uint4B
   +0xfa0 NlsCache         : Ptr32 Void
   +0xfa4 pShimData        : Ptr32 Void
   +0xfa8 HeapVirtualAffinity : Uint4B
   +0xfac CurrentTransactionHandle : Ptr32 Void
   +0xfb0 ActiveFrame      : Ptr32 _TEB_ACTIVE_FRAME
   +0xfb4 SafeThunkCall    : UChar
   +0xfb5 BooleanSpare     : [3] UChar

PEB

nt!_PEB
   +0x000 InheritedAddressSpace : UChar
   +0x001 ReadImageFileExecOptions : UChar
   +0x002 BeingDebugged    : UChar
   +0x003 SpareBool        : UChar
   +0x004 Mutant           : Ptr32 Void
   +0x008 ImageBaseAddress : Ptr32 Void
   +0x00c Ldr              : Ptr32 _PEB_LDR_DATA //找到LDR地址
   +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS
   +0x014 SubSystemData    : Ptr32 Void
   +0x018 ProcessHeap      : Ptr32 Void
   +0x01c FastPebLock      : Ptr32 _RTL_CRITICAL_SECTION
   +0x020 FastPebLockRoutine : Ptr32 Void
   +0x024 FastPebUnlockRoutine : Ptr32 Void
   +0x028 EnvironmentUpdateCount : Uint4B
   +0x02c KernelCallbackTable : Ptr32 Void
   +0x030 SystemReserved   : [1] Uint4B
   +0x034 AtlThunkSListPtr32 : Uint4B
   +0x038 FreeList         : Ptr32 _PEB_FREE_BLOCK
   +0x03c TlsExpansionCounter : Uint4B
   +0x040 TlsBitmap        : Ptr32 Void
   +0x044 TlsBitmapBits    : [2] Uint4B
   +0x04c ReadOnlySharedMemoryBase : Ptr32 Void
   +0x050 ReadOnlySharedMemoryHeap : Ptr32 Void
   +0x054 ReadOnlyStaticServerData : Ptr32 Ptr32 Void
   +0x058 AnsiCodePageData : Ptr32 Void
   +0x05c OemCodePageData  : Ptr32 Void
   +0x060 UnicodeCaseTableData : Ptr32 Void
   +0x064 NumberOfProcessors : Uint4B
   +0x068 NtGlobalFlag     : Uint4B
   +0x070 CriticalSectionTimeout : _LARGE_INTEGER
   +0x078 HeapSegmentReserve : Uint4B
   +0x07c HeapSegmentCommit : Uint4B
   +0x080 HeapDeCommitTotalFreeThreshold : Uint4B
   +0x084 HeapDeCommitFreeBlockThreshold : Uint4B
   +0x088 NumberOfHeaps    : Uint4B
   +0x08c MaximumNumberOfHeaps : Uint4B
   +0x090 ProcessHeaps     : Ptr32 Ptr32 Void
   +0x094 GdiSharedHandleTable : Ptr32 Void
   +0x098 ProcessStarterHelper : Ptr32 Void
   +0x09c GdiDCAttributeList : Uint4B
   +0x0a0 LoaderLock       : Ptr32 Void
   +0x0a4 OSMajorVersion   : Uint4B
   +0x0a8 OSMinorVersion   : Uint4B
   +0x0ac OSBuildNumber    : Uint2B
   +0x0ae OSCSDVersion     : Uint2B
   +0x0b0 OSPlatformId     : Uint4B
   +0x0b4 ImageSubsystem   : Uint4B
   +0x0b8 ImageSubsystemMajorVersion : Uint4B
   +0x0bc ImageSubsystemMinorVersion : Uint4B
   +0x0c0 ImageProcessAffinityMask : Uint4B
   +0x0c4 GdiHandleBuffer  : [34] Uint4B
   +0x14c PostProcessInitRoutine : Ptr32     void
   +0x150 TlsExpansionBitmap : Ptr32 Void
   +0x154 TlsExpansionBitmapBits : [32] Uint4B
   +0x1d4 SessionId        : Uint4B
   +0x1d8 AppCompatFlags   : _ULARGE_INTEGER
   +0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER
   +0x1e8 pShimData        : Ptr32 Void
   +0x1ec AppCompatInfo    : Ptr32 Void
   +0x1f0 CSDVersion       : _UNICODE_STRING
   +0x1f8 ActivationContextData : Ptr32 Void
   +0x1fc ProcessAssemblyStorageMap : Ptr32 Void
   +0x200 SystemDefaultActivationContextData : Ptr32 Void
   +0x204 SystemAssemblyStorageMap : Ptr32 Void
   +0x208 MinimumStackCommit : Uint4B

typedef struct _PEB_LDR_DATA {
  BYTE       Reserved1[8];
  PVOID      Reserved2[3];
  LIST_ENTRY InMemoryOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA;

/*
InMemoryOrderModuleList
双向链表的头部,包含进程的已加载模块。列表中的每个项目都是指向LDR_DATA_TABLE_ENTRY结构的指针

*/
typedef struct _LIST_ENTRY {
   struct _LIST_ENTRY *Flink;//前一个
   struct _LIST_ENTRY *Blink;//后一个 根据这个一直遍历下去,最后会回到第一个
} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;

typedef struct _LDR_DATA_TABLE_ENTRY {
    PVOID Reserved1[2];
    LIST_ENTRY InMemoryOrderLinks;
    PVOID Reserved2[2];
    PVOID DllBase;//dll基地址
    PVOID EntryPoint;
    PVOID Reserved3;
    UNICODE_STRING FullDllName;//dll名称
    BYTE Reserved4[8];
    PVOID Reserved5[3];
    union {
        ULONG CheckSum;
        PVOID Reserved6;
    };
    ULONG TimeDateStamp;
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
2018-12-25 20:21
0
雪    币: 1573
活跃值: (198)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
通过gs寄存器获得kernel32.dll的基址,再kernel32.dll的导出表中遍历获得GetModuleHandle的地址,然后调用之,就能够得到已经加载到内存的 你想获得的任何dll的基址,类似的,还可以通过遍历kernel32.dll的导出表获得LoadLibraryA、GetProAddress的地址,有了这3个API的地址,你想要的dll以及API的地址都可以轻松获得。下面贴上获得GetProcAddress函数地址的Shellcode代码(win7 x64旗舰版实测通过),获取GetModuleHandle地址的代码完全类似,只需要修改标注出来的几个地方。
_rsp_address                dq        ?
;szGetModuleHandle        db        'GetModuleHandle',0                                ;GetModuleHandle字符串
szGetProcAddress     db        'GetProcAddress',0                                ;GetProAddress字符串
;szCmd                        db        'C:\Windows\System32\cmd.exe',0
szKeymsLock                        db        'F:\Windows\KeymsLock\KeymsLock.exe',0
szWinExec                db        'WinExec',0

_NewEntry:
;********************************************************************
; 重定位并获取一些 API 的入口地址
;********************************************************************
       call        @F
@@:
       pop        rbx
       mov        rax,offset @b
       sub        rbx,rax
;********************************************************************
;获取Kernel32.dll基址
       mov rax,[rsp]
       mov        [rbx+_rsp_address],rax
                               
       mov r12,gs:[60h]                                        ;peb
       mov r12,[r12+0x18]                                        ;peb==>LDR
    mov r12,[r12+0x20]                              ;peb.LDR.InMemoryOrderModuleList
    mov r12,[r12]                                   ;2st _LIST_ENTRY
    ;mov r8,[r12+0x20]                              ;ntdll.dll 基址
    mov r12,[r12]                                   ;3st _LIST_ENTRY
    mov r12,[r12+0x20]                              ;r12为 kernel32.dll 基址
       .if        ! r12
               jmp        _ToOldEntry
       .endif

       ;遍历Kernel32.dll的导出表获取GetProcAddress地址
       mov r14,r12
       xor rax,rax
       mov eax,dword ptr [r14+0x3c]
       add r14,rax                                                        ;assume r14:ptr IMAGE_NT_HEADERS64
       mov eax,[r14+0x88]                                        ;mov eax,[r14].OptionalHeader.DataDirectory.VirtualAddress
       mov r14,r12
       add r14,rax                                                        ;assume r14:ptr IMAGE_EXPORT_DIRECTORY
       mov r13d,[r14+0x20]                                        ;mov r13d,[r14].AddressOfNames
       add r13,r12
       xor edx,edx
       mov eax,[r14+0x18]                                        ;.until edx>=[r14].NumberOfNames        
       .repeat
               xor rdi,rdi
               mov edi,dword ptr [r13]
               add rdi,r12
               lea rsi,[rbx+szGetProcAddress]                ;改变1
               mov ecx,0x0f                                                ;改变2,GetProcAddress+0结尾共15个字符,循环0f次; 若为GetModuleHandle,则为15+1=16(0x10)
               repz cmpsb
               .if ZERO?
                       jmp @F
               .endif
               add r13,4
               inc edx
       .until edx>=eax
       jmp _ToOldEntry
@@:        
       mov eax,[r14+0x24]
       add rax,r12
       movzx rax,word ptr [rax+rdx*2]
       shl rax,2
       mov edx,[r14+0x1c]
       add rdx,rax
       add rdx,r12
       mov eax,dword ptr [rdx]
       add rax,r12

       mov r15,rax                                                        ;保存GetProcAddress等的地址到r15

_ToOldEntry:
……
2019-1-1 15:08
0
雪    币: 1573
活跃值: (198)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
至于前面几行为什么是下面这样
    mov r12,gs:[60h]                                ;peb
    mov r12,[r12+0x18]                            ;peb==>LDR
    mov r12,[r12+0x20]                            ;peb.LDR.InMemoryOrderModuleList
    mov r12,[r12]                                     ;2st _LIST_ENTRY
    ;mov r8,[r12+0x20]                             ;ntdll.dll 基址
    mov r12,[r12]                                     ;3st _LIST_ENTRY
    mov r12,[r12+0x20]                            ;r12为 kernel32.dll 基址
在windbg中输入命令查看如下:
lkd> dt _TEB @$teb
nt!_TEB
   +0x000 NtTib            : _NT_TIB
   +0x038 EnvironmentPointer : (null) 
   +0x040 ClientId         : _CLIENT_ID
   +0x050 ActiveRpcHandle  : (null) 
   +0x058 ThreadLocalStoragePointer : 0x00000000`001422d0 Void
   +0x060 ProcessEnvironmentBlock : 0x000007ff`fffd9000 _PEB
   +0x068 LastErrorValue   : 0
   +0x06c CountOfOwnedCriticalSections : 0
   +0x070 CsrClientThread  : (null) 
   +0x078 Win32ThreadInfo  : 0xfffff900`c3357010 Void
   [……]

lkd> dt _PEB 0x000007ff`fffd9000
nt!_PEB
   +0x000 InheritedAddressSpace : 0 ''
   +0x001 ReadImageFileExecOptions : 0 ''
   +0x002 BeingDebugged    : 0 ''
   +0x003 BitField         : 0x8 ''
   +0x003 ImageUsesLargePages : 0y0
   +0x003 IsProtectedProcess : 0y0
   +0x003 IsLegacyProcess  : 0y0
   +0x003 IsImageDynamicallyRelocated : 0y1
   +0x003 SkipPatchingUser32Forwarders : 0y0
   +0x003 SpareBits        : 0y000
   +0x008 Mutant           : 0xffffffff`ffffffff Void
   +0x010 ImageBaseAddress : 0x00000001`3faf0000 Void
   +0x018 Ldr              : 0x00000000`7791d640 _PEB_LDR_DATA
   +0x020 ProcessParameters : 0x00000000`00142480 _RTL_USER_PROCESS_PARAMETERS
   +0x028 SubSystemData    : (null) 
   +0x030 ProcessHeap      : 0x00000000`00140000 Void
   +0x038 FastPebLock      : 0x00000000`77927ae0 _RTL_CRITICAL_SECTION
   [……]

结构体_PEB_LDR_DATA
typedef struct _PEB_LDR_DATA {
  ULONG                   Length;
  BOOLEAN                 Initialized;
  PVOID                   SsHandle;
  LIST_ENTRY              InLoadOrderModuleList; 
  LIST_ENTRY              InMemoryOrderModuleList;
  LIST_ENTRY              InInitializationOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA;

lkd> dt _PEB_LDR_DATA 0x00000000`7791d640
nt!_PEB_LDR_DATA
   +0x000 Length           : 0x58
   +0x004 Initialized      : 0x1 ''
   +0x008 SsHandle         : (null) 
   +0x010 InLoadOrderModuleList : _LIST_ENTRY [ 0x00000000`00143290 - 0x2d74e60 ]
   +0x020 InMemoryOrderModuleList : _LIST_ENTRY [ 0x00000000`001432a0 - 0x2d74e70 ]
   +0x030 InInitializationOrderModuleList : _LIST_ENTRY [ 0x00000000`001433a0 - 0x2d74e80 ]
   +0x040 EntryInProgress  : (null) 
   +0x048 ShutdownInProgress : 0 ''
   +0x050 ShutdownThreadId : (null)
   [……]

结构体 LIST_ENTRY
typedef struct _LIST_ENTRY {
   struct _LIST_ENTRY *Flink;
   struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;
贴上参考网页:
https://bbs.pediy.com/thread-149527.htm
http://mcdermottcybersecurity.com/articles/windows-x64-shellcode
2019-1-2 19:09
0
雪    币: 695
活跃值: (758)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
10
听上去是将dll作为exe的资源,在exe运行时读取该资源的字节,并使用内存加载技术将该dll加载如进程的地址空间?这里能确定是将资源的字节加载进本进程嘛?因为还有可能是将该资源的字节加载进其它进程,或者直接创建一个新进程。
2019-1-23 09:34
0
雪    币: 26
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
上次不是帮你搞了吗
2019-1-26 03:59
0
雪    币: 197
活跃值: (136)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12

// 获取DLL的导出函数

// lpBaseAddress: 内存DLL文件加载到进程中的加载基址

// lpszFuncName: 导出函数的名字

// 返回值: 返回导出函数的的地址

LPVOID PEGetProcAddress(LPVOID lpBaseAddress, PCHAR lpszFuncName)

{

LPVOID lpFunc = NULL;

// 获取导出表

PIMAGE_DOS_HEADER pDosHeader =(PIMAGE_DOS_HEADER)lpBaseAddress;

PIMAGE_NT_HEADERS pNtHeaders =(PIMAGE_NT_HEADERS)((BYTE *)pDosHeader + pDosHeader->e_lfanew);

PIMAGE_EXPORT_DIRECTORY pExportTable =(PIMAGE_EXPORT_DIRECTORY)((BYTE *)pDosHeader + pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);

// 获取导出表的数据

PDWORD lpAddressOfNamesArray =(PDWORD)((BYTE *)pDosHeader + pExportTable->AddressOfNames);

PCHAR lpFuncName = NULL;

PWORD lpAddressOfNameOrdinalsArray =(PWORD)((BYTE *)pDosHeader + pExportTable->AddressOfNameOrdinals);

WORD wHint =0;

PDWORD lpAddressOfFunctionsArray =(PDWORD)((BYTE *)pDosHeader + pExportTable->AddressOfFunctions);

DWORD dwNumberOfNames = pExportTable->NumberOfNames;

DWORD i =0;

// 遍历导出表的导出函数的名称, 并进行匹配

for(i =0; i < dwNumberOfNames; i++)

{

lpFuncName =(PCHAR)((BYTE *)pDosHeader + lpAddressOfNamesArray[i]);

if(0==::lstrcmpi(lpFuncName, lpszFuncName))

{

// 获取导出函数地址

wHint = lpAddressOfNameOrdinalsArray[i];

lpFunc =(LPVOID)((BYTE *)pDosHeader + lpAddressOfFunctionsArray[wHint]);

break;

}

}

return lpFunc;

}


2019-1-29 11:08
0
雪    币: 275
活跃值: (164)
能力值: ( LV3,RANK:27 )
在线值:
发帖
回帖
粉丝
13
通过遍历内存结构就可以了,但是你找到地址也没用,这个DLL没有被重定位,你没法直接调用,必需 Load一下或者重新定位 。不是说 DLL放资源就能直接用的,或者内存加载,你必需全部写一个加载器。memrun 
2019-1-30 17:04
0
游客
登录 | 注册 方可回帖
返回
//