以前都是通过输出表计算出 函数内存地址... 直接调用
今天 遇见 kernel32.dll 中的 HeapFree 计算出的内存地址始终不对..
它好象对应的是一个字符串 "NTDLL.RtlFreeHeap"
输入表
ordinal RVA 偏移量 函数名
020C 0000910C 0000850C HeapFree
7C80910C 4E 54 44 4C 4C 2E 52 74 6C 46 72 65 65 48 65 61 NTDLL.RtlFreeHea
7C80911C 70 p
这个函数比较特殊? 还怎么?
用UE一看 还是有一些函数 是对应的 NTDLL的
00008400h: 73 74 72 6C 65 6E 41 00 6C 73 74 72 6C 65 6E 57 ; strlenA.lstrlenW
00008410h: 00 4E 54 44 4C 4C 2E 52 74 6C 41 64 64 56 65 63 ; .NTDLL.RtlAddVec
00008420h: 74 6F 72 65 64 45 78 63 65 70 74 69 6F 6E 48 61 ; toredExceptionHa
00008430h: 6E 64 6C 65 72 00 4E 54 44 4C 4C 2E 52 74 6C 44 ; ndler.NTDLL.RtlD
00008440h: 65 63 6F 64 65 50 6F 69 6E 74 65 72 00 4E 54 44 ; ecodePointer.NTD
00008450h: 4C 4C 2E 52 74 6C 44 65 63 6F 64 65 53 79 73 74 ; LL.RtlDecodeSyst
00008460h: 65 6D 50 6F 69 6E 74 65 72 00 4E 54 44 4C 4C 2E ; emPointer.NTDLL.
00008470h: 52 74 6C 44 65 6C 65 74 65 43 72 69 74 69 63 61 ; RtlDeleteCritica
00008480h: 6C 53 65 63 74 69 6F 6E 00 4E 54 44 4C 4C 2E 52 ; lSection.NTDLL.R
00008490h: 74 6C 45 6E 63 6F 64 65 50 6F 69 6E 74 65 72 00 ; tlEncodePointer.
000084a0h: 4E 54 44 4C 4C 2E 52 74 6C 45 6E 63 6F 64 65 53 ;NTDLL.RtlEncodeS
000084b0h: 79 73 74 65 6D 50 6F 69 6E 74 65 72 00 4E 54 44 ; ystemPointer.NTD
000084c0h: 4C 4C 2E 52 74 6C 45 6E 74 65 72 43 72 69 74 69 ; LL.RtlEnterCriti
000084d0h: 63 61 6C 53 65 63 74 69 6F 6E 00 4E 54 44 4C 4C ; calSection.NTDLL
000084e0h: 2E 52 74 6C 47 65 74 4C 61 73 74 57 69 6E 33 32 ; .RtlGetLastWin32
000084f0h: 45 72 72 6F 72 00 4E 54 44 4C 4C 2E 52 74 6C 41 ; Error.NTDLL.RtlA
00008500h: 6C 6C 6F 63 61 74 65 48 65 61 70 00 4E 54 44 4C ; llocateHeap.NTDL
00008510h: 4C 2E 52 74 6C 46 72 65 65 48 65 61 70 00 4E 54 ; L.RtlFreeHeap.NT
00008520h: 44 4C 4C 2E 52 74 6C 52 65 41 6C 6C 6F 63 61 74 ; DLL.RtlReAllocat
00008530h: 65 48 65 61 70 00 4E 54 44 4C 4C 2E 52 74 6C 53 ;eHeap.NTDLL.RtlS
00008540h: 69 7A 65 48 65 61 70 00 4E 54 44 4C 4C 2E 52 74 ; izeHeap.NTDLL.Rt
00008550h: 6C 49 6E 69 74 69 61 6C 69 7A 65 53 4C 69 73 74 ; lInitializeSList
00008560h: 48 65 61 64 00 4E 54 44 4C 4C 2E 52 74 6C 49 6E ; Head.NTDLL.RtlIn
00008570h: 74 65 72 6C 6F 63 6B 65 64 46 6C 75 73 68 53 4C ; terlockedFlushSL
00008580h: 69 73 74 00 4E 54 44 4C 4C 2E 52 74 6C 49 6E 74 ; ist.NTDLL.RtlInt
00008590h: 65 72 6C 6F 63 6B 65 64 50 6F 70 45 6E 74 72 79 ; erlockedPopEntry
000085a0h: 53 4C 69 73 74 00 4E 54 44 4C 4C 2E 52 74 6C 49 ; SList.NTDLL.RtlI
000085b0h: 6E 74 65 72 6C 6F 63 6B 65 64 50 75 73 68 45 6E ; nterlockedPushEn
000085c0h: 74 72 79 53 4C 69 73 74 00 4E 54 44 4C 4C 2E 52 ; trySList.NTDLL.R
000085d0h: 74 6C 4C 65 61 76 65 43 72 69 74 69 63 61 6C 53 ; tlLeaveCriticalS
000085e0h: 65 63 74 69 6F 6E 00 4E 54 44 4C 4C 2E 52 74 6C ; ection.NTDLL.Rtl
000085f0h: 51 75 65 72 79 44 65 70 74 68 53 4C 69 73 74 00 ; QueryDepthSList.
00008600h: 4E 54 44 4C 4C 2E 52 74 6C 52 65 6D 6F 76 65 56;NTDLL.RtlRemoveV
00008610h: 65 63 74 6F 72 65 64 45 78 63 65 70 74 69 6F 6E ; ectoredException
00008620h: 48 61 6E 64 6C 65 72 00 4E 54 44 4C 4C 2E 52 74 ; Handler.NTDLL.Rt
00008630h: 6C 52 65 73 74 6F 72 65 4C 61 73 74 57 69 6E 33 ; lRestoreLastWin3
不知其原因... 是不是 这种函数不能通过输出表计算
问题已经解决::
解决方法
这种类型的函数.. 要想通过输出表计算出内存地址... 还要继续下去..
DLL名与函数名之间有个.
要先查找到dll名 与 函数名..
继续 GetProcAddress 就可以获取真实内存地址....
HeapFree 对应的函数 NTDLL.RtlFreeHeap
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)