(六)使用dumpdecrypted

原创  2014年08月03日 21:44:46

标签:

iOS逆向工程

10379

本来是打算用AppCrackr砸壳的,结果砸壳都是失败的,开始以为是App的加密太厉害了,后来才知道是因为AppCrackr太暴力了,引起公愤,结果被人投诉招致核心功能被迫关闭了。

幸好在RE官网搜到一个用dumpdecrypted砸壳的帖子。下面是我砸壳的经历。

一、造锤

1.下载dumpdecrypted源码

下载地址:https://github.com/stefanesser/dumpdecrypted/archive/master.zip,接着在Mac中解压。

2.确认iOS设备的版本 

iOS 7.1.x,原帖中snakeninny略啰嗦。。。 

3.Makefile 

cd到dumpdecrypted目录,看看Makefile文件的内容:

[plain] view plain copy

CC_BIN=`xcrun --sdk iphoneos --find gcc`  

GCC_UNIVERSAL=$(GCC_BASE) -arch armv7 -arch armv7s -arch arm64  

SDK=`xcrun --sdk iphoneos --show-sdk-path`  


CFLAGS =  

GCC_BASE = $(GCC_BIN) -Os $(CFLAGS) -Wimplicit -isysroot $(SDK) -F$(SDK)/System$  


all: dumpdecrypted.dylib  


dumpdecrypted.dylib: dumpdecrypted.o  

        $(GCC_UNIVERSAL) -dynamiclib -o $@ $^  


%.o: %.c  

        $(GCC_UNIVERSAL) -c -o $@ $<  


clean:  

        rm -f *.o dumpdecrypted.dylib  

大多数看不懂。。。

接下来我们需要确认的是GCC_UNIVERSALSDK这两个变量的值和iOS设备的环境保持一致。

4.确保Makefile的配置和真机环境一致

在Mac中打开终端,输入xcrun --sdk iphoneos --show-sdk-path命令,查看SDK版本:

[plain] view plain copy

/Applications/Xcode 5.1.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk  

Xcode的SDK版本是7.1.x,GCC_UNIVERSAL这个变量值可以略过。

5.创建动态库文件

(1)一错

在确保Makefile中对动态库的设置和iOS真机环境一致后,在当前目录下输入:make。

但是失败了,错误信息如下:

[plain] view plain copy

`xcrun --sdk iphoneos --find gcc` -Os  -Wimplicit -isysroot `xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/Frameworks -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/PrivateFrameworks -arch armv7 -arch armv7s -arch arm64 -c -o dumpdecrypted.o dumpdecrypted.c  

/bin/sh: /Applications/Xcode: No such file or directory  

make: *** [dumpdecrypted.o] Error 127  

原因是找不到/Applications/Xcode来执行其中的一些脚本。 好吧,我的Mac中有3个Xcode:/Applications/Xcode 5.0.2, /Applications/Xcode 5.1.1, /Applications/Xcode 6 Beta4,就是没有/Applications/Xcode。 

没事,将Xcode 5.1.1重命名为Xcode就行了:

[plain] view plain copy

$ sudo mv Xcode\ 5.1.1.app/ Xcode.app/  

(2)再错

再make,还是报错,错误信息和上面一样。

不怕,我们还有xcode-select这个小伙伴,通常Xcode找不到之类的错误都应该找它帮忙:

[plain] view plain copy

$ xcode-select -p  

/Applications/Xcode 5.1.1.app/Contents/Developer  

原来xcrun查找cmd tool时的路径还是Xcode 5.1.1/,当然什么都找不到了。这时候将它重置就行了(默认是/Applications/Xcode.app/):

[plain] view plain copy

$ sudo xcode-select -r  

$ xcode-select -p   

/Applications/Xcode.app/Contents/Developer  

(3)成功

再make,成功,输出如下:

[plain] view plain copy

$ make  

`xcrun --sdk iphoneos --find gcc` -Os  -Wimplicit -isysroot `xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/Frameworks -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/PrivateFrameworks -arch armv7 -arch armv7s -arch arm64 -c -o dumpdecrypted.o dumpdecrypted.c  

