能力值:
( LV2,RANK:10 )
2 楼
exe 是自己写的吗。 如果是的话 无需知道 dll名称 和 句柄
能力值:
( LV5,RANK:60 )
3 楼
名字应该可以根据pe信息得到,内存加载可以通过查询内存属性得到?
能力值:
( 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编辑
,原因:
能力值:
( LV2,RANK:10 )
5 楼
EXE不是自己 写的 DLL名字也不知道现在在想 怎么通过遍历得到
能力值:
( 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 地址
附贴图
能力值:
( LV10,RANK:170 )
7 楼
通过TEB遍历dllnt!_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;
能力值:
( 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: ……
能力值:
( 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
能力值:
( LV4,RANK:45 )
10 楼
听上去是将dll作为exe的资源,在exe运行时读取该资源的字节,并使用内存加载技术将该dll加载如进程的地址空间?这里能确定是将资源的字节加载进本进程嘛?因为还有可能是将该资源的字节加载进其它进程,或者直接创建一个新进程。
能力值:
( LV1,RANK:0 )
11 楼
上次不是帮你搞了吗
能力值:
( 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;
}
能力值:
( LV3,RANK:27 )
13 楼
通过遍历内存结构就可以了,但是你找到地址也没用,这个DLL没有被重定位,你没法直接调用,必需 Load一下或者重新定位 。不是说 DLL放资源就能直接用的,或者内存加载,你必需全部写一个加载器。memrun