文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。

Hopper Disassembler批量导出反编译的伪代码

时间:2016-04-11 / 分类:学习园地,逆向工程 / 浏览:11164 / 4个评论 发表评论

以下内容节选自《iOS应用逆向工程》:

逆向工程最受欢迎的应用场合就是“借鉴”他人的软件功能。

在App Store里面,有不少优秀的App。当我们不知道App中的某个功能是如何实现的时候,逆向工程就能起到关键性的作用,此时使用iOS逆向工程技术就能够对它了解一二。

有些老牌软件的架构设计合理,代码工整规范,实现得非常优雅。我们没有他们那样深厚的技术功底和人才储备,想要借鉴他们使用的高级技术,却又求学无门。在这种情况下,逆向工程就是解决问题的金钥匙。通过逆向那些软件,可以从App中把它们的设计思路抽象出来为我所用,从而提高自己App的精致程度。比如,WhatsApp的稳定性、健壮性出类拔萃,如果我们自己要编写一个IM类App,通过逆向工程技术学习WhatsApp的整体架构与设计思路将是非常有益的。

想要了解app的功能是怎么实现的,最简单的方法就是反编译了。
所幸的是,Hopper Disassembler提供了反编译功能,能够将汇编代码转成伪代码。

想要使用这个功能的话,要先把光标定位到某个函数的汇编代码里:

然后点击菜单的 Window –> Show Pseudo Code Of Procedure 选项,就会弹出一个伪代码窗口:

这个功能虽然强大,但是每次只能反编译一个函数,并不支持批量生成伪代码。
不过Hopper内置了一个Python解析器(这背后一定有肮脏的Python交易),所以我们可以编写Python脚本来实现这个功能。

打开Hopper的帮助文件/Applications/Hopper Disassembler v3.app/Contents/Resources/Hopper.help,会出现一个窗口:

点击Scripting Reference选项,可以看到Hopper提供的类和方法:

Class Tag
    getName

Class Procedure
    addTag
    decompile
    getBasicBlock
    getBasicBlockAtAddress
    getBasicBlockCount
    getEntryPoint
    getHeapSize
    getTagAtIndex
    getTagCount
    getTagList
    hasTag
    removeTag
    tagIterator

//......

搜索关键字Pseudo,可以发现以反编译的方法:

decompile()

    Returns a string containing the pseudo-code of the procedure, or None if the decompilation is not possible.

既然Hopper提供了这个方法,那么实现批量导出伪代码的功能就不难了。

由于代码比较长,所以放在Github里,具体代码可以在https://github.com/poboke/Class-Decompile下载。

使用方法

1、将下载的Class Decompile.py文件放到~/Library/Application Support/Hopper/Scripts目录里。

2、将可执行文件拖到Hopper里,等待分析完成。如果日志框里出现以下文字,就说明分析完成了:

Analysis segment __LINKEDIT

Analysis segment External Symbols

Background analysis ended

3、点击菜单 Scripts –> Class Decompile

4、Hopper会出现一个弹框,可以选择反编译类型:

  • Decompile All Classes : 反编译所有类
  • Decompile One Class : 反编译单个类
  • Cancel : 取消

5、如果选择反编译单个类的话,会出现以下弹框:

输入某个类名后,点击 OK 按钮就可以反编译出该类的伪代码。

6、反编译出来的伪代码保存在~/ClassDecompiles目录里。

7、打开反编译的文件,例如CalculatorController.m,可以看到生成的伪代码:

@implementation CalculatorController

//......

- (void)clearRecentConversionsMenu:(id)arg2 
{
    rdi = self->_conversionController;
    r14 = *objc_msgSend;
    [rdi clearRecentConversions];
    rax = [self updateRecentConversionsMenu];
    return;
}

- (void)openExpressionSyntaxHelp:(id)arg2 
{
    r14 = *objc_msgSend;
    rbx = [[NSBundle mainBundle] pathForResource:@"ExpressionSyntax" ofType:@"rtf"];
    rdi = [NSWorkspace sharedWorkspace];
    rdx = rbx;
    rax = [rdi openFile:rdx];
    return;
}

//......

@end
标签: , ,
本文链接: Hopper Disassembler批量导出反编译的伪代码
版权所有: 破博客, 转载请注明本文出处。

4个评论

  1. hahahha
    2016/09/01 17:19:48

    我导出来了伪代码,那怎么样才是真正的修改了app 的代码呢?

    • admin
      2016/09/07 00:08:54

      你可以修改二进制文件,但是比较麻烦。也可以在程序运行时进行hook,具体方法可以看这篇文章http://www.poboke.com/study/use-easysimbl-to-inject-plugins-to-mac-app.html

  2. Andrew
    2016/04/21 13:37:00

    :twisted: JJ Blow!

  3. […] 《Hopper Disassembler批量导出反编译的伪代码》 里的方法,反编译出 InAppPurchaseManager […]

发表评论

*

* (显示gravatar头像)

Ctrl+Enter快捷回复

© 2018 破博客 all rights reserved.