如何发现未记录的功能?[关闭]


11


我一直想知道您如何找到未公开/专用的 API?

例如Apple未公开的/私有的API,Play StationWindows Phone 7Win32内核Windows API隐藏的回调等...

黑客使用哪些工具来查找私有和未记录的功能?

在哪里可以读到人们深入研究私有API和反向工程技术的经验,这些经验揭示了API文档中通常解释的秘密?

谢谢,

Answers:


7

我可以想到几种方法:

  1. 反射。在这里,您得到一个对象,并要求它显示有关其自身的信息,例如方法,属性等。使用正确的选项(取决于语言),您可以显示非“公开”的信息。

  2. 反编译。这将重新生成用于创建二进制文件的源(版本)。同样,这可能会揭示API的非公开部分。

您也可以将“偶然”添加到列表中。起作用的拼写错误的呼叫/命令,或显示过多信息的帮助屏幕。


2
您可能会偶然添加到列表中。是的,它不那么频繁,但是会发生;)特别是当API所有者引发事故时。

1
@Pierre-好点。
克里斯·弗雷德

此外,共享库签名。这与反编译,但在一个.dll / .dylib在/ .so文件导出的功能是浏览的官方工具(Visual Studio中的依赖资源管理器中的Unix纳米)
克里斯·杜兰

4

您用来开发软件的普通工具:)

通常未公开的API函数就是公开的API函数,并不是真正经过仔细隐藏的秘密。

设计一个面向未来的API很难-您可以轻松地向API中添加内容,但是要删除任何东西(不破坏某些客户端)确实很困难。因此,在向API添加任何内容时要非常小心。这就是为什么API中可能有一些额外的功能(用于测试,开发,快速破解?),这些功能未记录在案,并且不能保证在下一版本中可以正常使用或存在。

只要您知道编译器,链接器,库和调试器的工作方式(系统编程方面的知识),就可以轻松地找到这些未记录的功能。知道目标体系结构的汇编语言不会有任何伤害。如果您的IDE /编译器可以构建可运行的可执行文件,那么您也可以“手动”执行此操作,并且睁开眼睛,您可能会发现一些隐藏的功能:)

Unix环境中的示例:一种场景,其中我们仅提供有关printf函数的文档,并且想知道是否还有其他一些类似于printf的函数。思路可能如下:

1.检查头文件

$ grep printf /usr/include/stdio.h | head -5
extern int fprintf (FILE *__restrict __stream,
extern int printf (__const char *__restrict __format, ...);
extern int sprintf (char *__restrict __s,
extern int vfprintf (FILE *__restrict __s, __const char *__restrict __format,
extern int vprintf (__const char *__restrict __format, _G_va_list __arg);

2.检查库

$ nm /usr/lib/libc.a | grep printf | head -5
         U __asprintf
         U __fwprintf
         U __asprintf
         U __fwprintf
         U __printf_fp

3.反汇编库函数

    $ objdump -S /usr/lib/libc.a | grep -A 10 '_fwprintf' | head
00000000 <__fwprintf>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   8d 45 10                lea    0x10(%ebp),%eax
   6:   83 ec 0c                sub    $0xc,%esp
   9:   89 44 24 08             mov    %eax,0x8(%esp)
   d:   8b 45 0c                mov    0xc(%ebp),%eax
  10:   89 44 24 04             mov    %eax,0x4(%esp)
  14:   8b 45 08                mov    0x8(%ebp),%eax
  17:   89 04 24                mov    %eax,(%esp)

或类似的东西...


2

免责声明:我喜欢ChrisF的回答。我认为,它确实省略了几种方法。如果答案的注释中有注释,则将其删除。

它可能会被反编译:

还可以通过调试供应商提供的工具来查找其他未记录的API,该工具可以执行所需的操作并跟踪库调用。这样,您可以了解将什么类型的数据发送到哪里。

然后可以使用python和CTYPES编写其他“自定义”工具来与这些未公开说明的API一起玩,或者使用ruby及其类似版本,直到您确切地了解它的作用或是否崩溃。亚伦·波特诺伊(Aaron Portnoy)在以下文章中对此话题进行了最小深度的介绍:http : //pentest.cryptocity.net/reverse-engineering/和他在会议上的其他一些演讲(我记得他在巴西的一次演讲中直接谈到了这一话题。 )。它与RE有关,但我不认为这只是一般RE。注意:pentest.cryptocity.net上的视频并非仅此主题。它们更深入地覆盖了其他区域,这只是涉及。我认为,这是测试人员经常会提防的事情,因为“确切的步骤会泄露我们的秘密”。

感谢您阅读任何反馈,不胜感激。

编辑:可以在Windows端对此进行最小化的一种工具在此处进行了最少介绍:http : //breakingcode.wordpress.com/2010/08/24/winappdbg-1-4-is-out/
针对厚Java的电话劫持客户端模糊测试自定义网络服务的内容在这里:http :
//www.securitytube.net/JavaSnoop-How-to-hack-anything-write-in-Java-video.aspx

最后一个问题只具有最低限度的相关性,但可以证明与发问者最终的去向有关。使用您无须做的API ...


添加您自己的答案而不是提供更多/不同的信息是件好事-这就是Stack Exchange的全部目的。
克里斯·弗雷德

@ChrisF感谢您的澄清。似乎它已经被倒车所覆盖。我认为它可能带有另一种可能的方法的更具体的注释/更具体的反转子集(反转可能包括搜索MSDN中未引用的符号等)。
RobotHumans 2011年

-2

骇听听起来很浪漫,工业间谍活动,泄密,贿赂,盗窃和运气不好。我不会算出来的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.