首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

20年以前,程序几乎都是独立存在的,它们除了和底层的硬件进行频繁地直接通信外,几乎不和其他任何东西接口。不用说,这20年时间改变了太多的东西。现在,普通程序都运行在庞大的操作系统之上并与一大堆库进行通信,而这些库通常又是由很多不同的人开发的。

本章将讨论逆向工程的最重要的应用之一:为获得互操作性的逆向工程。通过学习逆向技术,软件开发人员可与第三方代码更有效地交互(这是每个软件开发人员每天都在做的事情)。逆向程序所提供的对第三方代码的最深入的洞察能力,它让你能够掌握未公开的技术。

在这一章中,我将演示相对比较极端的案例:用逆向技术来学习怎样使用未公开的系统APIs。我从Windows本地API中挑选了一个相对复杂的API集合,我将剖析这个API中的各个函数,直到你完全明白每个函数的作用并学会怎样使用这些函数。我之所以认为这是一个很极端的例子,是因为你在多数情况下多多少少能找到一些有关某项技术的资料——只是这些资料不足以让你掌握这项技术而已。

5.1  逆向和互操作性

对于一个软件工程师来说,要与其他软件进行互操作简直就是一场恶梦。从软件工程师的个人角度来看,互操作性意味着让自己的软件与别人写的软件相互合作,写这个软件的人有可能是和你在一家公司里并负责同一产品开发的职员,也可能是某个独立模块的软件的开发者。现代软件的组件之间常常会发生交互:应用程序与操作系统、应用程序与软件库,以及应用程序与其他的应用程序之间都会发生交互。

让软件与同一程序里的其他组件、与其他程序里的组件,与软件库里的组件,以及与操作系统内的组件进行通信——这可能是大型软件开发工作中面临的最大挑战。在很多情况下,比如处理一个第三方软件库时,你无法获得你要实现交互的组件的源代码。这个时候,你就只能依赖于软件供应商提供的文档。任何一个经验丰富的软件开发人员都知道这很少会是一个顺利而容易的过程。文档几乎总会省略某些函数、参数、或者特征。

有个很典型例子,那就是Windows操作系统,据说它拥有成百上千个未公开的API。不公开这些APIs的原因有很多,比如说为了维护和其他Windows平台的兼容性。事实上,很多人都声称Microsoft公司不公开这些是为了保持其对其他软件供应商的优势。通过使用这些特殊的、未公开的API,Microsoft公司使自己的产品能够提供更好的特性,这些都是与之竞争的软件供应商无法得到的。

这一章将深入分析第三方代码的技术。这些技术可以用于很多不同的场合,比如,如果当你没有足够的文档(或者根本就没有文档),或者你碰到的是与第三方代码有关的问题,你除了独立解决问题外没有其他选择。当然,你至少应该试一试通过常规渠道解决问题,实在不行就只能考虑本章所讲述的深入分析别人打代码这种方法了。遗憾的是,经验告诉我,如果你手上有一个非常紧急且技巧性很强的问题需要处理的时候,直接分析代码实际上要比尝试联系某些公司的客户技术支持部门寻求帮助效率要高得多。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论