首页
社区
课程
招聘
PE输入表转向的疑问
发表于: 2010-3-22 15:08 5359

PE输入表转向的疑问

2010-3-22 15:08
5359
在PE里有输入表,有种转向的情况。
比如,调用kernel32.dll里的HeapAlloc时,会转向到NTDLL.dll里的RtlAllocateHeap。
现在反汇编kernel32.dll找到HeapAlloc的入口处如下:

.text:7C809064                 public HeapAlloc
.text:7C809064 ; LPVOID __stdcall HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes)
.text:7C809064 HeapAlloc       db 'NTDLL.RtlAllocateHeap',0

发现只有db 'NTDLL.RtlAllocateHeap',0这样的数据,不是执行指令,当我们call HeapAlloc函数时,不是跳转到此要执行吗?

还有类似这种转向的情况,写dll程序怎么写才能编译生成这样式的?

求解上面2个问题。
PS:初学者,尽量讲细点。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 2513
活跃值: (580)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
你用OD动态跟一下就知道原因了
2010-3-22 16:42
0
雪    币: 1981
活跃值: (771)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
3
当我们call HeapAlloc函数时,不是跳转到此要执行吗?

IDA是静态反汇编,看到的就是这样的。要想看到RtlAllocateHeap的代码用OD去跟

还有类似这种转向的情况,写dll程序怎么写才能编译生成这样式的?


一般的DLL用IDA看就是这样的。
2010-3-22 17:05
0
雪    币: 75
活跃值: (728)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
你提到这种情况据我理解并不是 "forward"
RtlAllocateHeap是kernel32.dll的一个导入函数,并不是你说的转向。"forward"涉及的是Bound Import directory,前后调用的函数名并不会发生变化.
2010-3-22 17:32
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
WINDOWS的函数调用都是把 CALL  [函数地址],而不是 CALL 函数地址,明白没有?
2010-3-22 19:15
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
也就是调用的是函数地址的指针,而不是函数地址
2010-3-22 19:16
0
雪    币: 63
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我弄错了,上面那不是HeapAlloc的入口处,只是导出表里的函数名字。
2010-3-22 20:45
0
雪    币: 63
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我把前提弄错了,sorry
2010-3-22 20:55
0
雪    币: 63
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我把问题搞错了,不过你说的好像有点问题,

“前后调用的函数名不变”?

我觉的函数名完全可以不同,只是在bound import这不需要函数名,只有dll名就够了。

具体比如:对于kernel32.dll里的HeapAlloc函数,
kernel32.dll输入表里有ntdll.dll里的RtlAllocateHeap,输出表里有ntdll.RtlAllocateHeap,但没有任何实现,只是做一下转向
2010-3-22 21:01
0
雪    币: 63
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
发现了问题,kernel32.dll里没有任何执行代码,只是直接转到了ntdll里的RtlAllocateHeap函数实现里
2010-3-22 21:02
0
雪    币: 63
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
[QUOTE=liuyq;779924]WINDOWS的函数调用都是把 CALL  [函数地址],而不是 CALL 函数地址,明白没有?[/QUOTE]

哦,这样就不需要jmp stub了
2010-3-22 21:05
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
是不是 看看TMD是如何处理forword就了解了
2010-3-22 22:26
0
雪    币: 75
活跃值: (728)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
我明白你的意思,呵呵,我说的 “forward” 是关于绑定导入的,是快速动态链接的一种方式,只要bound import directory以及bound import  forward ref里面描述的dll的时间戳和本系统的dll时间戳一致,就可以用绑定导入了,不会涉及函数名改不改变的问题,哎,对不起啊,抬你杠了,原以为你 在绑定导入 普通导入上弄混淆了
2010-3-23 00:21
0
游客
登录 | 注册 方可回帖
返回
//