反编译ios
2017-02-14 20:56:57 SandyLoo 阅读数 5317
上架至App Store的app,被apple加密了。想要反编译要麻烦许多。但是在debug下产生的ipa或者是release下的ipa包或者是渠道包都能直接反编译。
首先介绍针对Xcode导出的ipa包的反编译。
需要用到软件 :class-dump 和 Hopper Disassembler。软件下载地址如下: 
class-dump  链接: https://pan.baidu.com/s/1skR6ljv 密码: tfgf
Hopper Disassembler  链接: https://pan.baidu.com/s/1pL4PQVx 密码: vhvu

 class-dump:
   通过class-dump可以看到包里面所有的.h文件对应VC里面的所有方法。首先下载安装包,双击后看到如下内容,拖动如图class-dump文件到桌面。然后移动到usr/bin目录内。(可以用终端命令移动 sudo mv ~/desktop/class-dump /usr/bin

)
这里写图片描述
移动过程中如果提示 “Operation not permitted”, 原因是MAC的Rootless机制, Rootless机制是对抗恶意程序的最后防线, 解决办法就是关闭Rootless : 重启按住 Command+R,进入恢复模式,打开Terminal,执行 csrutil disable 。
执行以上操作后,即可顺利实现 sudo mv ~/desktop/class-dump /usr/bin, 这样class-dump就安装成功了。
此时在Terminal中就可以使用class-dump了。
新建一个文件夹, Terminal进入该文件夹,执行命令class-dump -H (此处填写如下文件路径)
获取文件

终端截图

终端执行成功后,打开文件夹就可以看到包内的.h文件
这里写图片描述

   此处就有人会问了,方法名字不重要,关键是需要看到方法里面具体的实现。 此时就要用到Hopper Disassembler这个软件了。 不过此处声明,并不能看到方法的源码,只能通过反编译看到一些伪代码。
   Hopper Disassembler:
   下载解压后,双击打开
   ![这里写图片描述](http://img.blog.csdn.net/20170214203600275?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU2FuZHlMb28=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

拖拽文件到软件界面内, 点右上角的if(b)f(x);按钮,我们能看到这个方法的伪代码,大部分的时候我们能从伪代码中看出我们需要的信息。如下图:
这里写图片描述

2014-11-05 10:52:51 Henry_Wu001 阅读数 779

refs:

http://zhidao.baidu.com/link?url=0dKwlhouxJSRM8QwsN7mDvHk1TAQZJE0oBGomu4mlGy4MNobX_65_9mj91ouzOTdWhQua3LDinEqEd71o5d6KAfcUzBcHXwvqJRbAgwRqVq


1)用itools 挖出 设备中的app


2)见refs,解压到资源

对下载下来的ipa文件按右键解压。会看到这个包中的一些内容,把他们都解压缩。

其中最重要的是app文件,其他的包含一些安装信息,可以删除。

右键单击app文件,选择:show package contents。

这个包中的内容就是app的资源文件,至于代码文件,在这个可执行文件里,要反编译代码,必须进入底层才行,而且主要会编译出汇编语言。

这些app中的图片和语言资源都是可以使用的





2018-07-11 14:55:00 weixin_34217773 阅读数 29

移动互联网时代,安卓应用被反编译已经不是什么新鲜事了。iOS系统安全性非常高,很少出新漏洞,但是在各位工程师的不懈努力下,iOS的漏洞也被撕扯的越来越大,被反编译的风险也随之剧增。而作为一名优秀的iOS开发工程师,怎么可以对这种风险视而不见呢。

iOS应用安全风险

1. 内购破解

风险之一:越狱(插件)、存档破解(iTools工具替换文件)、第三方软件修改(八门神器等)

2.网络安全风险

风险之二:截获网络请求,破解通信协议并模拟客户端登录,伪造用户行为,对用户数据造成危害

3.应用程序函数PATCH破解

风险之三:利用FLEX 补丁软件通过派遣返回值来对应用进行patch破解

4.源代码安全风险

风险之四:通过使用ida等反汇编工具对ipa进行逆向汇编代码,导致核心代码逻辑泄漏与被修改,影响应用安全

iOS应用加密防止反编译技术

1.本地数据加密

对NSUserDefaults,sqlite存储文件数据加密,保护帐号和关键信息

将文件进行加密

 // 获取需要加密文件的二进制数据/Users/zq/Desktop/photo                                                                                  NSData *data = [NSData dataWithContentsOfFile:@"/Users/zq/Desktop/photo/photo1.png"];  

