Answers:
逆向工程有什么用?
逆向工程主要适用于破解和黑客攻击(删除序列号保护或密码提示),但也有助于理解其他软件可以执行的病毒或奇迹。有时,这是一种有用的技能,可以在您没有来源的程序中查找错误并进行修补。
作为程序员,我应该学习逆向工程的技巧吗?
是的,尝试学习汇编器并使用不错的调试器。通过了解更接近金属的较低层次的知识,可以使您成为更好的开发人员。
拥有逆向工程经验的程序员将有什么好处?
您将成为一名出色的黑客/黑客。您可以为其他反病毒生产商工作。作为个人示例:我曾经对软件进行过反向工程,以跟踪建立oracle连接时发生的错误。没有人能解决这个问题,所以我得到了一些名声。
另外,我也想引用@johannes的评论,因为他绝对正确:
我不会将其限制为“不良”破解。从更系统管理员的角度来看,弄清楚应用程序失败的位置可能很有趣,反汇编对于确定编译器是否发疯(通常是您的代码)很有用。
我喜欢Falcon的回答,但我想补充一点,在一些旧的无聊的业务应用程序世界中,逆向工程可以使您摆脱一些麻烦。
在工作中,与没有任何新维护的第3方系统进行数据集成时,我们会做很多事情,因此我们可以知道应该或不应该在哪里中断。
如果未包含源代码,我们还将使用反向工程师来检查所购买的第三方组件上的代码质量(当然有一定的限制)。
我的真实观点是:逆向工程不局限于单一技术或语言,而是一个学习“黑匣子”内部知识的过程。如果您有依赖的代码,但您不信任或不信任,则绝对应该偷看一下,看看代码在做什么。
我认为反向工程的技能和调试的技能是完全相同的-如果您是出色的调试器,那么您也是出色的逆向工程师,反之亦然。
根据我的经验,我仅举一个真实的例子。
一旦我们公司从另一个公司接管了一个项目。进入项目大约半年后,我们意识到一个子项目没有代码。当我们要求前公司提供代码时,他们礼貌地回答说找不到子项目的代码。我们需要代码,因为我们想在该子项目中进行更改。
我不得不对子项目进行逆向工程。
首先,我对程序集进行反编译(是的,这是一个.NET项目)。反汇编的结果是乏味而混乱的代码,没有局部变量的名称和复杂的控制结构。这是因为编译会丢弃无法反编译的重要信息。
然后,我试图找出在哪里更改该代码。为此,我简化了代码,使其行为相同,但方式更为简洁。我还从其行为猜测了变量的名称。我单步执行了多次代码,直到弄清楚它在做什么。
我没有对所有东西进行逆向工程,只有我们需要更改的部分。还不错,大约200行VB代码。花了大约五天的时间。