吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4751|回复: 6
上一主题 下一主题
收起左侧

[调试逆向] GetProcAddress找不到函数的问题(二分法)

  [复制链接]
跳转到指定楼层
楼主
MJ_B 发表于 2025-4-16 02:03 回帖奖励
本帖最后由 MJ_B 于 2025-4-16 17:02 编辑

写程序时发现GetProcAddress找不到函数的问题,详情看:https://www.52pojie.cn/thread-2012809-1-1.html,工具地址:https://www.52pojie.cn/thread-1986896-1-1.html

使用windbg wt指令跟踪下调用了哪些函数
[Asm] 纯文本查看 复制代码
0:000> wt
Tracing KERNEL32!GetProcAddressStub to return address 00007ff7`1e4e14f8
    2     0 [  0] KERNEL32!GetProcAddressStub
   13     0 [  0] KERNELBASE!GetProcAddressForCaller
   27     0 [  1]   ntdll!RtlInitAnsiString
   26    27 [  0] KERNELBASE!GetProcAddressForCaller
   44     0 [  1]   ntdll!LdrGetProcedureAddressForCaller
   13     0 [  2]     ntdll!LdrpObtainLockedEnclave
   10     0 [  3]       ntdll!RtlEnterCriticalSection
   20    10 [  2]     ntdll!LdrpObtainLockedEnclave
   19     0 [  3]       ntdll!RtlLeaveCriticalSection
   30    29 [  2]     ntdll!LdrpObtainLockedEnclave
   56    59 [  1]   ntdll!LdrGetProcedureAddressForCaller
   12     0 [  2]     ntdll!RtlAcquireSRWLockExclusive
  100    71 [  1]   ntdll!LdrGetProcedureAddressForCaller
    5     0 [  2]     ntdll!RtlReleaseSRWLockExclusive
  118    76 [  1]   ntdll!LdrGetProcedureAddressForCaller
   10     0 [  2]     ntdll!LdrpFindLoadedDllByAddress
   12     0 [  3]       ntdll!RtlAcquireSRWLockExclusive
   64    12 [  2]     ntdll!LdrpFindLoadedDllByAddress
    5     0 [  3]       ntdll!RtlReleaseSRWLockExclusive
   74    17 [  2]     ntdll!LdrpFindLoadedDllByAddress
  130   167 [  1]   ntdll!LdrGetProcedureAddressForCaller
   29     0 [  2]     ntdll!LdrpResolveProcedureAddress
   53     0 [  3]       ntdll!memset
   32    53 [  2]     ntdll!LdrpResolveProcedureAddress
    9     0 [  3]       ntdll!LdrpShouldModuleImportBeRedirected
   41    62 [  2]     ntdll!LdrpResolveProcedureAddress
   26     0 [  3]       ntdll!LdrpGetProcedureAddress
   43     0 [  4]         ntdll!RtlImageNtHeaderEx
  160    43 [  3]       ntdll!LdrpGetProcedureAddress
   57   265 [  2]     ntdll!LdrpResolveProcedureAddress
    6     0 [  3]       ntdll!_security_check_cookie
   67   271 [  2]     ntdll!LdrpResolveProcedureAddress
  135   505 [  1]   ntdll!LdrGetProcedureAddressForCaller
   15     0 [  2]     ntdll!LdrpDereferenceModule
  146   520 [  1]   ntdll!LdrGetProcedureAddressForCaller
   22     0 [  2]     ntdll!LdrpDereferenceModule
  164   542 [  1]   ntdll!LdrGetProcedureAddressForCaller
   22     0 [  2]     ntdll!LdrpReportError
   38     0 [  3]       ntdll!RtlInitUnicodeString
   36    38 [  2]     ntdll!LdrpReportError
   27     0 [  3]       ntdll!RtlInitAnsiString
   44    65 [  2]     ntdll!LdrpReportError
  195     0 [  3]       ntdll!RtlAnsiStringToUnicodeString
   71   260 [  2]     ntdll!LdrpReportError
    6     0 [  3]       ntdll!_security_check_cookie
   81   266 [  2]     ntdll!LdrpReportError
  177   889 [  1]   ntdll!LdrGetProcedureAddressForCaller
    6     0 [  2]     ntdll!_security_check_cookie
  187   895 [  1]   ntdll!LdrGetProcedureAddressForCaller
   31  1109 [  0] KERNELBASE!GetProcAddressForCaller
    3     0 [  1]   KERNELBASE!BaseSetLastNTError
  103     0 [  2]     ntdll!RtlNtStatusToDosError
    7   103 [  1]   KERNELBASE!BaseSetLastNTError
   21     0 [  2]     ntdll!RtlSetLastWin32Error
    6     0 [  3]       ntdll!_security_check_cookie
   23     6 [  2]     ntdll!RtlSetLastWin32Error
   12   132 [  1]   KERNELBASE!BaseSetLastNTError
   39  1253 [  0] KERNELBASE!GetProcAddressForCaller

通过结果,可以猜到应该在LdrpGetProcedureAddress里面获取的真正的地址。

使用ida查看ntdll的LdrpGetProcedureAddress伪代码,可以发现按函数名字查找是使用了二分法。
导出表里面的函数名字是排过序的,然而你自己函数名是add,加到导出表的最后(假设最后的函数是wpintf),排序就乱了,add根据二分法是向上找,但add是在最后,自然是找不到的。

所以最好给自己的函数名前面加上zzz,保持在最后即可。

免费评分

参与人数 3吾爱币 +9 热心值 +2 收起 理由
junjia215 + 1 + 1 用心讨论,共获提升!
willJ + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
yes2 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
mark_9527 发表于 2025-4-16 10:35
应该只能获取到公开函数?假如函数未公开,依旧还得去跟地址?
3#
 楼主| MJ_B 发表于 2025-4-16 10:54 |楼主
mark_9527 发表于 2025-4-16 10:35
应该只能获取到公开函数?假如函数未公开,依旧还得去跟地址?

导出表里只要有名字或者序号即可获取,不过前提是这个名字或者序号对应的函数地址要有效。
4#
cova 发表于 2025-4-16 12:41
5#
sdytxwy 发表于 2025-4-17 13:17
完全不懂。。
6#
jsncy 发表于 2025-7-3 09:02
谢谢分享。
7#
tiannan523 发表于 2026-8-18 08:51
太深奥了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-9-17 06:20

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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