// 或 base64EncodedStringWithOptions                                                                                                                  NSData *base64Data = [data base64EncodedDataWithOptions:0];    

// 将加密后的文件存储到桌面                                                                                                                            [base64Data writeToFile:@"/Users/zq/Desktop/123" atomically:YES];

将文件进行解密

// 获得加密后的二进制数据                                                                                                                                    NSData *base64Data = [NSData dataWithContentsOfFile:@"/Users/zq/Desktop/123"];          NSLog(@"base64Data:%@", base64Data);

// 解密 base64 数据                                                                                                                                              NSData *baseData = [[NSData alloc] initWithBase64EncodedData:base64Data options:0];

// 写入桌面                                                                                  [baseDatawriteToFile:@"/Users/zq/Desktop/IMG_5551.png" atomically:YES];

2.URL编码加密

对程序中出现的URL进行编码加密,防止URL被静态分析

3.网络传输数据加密

利用 RSA 对字符串进行加密

 /** RSA加密                                                                                                                                                               *  @param originString 需要加密的数据                                                                                                                 * @param public_key 公钥                                                                                                                                     */                                                                                                                                           NSString*encWithPubKey = [RSA encryptString:originStringpublicKey:public_key];

  NSLog(@"加密===: %@\n\n", encWithPubKey);

利用 RSA 对字符串进行解密

/** RSA解密                                                                                                                                                              *  @param originString 需要解密的数据                                                                                                                  * @param private_key 私钥                                                                                                                                    */                                                                                                                                          NSString*decWithPrivKey = [RSA decryptString:encWithPubKey privateKey:private_key];                   

NSLog(@"解密===: %@\n\n", decWithPrivKey);

4.方法体,方法名高级混淆

简单来说,就是别人通过class-dump反编译你的应用后,不会显示你自定义的方法名(系统方法名除外),增加其对你应用的理解难度。注意:这样并不能阻止别人反编译你的应用。

1、在项目的Resource文件夹中新建 

脚本文件:confuse.sh,                                                                                                                                                    宏定义文件:codeObfuscation.h,                                                                                                                                    函数列表文件:func.list,                                                                                                                                                 头文件:PrefixHeader.pch

可脚本创建 

cd 项目/YCFMixConfuseDemo/Resource                                                                                                                    touch confuse.sh                                                                                                                                                          touch func.list                                                                                                                                                                touch codeObfuscation.h                                                                                                                                              touch PrefixHeader.pch

2、在confuse.sh文件中,输入以下代码,注意路径

#!/usr/bin/env bash                                                                                                                       TABLENAME=symbolsSYMBOL_DB_FILE="symbols"                             STRING_SYMBOL_FILE="$PROJECT_DIR/代码混淆-18-7-10-0/func.list"CONFUSE_FILE="$PROJECT_DIR/代码混淆-18-7-10-0"                                                  HEAD_FILE="$PROJECT_DIR/代码混淆-18-7-10-0/codeObfuscation.h"                                                         export LC_CTYPE=C

#取以.m或.h结尾的文件以+号或-号开头的行 |去掉所有+号或-号|用空格代替符号|n个空格跟着<号 替换成 <号|开头不能是IBAction|用空格split字串取第二部分|排序|去重复|删除空行|删掉以init开头的行>写进func.list           grep -h -r -I  "^[-+]" $CONFUSE_FILE  --include '*.[mh]' |sed "s/[+-]//g"|sed "s/[();,: *\^\/\{]/ /g"|sed "s/[ ]*$STRING_SYMBOL_FILE                                                                                                                        createTable(){  echo "create table $TABLENAME(src text, des text);" | sqlite3 $SYMBOL_DB_FILE}insertValue(){echo "insert into $TABLENAME values('$1' ,'$2');" | sqlite3 $SYMBOL_DB_FILE}

query(){echo "select * from $TABLENAME where src='$1';" | sqlite3 $SYMBOL_DB_FILE}

ramdomString(){openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16}

rm -f $SYMBOL_DB_FILE                                                                                                                                      rm -f $HEAD_FILE                                                                                                                                      createTable

touch $HEAD_FILE                                                                                                                                              echo '

#ifndef Demo_codeObfuscation_h#define Demo_codeObfuscation_h' >> $HEAD_FILE                                  echo "//confuse string at `date`" >> $HEAD_FILE                                                                                                  cat "$STRING_SYMBOL_FILE" | while read -ra line;