`xcrun --sdk iphoneos --find gcc` -Os  -Wimplicit -isysroot `xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/Frameworks -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/PrivateFrameworks -arch armv7 -arch armv7s -arch arm64 -dynamiclib -o dumpdecrypted.dylib dumpdecrypted.o  


$ ls  

Makefile          dumpdecrypted.c          dumpdecrypted.o  

README               dumpdecrypted.dylib  

可以看到目录中多了两个文件,其中dylib后缀的就是我们要创建的动态库文件,也就是用来砸壳的锤子。

二、砸壳

1.将“锤子”放入设备中

查看iOS设备的IP地址,然后在Mac上使用scp命令将dumpdecrypted.dylib文件放到iOS设备中:

[plain] view plain copy

$ scp dumpdecrypted.dylib root@192.168.xxx.xxx:/var/tmp  

root@192.168.xxx.xxx's password:  

dumpdecrypted.dylib                           100%   81KB  81.0KB/s   00:00  

2.砸

选定一个让你觉得非常不爽或非常感兴趣的app,我就随便选了一个HBGC。在iOS设备上打开iFile,查到它的可执行文件的路径为:/var/mobile/Applications/EBBD26E9-DDBA-481E-9403-84D159436889/HBGC.app/HBGC

然后用SSH连到iOS设备上,cd到刚刚动态库的路径:/var/tmp。

[plain] view plain copy

$ ssh root@192.168.xxx.xxx  

root@192.168.xxx.xxx's password:  

root# cd /var/tmp/  

root# ls  

FlipswitchCache/                              com.apple.audio.hogmode.plist  

L65ancd.sock=                                 com.apple.tccd/  

L65d.sock=                                    com.apple.timed.plist  

MediaCache/                                   cydia.log  

RestoreFromBackupLock*                        dumpdecrypted.dylib*  

SpringBoard_reboot_flag                       launchd/  

com.apple.assistant.bundleservicecache.plist  mobile_assertion_agent.log  

砸壳(久等了):

[plain] view plain copy

root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Applications/EBBD26E9-DDBA-481E-9403-84D159436889/HBGC.app/HBGC  

mach-o decryption dumper  


DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.  


[+] detected 32bit ARM binary in memory.  

[+] offset to cryptid found: @0xd5a90(from 0xd5000) = a90  

[+] Found encrypted data at address 00004000 of length 3047424 bytes - type 1.  

[+] Opening /private/var/mobile/Applications/EBBD26E9-DDBA-481E-9403-84D159436889/HBGC.app/HBGC for reading.  

[+] Reading header  

[+] Detecting header type  

[+] Executable is a FAT image - searching for right architecture  

[+] Correct arch is at offset 16384 in the file  

[+] Opening HBGC.decrypted for writing.  

[+] Copying the not encrypted start of the file  

[+] Dumping the decrypted data into the file  

[+] Copying the not encrypted remainder of the file  

[+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset 4a90  

[+] Closing original file  

[+] Closing dump file  

成果:

[plain] view plain copy

root# ls  

FlipswitchCache/                              com.apple.audio.hogmode.plist  

HBGC.decrypted                                com.apple.tccd/  

L65ancd.sock=                                 com.apple.timed.plist  

L65d.sock=                                    cydia.log  

MediaCache/                                   dumpdecrypted.dylib*  

RestoreFromBackupLock*                        launchd/  

SpringBoard_reboot_flag                       mobile_assertion_agent.log  

com.apple.assistant.bundleservicecache.plist  

其中的HBGC.decrypted就是目标产物,接下来IDA各种斧头水果刀上吧。

三、附录

1.xcrun

首先简单看看xcrun的帮助信息:

[plain] view plain copy

$ xcrun -h  

Usage: xcrun [options]  ... arguments ...  


Find and execute the named command line tool from the active developer  

directory.  


The active developer directory can be set using `xcode-select`, or via the  

DEVELOPER_DIR environment variable. See the xcrun and xcode-select manual  

pages for more information.  


Options:  

  -h, --help                  show this help message and exit  

  --version                   show the xcrun version  

  -v, --verbose               show verbose logging output  

  --sdk             find the tool for the given SDK name  

  --toolchain           find the tool for the given toolchain  

  -l, --log                   show commands to be executed (with --run)  

  -f, --find                  only find and print the tool path  

  -r, --run                   find and execute the tool (the default behavior)  

  -n, --no-cache              do not use the lookup cache  

  -k, --kill-cache            invalidate all existing cache entries  

  --show-sdk-path             show selected SDK install path  

  --show-sdk-version          show selected SDK version  

  --show-sdk-platform-path    show selected SDK platform path  

  --show-sdk-platform-version show selected SDK platform version  

xcrun的作用在于从一个激活的开发者目录(active developer directory)中查找一个command line tool,并执行这个工具。 

例如上面的Makefile中: GCC_BIN=`xcrun --sdk iphoneos --find gcc` 

分解来看: 

(1)xcrun --find gcc

[plain] view plain copy

$ xcrun --find gcc  

/Applications/Xcode 5.1.1.app/Contents/Developer/usr/bin/gcc  

这一步获取了gcc这个tool的路径,设为cmd_tool_path。 

(2)xcrun --sdk iphoneos cmd_tool_path 

这一步通过路径名获取到了具体的工具程序,这个工具对应iphoneos的SDK,并执行该工具。 

(3)GCC_BIN是一条shell命令,对应的就是这个查找和执行工具的过程。 

再如: xcrun --sdk iphoneos --show-sdk-path 

它的作用就是查找对应于iphoneos SDK的SDK并执行。

[plain] view plain copy

$ xcrun --show-sdk-path  

/Applications/Xcode 5.1.1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk   


$ xcrun --sdk iphoneos --show-sdk-path  

/Applications/Xcode 5.1.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk  

2.xcode-select

首先看看简单的帮助信息:

[plain] view plain copy

$ xcode-select -h  

Usage: xcode-select [options]  


Print or change the path to the active developer directory. This directory  

controls which tools are used for the Xcode command line tools (for example,  

xcodebuild) as well as the BSD development commands (such as cc and make).  


Options:  

  -h, --help                  print this help message and exit  

  -p, --print-path            print the path of the active developer directory  

  -s , --switch   set the path for the active developer directory  

  -v, --version               print the xcode-select version  

  -r, --reset                 reset to the default command line tools path  

它的作用在于打印或改变active developer directory,而xcrun就是从这个directory中查找对应的工具。 通常它的值为:

[plain] view plain copy

/Applications/Xcode 5.1.1.app/Contents/Developer  

例如,在/Applications/Xcode 5.1.1.app/Contents/Developer/usr/bin中,可以看到一些上文需要的gcc:

[plain] view plain copy

$ ls  

BuildStrings          gcc               ndisasm  

CpMac               gcov-4.2          opendiff  

DeRez               git               projectInfo  

GetFileInfo          git-cvsserver          resolveLinks  

ImageUnitAnalyzer     git-receive-pack     scntool  

MergePef          git-shell          sdef  

MvMac               git-upload-archive     sdp  

ResMerger          git-upload-pack          svn  

Rez               gnumake               svnadmin  

RezDet               hdxml2manxml          svndumpfilter  

RezWack               headerdoc2html          svnlook  

SetFile               ibtool               svnrdump  

SplitForks          ibtool3               svnserve  

TextureAtlas          ibtoold               svnsync  

UnRezWack          ictool               svnversion  

actool               instruments          symbols  

agvtool               iprofiler          xcodebuild  

amlint               ld               xcrun  

以上只是部分输出。

注:以上是我个人在自己的机子上的砸壳经历,大家要根据自己的实际情况进行,详细请参考:用dumpdecrypted砸壳

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容