在Windows中查找未记录的API

时间:2009-05-28 03:32:28

标签: winapi

我很好奇如何在Windows中找到未记录的API。

我知道使用它们所涉及的风险,但这个问题的重点是找到它们而不是是否使用它们。

5 个答案:

答案 0 :(得分:36)

使用工具从共享库(例如,诸如kernel32.dll之类的.dll)转储导出表。您将看到命名的入口点和/或序数入口点。通常对于窗口,命名的入口点是非解码的(外部“C”)。您很可能需要对汇编代码进行一些窥视,并从堆栈帧(如果有)和寄存器用法派生参数(类型,编号,顺序,调用约定等)。如果没有堆栈帧,则有点困难,但仍然可行。请参阅以下链接以获取参考:

  1. http://www.sf.org.cn/symbian/Tools/symbian_18245.html
  2. http://msdn.microsoft.com/en-us/library/31d242h4.aspx
  3. 查看dumpbin等工具,以便调查导出部分。

    还有一些网站和书籍试图保留未记录的Windows API的更新列表:

    1. The Undocumented Functions
    2. A Primer of the Windows Architecture
    3. How To Find Undocumented Constants Used by Windows API Functions
    4. Undocumented Windows
    5. Windows API
    6. 修改 这些相同的原则适用于多种操作系统,但是,您需要替换用于转储导出表的工具。例如,在Linux上,您可以使用nm转储目标文件并列出其导出部分(以及其他内容)。您还可以使用gdb设置断点并逐步执行入口点的汇编代码以确定参数应该是什么。

答案 1 :(得分:9)

IDA Pro是您最好的选择,但请请加倍实际上并没有使用它们。

他们是内在的,因为他们改变了;他们可以(并且确实)甚至因为修补程序而更改,因此您甚至不能保证您的未记录的API将适用于您为其编写的特定操作系统版本和Service Pack级别。如果你运送这样的产品,你就是靠借来的时间生活。

答案 2 :(得分:8)

到目前为止,每个人都缺少一些实质性功能,这些功能包含Windows操作系统 RPC 中未记录的大部分内容。 RPC(认为rpcrt4.dll,lsass.exe,csrss.exe等...)操作在所有子系统中非常频繁地发生,通过LPC端口或其他接口,它们的功能被埋没在各种类型/子类型的神秘主义咒语中/ struct-typedef's etc ...由于异步性质或它们注定流程的事实而更难调试,如果你通过单步执行调试或者你有什么,你会找到整个系统由于阻止键盘或其他I / O被传递而导致锁定;)

ReactOS可能是调查未记录的API的最有效方法。他们有一个相当成熟的内核和其他高管建立起来。 IDA是相当耗时的,你不太可能找到任何ReactOS人员尚未发现的东西。

这是链接页面的模糊;

  

ReactOS®是一种免费的现代化操作   系统基于Windows®的设计   XP / 2003。写完全自   划伤,它的目的是遵循   Windows®架构由设计   微软从硬件层面   直到申请   水平。这不是基于Linux的   系统,并没有共享unix   建筑。

     

的主要目标   ReactOS项目是提供一个   操作系统是二进制的   与Windows兼容。这将   允许您的Windows应用程序和   司机可以按照你的方式运行   Windows系统。另外,看起来   感觉Windows正在运行   使用系统,这样的人   习惯熟悉的用户   Windows®的界面会找到使用   ReactOS直截了当。终极的   ReactOS的目标是允许你   删除Windows®并安装ReactOS   没有最终用户注意到   变化

当我调查一些很少见的Windows构造时,ReactOS通常是唯一可信的参考。

答案 3 :(得分:1)

查看系统dll以及它们导出的功能。每个API函数,无论是否记录,都会导出其中一个(用户,内核,...)。

答案 4 :(得分:1)

对于用户模式API,您可以在dependancy walker中打开Kernel32.dll User32.dll Gdi32.dll,特别是ntdll.dll,并查找所有导出的API。但是你不会有文件记录。

马克·鲁西诺维奇在Native APIS找到了一篇好文章