doif [[ ! -z "$line" ]];                                                                                                                                                thenramdom=`ramdomString`echo $line $ramdominsertValue $line $ramdomecho "#define $line $ramdom" >> $HEAD_FILE

fidoneecho "#endif" >> $HEAD_FILE

sqlite3 $SYMBOL_DB_FILE .dump

注意:需要将zq换成你自己的函数前缀 

3925416-89b6eb566db8edd3.png
3925416-b0db69f957045ae4.png

3、在项目——Target——Build Phases中 新增New Run Script Phase 

3925416-f33bb4927932d03a.png
3925416-0fb8684a0fcc66c6.png

4、将新建的头文件PrefixHeader.pch中导入codeObfuscation.h

#ifndef PrefixHeader_pch                                                                                                                                #define PrefixHeader_pch

// Include any system framework and library headers here that should be included in all compilation units.          // You will also need to set the Prefix Header build setting of one or more of your targets to reference this file.

#import "codeObfuscation.h"                                                                                                                                #endif /* PrefixHeader_pch */

5、通过class-dump 反编译之后:Appdelegate 效果

3925416-0aa3b967d6057707.png

5.程序结构混排加密

对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低

下一篇:Objective-C自动引用计数

2017-06-15 17:24:02 ssyyjj88 阅读数 311

http://www.jianshu.com/p/10873c5c1e08


http://stevenygard.com/projects/class-dump/

下载class-dump


- (void)testClassDump

{

    NSLog(@"hello testClassDump");

}


- (void)testHideClassDump

{

    NSLog(@"hello testHideClassDump");

}


打开Products文件夹下的DecompilingTest.app所在目录,显示包内容,拿到二进制文件

class-dump -H DecompilingTest



https://www.hopperapp.com/

下载Hopper Disassembler

拖入二进制文件,点击if(b)f(x);按钮,能看到这个方法的伪代码




2016-10-14 00:10:00 weixin_34195142 阅读数 22

一 . 简单的操练

新建一个工程test:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 打印bundle所在的路径, 根据打印的路径前往, 找到test.app,
    // 然后显示包内容, 找到可执行文件`test`exec可执行文件
    NSLog(@"%@", [NSBundle mainBundle].bundlePath);
}
@end

根据上面打印bundle所在的路径, 根据打印的路径前往,
找到test.app, 然后显示包内容, 找到可执行文件test的exec可执行文件

然后打开工具Hopper

1829781-e30a29e91cd59d31.png
反编译工具

选择File->Read Executable to Disassemble..导入找到的可执行文件,next...
导入后如下图操作:

1829781-78b8a54bc8be00bb.png
图1.png

点击第二步骤后则显示: ( 将代码转变为可以看懂的oc代码 )


1829781-e650088cdf8052d5.png
屏幕快照 2016-10-13 下午11.35.07.png

这样我们就可以通过工具将可执行文件转化为可见的代码了...

二 . 反编译UIKit框架

Foundation和UIKit框架在我们安装好Xcode的时候就随之存在了, 他们的路径如下:


1829781-eb18e67d368cdbbd.png
路径.png

首先我们先反编译一下UIKit框架, 我们都是到我们在创建视图的时候, 可以用两种方式创建:

UIView *v1 = [[UIView alloc] init];
UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];

我们都知道 在init方法中其实已经调用了一次initWithFrame方法, 我们通过反编译UIKit框架来验证一下, 方法同上(通过64bit导入):

1829781-14b58183052d3340.png
演示1

1829781-2eab76464cf54089.png
演示2

举例2: 我们知道控制器的视图是在- (void)loadView方法中创建的
而我们创建控制器(不管是xib,storyboard,还是代码创建), 都可以用[[UIViewController alloc] init];方法创建, 系统内部做了判断, 下面我们通过反编译 UIKit框架来验证一下:

1829781-d3ebffd3f60fd6f4.png
图1.png
1829781-05606eb98ba04d86.png
图2.png

今天先简单的介绍到这里, 以后再讲一讲重新签名和反编译别人的app...

反编译 iOS APP

阅读数 52

反编译 iOS APP

阅读数 35

iOS APP 反编译

阅读数 3544

反编译 iOS APP

阅读数 20

iOS app反编译

阅读数 1

没有更多推荐了,返回首页