• 代码混淆工具SwiftOBJ-C

    2019-10-09 11:44:00
    SwiftShield是一个用于为你的iOS项目对象生成不可逆加密名称的工具,其目的是保护你的iOS apps不被一些逆向工具所破解(如class-dump和Cycript)。 class fjiovh4894bvic: XbuinvcxoDHFh3fjid { ...

    SwiftShield是一个用于为你的iOS项目对象生成不可逆加密名称的工具,其目的是保护你的iOS apps不被一些逆向工具所破解(如class-dump和Cycript)。

    class fjiovh4894bvic: XbuinvcxoDHFh3fjid {
      func cxncjnx8fh83FDJSDd() {
        return vPAOSNdcbif372hFKF()
      }
    }
    

    自动模式(仅限 Swift)
    使用-automatic标签,SwiftShield将使用SourceKit自动混淆整个项目(包括依赖项)。请注意,SwiftShield的自动模式的范围与Xcode的本机重构工具的范围直接相关,后者不会重构所有内容。虽然文档中的特定情况不会被混淆,但SwiftShield将对所有可以进行逆向的Swift类和方法进行混淆处理。

    手动模式(Swift/OBJ-C)
    如果你想要完全混淆所有内容 – 包括typealases和内部属性名称,你也可以使用手动模式。这是运行SwiftShield的最简单方式,但同时也是最耗时的。使用时,SwiftShield将根据你选择的标签对其属性和类进行混淆处理。例如,在手动模式下运行SwiftShield并使用__s标签,代码如下:

    class EncryptedVideoPlayer__s: DecryptionProtocol__s {
      func start__s() {
        let vc__s = ImportantDecryptingController__s(secureMode__s: true)
        vc__s.start__s(playAutomatically__s: true)
      }
    }
    

    混淆后:

    class fjiovh4894bvic: XbuinvcxoDHFh3fjid {
      func cxncjnx8fh83FDJSDd() {
        let DjivneVjxrbv42jsr = vPAOSNdcbif372hFKF(vnjdDNsbufhdks3hdDs: true)
        DjivneVjxrbv42jsr.cxncjnx8fh83FDJSDd(dncjCNCNCKSDhssuhw21w: true)
      }
    }
    

    对加密的 Crash logs 进行反混淆处理
    成功加密项目后,SwiftShield将生成一个包含conversionMap.txt文件的输出文件夹,其中包含对项目所做的所有更改。

    //
    //  SwiftShield
    //  Conversion Map
    //  Automatic mode for MyApp 2.0 153, 2018-09-24 10.23.48
    //
    Data:
    ViewController ===> YytSIcFnBAqTAyR
    AppDelegate ===> uJXJkhVbwdQGNhh
    SuperImportantClassThatShouldBeHidden ===> GDqKGsHjJsWQzdq
    

    你可以通过运行以下命令来使用此文件自动反混淆任何类型的基于文本的crash文件:

    swiftshield -deobfuscate CRASH_FILE -deobfuscate-map PATH_TO_CONVERSION_MAP
    

    必要条件
    自动模式
    如果app的一个或多个模块/扩展无法满足这些条件,则可以使用-ignore-modules参数避免对其进行混淆处理。

    1.没有基于类/属性名称的逻辑,比如加载MyClass.xib因为String(describing: type(of:self))为’MyClass’。

    2.没有调用Swift方法的Objective-C类(调用Objective-C方法的Swift类是可以的,除非涉及到接口)

    3.最新的Swift版本和Xcode命令行工具(适用于所有版本,但由于SourceKit版本不同,结果可能也会有所不同)

    4.确保你的项目不包含SourceKit的bug。虽然这些bug不会阻止项目被混淆,但其中一些可能需要在之后进行一些手动修复。

    (在Info.plist中使用NSExtensionPrincipalClass或变体的App Extensions(如Rich Notifications/Watch apps)也会对此类引用进行混淆处理,但会假定你没有将其更改为默认的$(PRODUCT_MODULE_NAME).ClassName值。如果您修改这些plist指向不同模块中的类,则必须在运行此工具后手动更改它们。)

    手动模式
    请确保你的标签不会被用在那些不应被混淆的内容上,例如硬编码字符串。

    安装
    警告:SwiftShield会不可逆地覆盖你所有的源文件。因此,建议你只在CI server和release builds上运行它。

    从该存储库下载最新版本,然后单击此处查看如何设置SwiftShield。

    运行
    自动模式
    swiftshield -automatic -project-root /app/MyApp -automatic-project-file /app/MyApp/MyApp.xcworkspace -automatic-project-scheme MyApp-AppStore
    必要参数:

    automatic:启用自动模式。

    project-root:项目的根目录。SwiftShield将使用它来搜索你的项目文件。

    automatic-project-file:你app的main .xcodeproj/.xcworkspace文件。

    automatic-project-scheme myScheme:从你的-automatic-project-file构建的main scheme。

    可选参数:

    ignore-modules:忽略混淆某些模块,用逗号分隔。如果某个模块无法正确混淆,请使用此选项。注意,这应该是导入模块的确切名称(而不是目标名称!)。示例:MyLib,MyAppRichNotifications,MyAppWatch_Extension

    show-sourcekit-queries:打印发送到SourceKit的查询。注意,打印的数据内容量会非常大,这会导致你的终端看上去很混乱,因此仅将其用于错误报告和功能开发!

    手动模式
    swiftshield -project-root /app/MyApp
    必要参数:

    project-root:项目的根目录。SwiftShield将使用它来搜索你的项目文件,storyboards和源文件。

    可选参数:

    tag:使用自定义标签。默认为__s。

    两种模式的额外参数
    verbose:打印详细信息。

    obfuscation-character-count:设置混淆名称的字符数。默认情况下,为32。注意,由于名称冲突的可能性较高,因此使用较小的数值会导致运行速度变慢。

    dry-run:实际上不会覆盖文件。对调试有用!

    http://www.45zq.cn/portal/article/index/id/196.html

    展开全文
  • .zip,u3d、cocos2dx、iOS代码混淆自动翻新专家(WHC_ConfuseSoftware)是一款新一代运行在MAC OS平台的App、完美支持Objc和Swift、U3D、Cocos2dx项目代码的自动翻新(混淆)、支持文件夹名称、文件名、修改资源文件...
  • 本文简单介绍了下使用上海交大GoSSIP小组开源的“孤挺花”混淆框架来给OLLVM加上字符串混淆的功能。 0x01 OLLVM 4.0 OLLVM(Obfuscator-LLVM)是瑞士西北应用科技大学安全实验室于2010年6月份发起的一个针对LLVM...

    转载声明:https://www.anquanke.com/post/id/86384

    本文简单介绍了下使用上海交大GoSSIP小组开源的“孤挺花”混淆框架来给OLLVM加上字符串混淆的功能。


    0x01 OLLVM 4.0

    OLLVM(Obfuscator-LLVM)是瑞士西北应用科技大学安全实验室于2010年6月份发起的一个针对LLVM代码混淆项目,主要作用是增加逆向难度,从而一定程度上保护代码的安全。因为后期转向了商业项目strong.protect,所以项目的进度一度停滞,而在17年3月,LLVM已经更新到了4.0版本,新版本的一些特性导致老版本的OLLVM存在一定的局限性。

    640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

    几天前,上海交大密码与计算机安全实验室GoSSIP小组开源了他们设计的基于LLVM 4.0的孤挺花混淆框架,功能包含字符串加密,控制流扁平化和指令替换。出于稳定性考虑,目前开源的代码仅包括对编译源代码中的常量字符串加密一项基本功能(相关简介)。给上海交大的同学点赞 : )

    YSRC简单的做了下分析,发现该功能主要是实现了一个用于字符串加密的pass,具体什么是pass,可以参考如下文章( ,),本文主要介绍将孤挺花的字符串加密pass集成到OLLVM 4.0中。(官方分支暂时还未支持Constants encryption)


    0x02 pass集成

    字符串加密的pass位于如下目录

    640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

    提取出该文件,放到OLLVM相同目录下,并将头文件也复制到对应目录下

    在Obfuscation下的cmakelists.txt将StringObfuscation.cpp添加到编译库中,最后只需要在Transforms/IPO下的PassManagerBuilder.cpp将字符串加密的编译选项添加进去即可

    1. 添加#include “llvm/Transforms/Obfuscation/StringObfuscation.h”引用

    2. 在合适的地方插入以下两条函数声明,即编译时的编译参数-mllvm -sobf: 

    3. 在PassManagerBuilder::PassManagerBuilder()构造函数中添加随机数因子的初始化

    static cl::opt<std::string> Seed("seed", cl::init(""), cl::desc("seed for the random")); static cl::opt<bool> StringObf("sobf", cl::init(false), cl::desc("Enable the string obfuscation"));

    4. 最后将该pass添加进void PassManagerBuilder::populateModulePassManager中即可

    0x03 Windows下编译OLLVM

    这里编译环境选择的是windows,其它平台类似 

    编译器:

    MinGW64 for Windows

    Cmake 3.9 rc5 for Windows x64

    这里注意下套件都是选择的64位版本的,并且要注意最好清除下系统变量中之前配置的变量。

    官方编译命令:

    git clone -b llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git

    mkdir build

    cd build

    cmake -DCMAKE_BUILD_TYPE=Release ../obfuscator/

    make -j7

    如果cmake如果不指定参数的话,会默认去选择当前电脑里已有的编译器,如果安装了vs的话,会自动去查找vs的编译器

    如果打算使用vs编译 

    cmake -DCMAKE_BUILD_TYPE=Release ../obfuscator/ 

    会生成32位的依赖版本 

    cmake -G “Visual Studio 15 2017 Win64” -DCMAKE_BUILD_TYPE=Release ../obfuscator/ 

    上面这种方法就会生成64位版本的编译环境,不过在测试编译时,32位正常编译通过,64位踩了很多坑,所以还是不建议使用vs编译。

    使用MinGw编译时,需要加上参数 

    cmake -G “MinGW Makefiles” -DCMAKE_BUILD_TYPE=Release ../obfuscator/ 

    最后再执行make -j7 即可,数字可根据电脑配置进行选择,编译完成后,会在build/bin下看到编译完成的二进制文件。

    0x04 NDK使用OLLVM

    将编译好的clang.exe , clang++.exe 以及上级目录下 lib/clang下的文件夹拷贝出来,我这里使用的是ndk 13,直接将这些文件拷贝到toolchainsllvmprebuiltwindows-x86_64,其中exe文件复制到bin目录下,lib文件夹直接复制到windows-x86_64目录下即可。

    新建一个Android Studio工程测试下效果,开启字符串加密编译选项

    编写测试函数

    在函数前添加了fla属性,该属性代表ollvm的Control Flow Flattening ,具体可见ollvm项目的wiki,编译运行查看结果。

    使用IDA打开编译后的so文件,可以看到函数中的字符串已经不显示了,

    640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

    而Test函数的流程也被进行了混淆。

    640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

    F5后:

    640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


    0x05 总结

    在项目中合理的使用ollvm可以帮助增加逆向难度,并且针对关键的函数混淆对性能的影响也比较小。

    展开全文
  • iOS代码混淆

    2018-11-13 15:18:32
    这不安全检测没过����,这里面的问题就提到了代码混淆问题 准备工作 cd到你自己的项目目录级 创建confuse.sh文件和func.list文件 选中项目选择运行脚本。这里需要注意的是$PROJECT_DIR/confuse....

    最近在做银行的项目,所以对安全性要求很高。这不安全检测就没过??,这里面的问题就提到了代码混淆问题
    ####准备工作

    1. cd到你自己的项目目录级这里写图片描述
    2. 创建confuse.sh(confuse.sh里面的代码贴在了最下方这里需要先把下方的内容复制进来)文件和func.list文件这里写图片描述
    3. 选中项目选择运行脚本。这里需要注意的是$PROJECT_DIR/confuse.sh这个的路径和创建pch文件时的路径是一样的,$PROJECT_DIR代表整个工程,/confuse.sh是这个文件的路径。 这里写图片描述
    4. 然后command + B编译一下,如果报错了就cd到项目的目录级下,然后输入命令行 chmod 755 confuse.shchmod 777 confuse.sh 给我们的脚本本间授权这里写图片描述
    5. 成功之后会自动生成一个codeObfuscation.h文件,注意:如果没有生成也可以自己创建一个空白的.h文件这里写图片描述
    6. 然后在pch文件中导入codeObfuscation.h文件。这里写图片描述

    ####重点来了

    1. 全局混淆。如果我们之前没有考虑到混淆的问题现在用全局混淆并不明智,因为有的时候方法名的命名并不是那么规范,这里我们全局混淆以sk_开头的方法名,如果不想做特定的限制的话可以把|sed -n "/^sk_/p"这里给删除掉,我们来看下效果:这里写图片描述这里写图片描述这里写图片描述
    2. 局部混淆。可以在func.list文件中手动添加方法。编译之后就可以了这里写图片描述

    ####重中之重confuse.sh里的内容

    #!/usr/bin/env bash
    
    TABLENAME=symbols
    SYMBOL_DB_FILE="symbols"
    STRING_SYMBOL_FILE="$PROJECT_DIR/func.list"
    HEAD_FILE="$PROJECT_DIR/codeObfuscation.h"
    ####这里是全局混淆要查找的内容路径,不需要全局混淆的时候要注释掉
    #CONFUSE_FILE="$PROJECT_DIR/MobileOA"
    export LC_CTYPE=C
    ####这里是全局混淆要查找的条件,不需要全局混淆的时候要注释掉
    #取以.m或.h结尾的文件以+号或-号开头的行 |去掉所有+号或-号|用空格代替符号|n个空格跟着<号 替换成 <号|开头不能是IBAction|用空格split字串取第二部分|排序|去重复|删除空行|删掉以init开头的行>写进func.list
    ## |sed -n "/^sk_/p" 是特定问方法名的开头,不需要的话可以删掉
    #grep -h -r -I  "^[-+]" $CONFUSE_FILE  --include '*.[mh]' |sed "s/[+-]//g"|sed "s/[();,: *\^\/\{]/ /g"|sed "s/[ ]*</</"| sed "/^[ ]*IBAction/d"|awk '{split($0,b," "); print b[2]; }'| sort|uniq |sed "/^$/d" |sed -n "/^sk_/p" >$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; do
    if [[ ! -z "$line" ]]; then
    ramdom=`ramdomString`
    echo $line $ramdom
    insertValue $line $ramdom
    echo "#define $line $ramdom" >> $HEAD_FILE
    fi
    done
    echo "#endif" >> $HEAD_FILE
    
    
    sqlite3 $SYMBOL_DB_FILE .dump
    
    

    传送门DEMO

    展开全文
  • 今天主要想说的是iOS的代码混淆,为什么想做代码混淆?为了APP的安全,为了防止别人破壳轻易破解我们代码;还有就是做马甲包了,我们知道马甲包的市场需求很大,但是不能花费过多的精力在开发上,毕竟只是个马甲,没...

    前言

    最近一直在看Python,也很喜欢Python的灵活性;今天主要想说的是iOS的代码混淆,为什么想做代码混淆?为了APP的安全,为了防止别人破壳轻易破解我们代码;还有就是做 马甲包 了,我们知道马甲包的市场需求很大,但是不能花费过多的精力在开发上,毕竟只是个马甲,没必要花费太多的成本!

    混淆工具

    网上搜了一下,开源免费的混淆都在转载 念茜大姐大 的 sh脚本 的混淆方法,或者在念茜的脚本基础上二次开发,大家去看过就知道念茜的这篇博客是在14年写的,那时我刚做iOS没多久 ,而且那时候中国区审核还没有那么严格,若果你现在还使用那种方法进行混淆,你肯定会收到苹果的 2.3.1 大礼包 ,所以我们还是探索别的混淆方法吧,不要再挖坟了!

    我这里主要是通过Python写的混淆工具,具体功能有方法混淆、属性混淆、类名混淆、添加垃圾代码、删除注释、修改资源文件Hash值、 加密字符串 、翻新资源名、 模拟人工混淆 、混淆文件名、混淆文件目录、混淆词库、混淆日志、映射列表、图片压缩、爬虫服务,具体的如下:

    软件界面

    1.下载地址:

    链接: pan.baidu.com/s/1esdfDdjO… 密码:2lbr

    :clap::clap::clap:进群免费拿邀请码:clap::clap::clap:365152048:clap::clap::clap:

    2.教学视频:

    链接: pan.baidu.com/s/1pqUkgU8Y… 密码:9sll

    开始混淆

    import addRubbishCode    as addCode
    import cunfusionObjName  as conObjN
    import confusionFun      as conFunc
    import cunfusionProperty as conPro
    import confusionLog      as conLog
    import deleteNotes       as delNot
    import updateSourceHash  as updHash
    import encryptString     as encStr
    import sourceName        as soName
    import missFolder
    from singletonModel import ZFJPersoninfo
    
    def start_fun(file_dir, funMap = {}):
    	personinfo = ZFJPersoninfo()
    	personinfo.isMissing = True
    	if len(file_dir) == 0:
    		return
    	if int(funMap['property']) > 0:
    		# 混淆属性
    		conLog.tips('*' * 30 + 'Fun:开始混淆属性' + '*' * 30)
    		conPro.startConfusionPro(file_dir)
    
    	if int(funMap['funName']) > 0:
    		# 混淆方法
    		conLog.tips('*' * 30 + 'Fun:开始混淆方法' + '*' * 30)
    		conFunc.startConfusionFun(file_dir)
    
    	if int(funMap['objName']) > 0:
    		# 混淆类名
    		conLog.tips('*' * 30 + 'Fun:开始混淆类名' + '*' * 30)
    		prefix = funMap['funNamePrefix'].replace('0', '')  #-添加类名前缀
    		personinfo.prefix = prefix #前缀存到单利里面
    		fixObjName = funMap['fixObjName'] #-自动修复过滤文件夹中引用的类名
    		conObjN.startObfuscatedObjName(file_dir, prefix)
    
    	if int(funMap['souHashKey']) > 0:
    		# 修改资源文件的hash值 
    		conLog.tips('*' * 30 + 'Fun:修改资源HASH值' + '*' * 30)
    		updHash.startUpdateSourceHash(file_dir)
    
    	if int(funMap['upSouName']) > 0:
    		# 翻新资源文件名
    		conLog.tips('*' * 30 + 'Fun:翻新资源文件名' + '*' * 30)
    		soName.startSourceName(file_dir)
    
    	if int(funMap['encryStr']) > 0:
    		# 加密明文字符串
    		conLog.tips('*' * 30 + 'Fun:加密明文字符串' + '*' * 30)
    		encStr.startEncryptStr(file_dir)
    
    	if int(funMap['rubbishCode']) > 0:
    		# 垃圾代码
    		conLog.tips('*' * 30 + 'Fun:添加垃圾代码' + '*' * 30)
    		amount = int(funMap['rubbishLine']) # -添加行数
    		addCode.startAddRubbishCode(file_dir, amount)
    
    	if int(funMap['deleteNotes']) > 0:
    		# 混淆或者删除注释
    		conLog.tips('*' * 30 + 'Fun:开始删除注释' + '*' * 30)
    		delNot.startDeleteNotes(file_dir)
    
    	if int(funMap['missFolder']) > 0:
    		# 混淆文件夹名
    		conLog.tips('*' * 30 + 'Fun:开始混淆文件夹名' + '*' * 30)
    		missFolder.startMissFolder(file_dir)
    
    	conLog.tips('*' * 30 + 'End:混淆结束' + '*' * 30)
    	personinfo.isMissing = False
    Python资源分享qun 881982657 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
    
    复制代码

    混淆日志

    混淆的部分日志,混淆的时候回通过import logging自动生成混淆日志《 ZFJ混淆日志.log 》,便于开发者修改部分报错:

    忽略路径

    我们在混淆的时候,没必要全部进行混淆,特别是第三方库,或者Pods管理的第三方库;毕竟混淆的越多问题也就越多,所以我添加了混淆忽略文件:open_file_folder:,如下图:

    import confusionLog as conLog
     
    ignore_Files = ['/Pods/', '/Vendor/', '/LIB/', '/Util/']
    conLog.tips('已忽略的路径 === ' + str(ignore_Files))
     
    # 判断是否是忽略的文件夹
    def isIgnoreFiles(tmp_path):
    	# if '+' in tmp_path:
    	# 	return True
    	for item in ignore_Files:
    		if item in tmp_path:
    			return True
    	return False
    Python资源分享qun 881982657 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
    
    
    复制代码

    特别说明

    混淆以后肯定会有或多或少的报错,所以要求使用者必须会iOS开发技能,一般报错都是因为一下两点:

    1.方法名相同,被多次混淆覆盖;

    2.忽略的文件夹中包含了已被混淆的类或者方法;

    3.图片如果不显示,可能原因是代码中图片名采用的是拼接的,手动替换一下就可以了;

    4.如果发现文本丢失,一般是在文本中有<*** 注释 *>类型的注释了,找到原项目替换一下;

    5.如果使用混淆工程目录因为PCH和Infor.plist报错,需要手动到project.pbxproj修改路径(详见路径混淆部分);

    6.如果出现项目路径修改了,但是本地实体路径没有修改,自己手动把本地路径修改一下;

    7.utf-8编码错误和[Errno 13] Permission denied权限错误不用管;

    以上错误都可以在日志文件中找到对应的混淆字段,然后手动替换上去就行!

    还有就是,该混淆工具目前只适用于OC项目工程,不支持swift项目,但是我打算等OC混淆工具全部OK以后(包括图形界面),会把swift的混淆加进去的!

    混淆结果

    1.函数混淆

    2.属性混淆

    3.类名混淆

    4.添加垃圾代码

    垃圾代码的调用与实现

    5.去除注释

    6.修改Hash值

    针对项目中的资源文件,我们可以通过修改Hash的方式来进行混淆,运行如下:

    :high_brightness:Tips:已忽略的路径 === ['/Pods/', '/Vendor/', '/LIB/', '/Util/']
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/MainWeb_Back_Icon.imageset/fanhui-4.png
    :tada:Infor:[UPdHash Meg] Old:dd03889c2e8647b9377d08775333557ff11425dd<->New:4a72c7b640882ae436b18868aa021331169db3fa
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/60.png
    :tada:Infor:[UPdHash Meg] Old:2d73347848d7168c09c48efe28a7ac5a9ec7411b<->New:551483123b5cc2c4c5ff2f5bf876db0d075261a1
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/58.png
    :tada:Infor:[UPdHash Meg] Old:c0c671fe3707bca8c5accdcadd8aa9f4f1f2726c<->New:d022db1c1f99c263b69bc09c09bc52dd1fa97fb5
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/120-1.png
    :tada:Infor:[UPdHash Meg] Old:5a6a7ec42d7489be18888828c1a9caba0da688ca<->New:8bbddfbbbed9023e4537e9e6caeed79c88ef8955
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/120.png
    :tada:Infor:[UPdHash Meg] Old:5a6a7ec42d7489be18888828c1a9caba0da688ca<->New:dcc4b47092bca1d6a6bb6d7bd671a0ef7ce2f4da
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/180.png
    :tada:Infor:[UPdHash Meg] Old:fee9220dbba52040517a0f77ffe8335e9300a64b<->New:d28a9118e1cf4a2ce9fc2805184ad42e20500c95
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/GUEG_ICON.png
    :tada:Infor:[UPdHash Meg] Old:07ed6c66ec7d5550bfa1e32b4848687417027c90<->New:fb780d87591cc86dd0fd24cdfa41e76a091ad657
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/80.png
    :tada:Infor:[UPdHash Meg] Old:ca3b3f61fc4c391515fe895d81360d15ec598049<->New:769ebf182fbb3a3fd69c46c3a595c1669c505f63
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/40.png
    :tada:Infor:[UPdHash Meg] Old:1bb7908a2ba1295fa69ad476a81003f2f413a3a8<->New:10793e67b27cdf5ad1ee4b9d37aecc62074b8ffc
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/87.png
    ......等等......
    Python资源分享qun 881982657 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

    6.加密字符串

    编译前的代码如下:

    - (void)uiConfig{
        ZFJView *zfjView = [[ZFJView alloc] initWithZFJ:@"ZFJ1128"];
        zfjView.backgroundColor = [UIColor yellowColor];
        zfjView.frame = CGRectMake(100, 100, 150, 150);
        [zfjView setZFJViewTitleLab];
        [zfjView setZFJViewTitleLab:@"aaaaaa"];
        [zfjView setZFJViewTitleLab:@"aaa" efg:@"dscvdscsd"];
        [zfjView setZFJViewTitleLab:@"ddscvsdv" efg:@"cdsvdfbdf" hijk:@"cdvsvbdsbdfgnfdhnhdg"];
        [self.view addSubview:zfjView];
        
        [ZFJView svdsvfdsvfdvbzdfb];
    }
    复制代码
    编译后的代码如下:
    
    - (void)uiConfig{
        ZFJView *zfjView = [[ZFJView alloc] initWithZFJ:ZFJ_NSSTRING(((char []) {240, 236, 224, 155, 155, 152, 146, 0}))];
        zfjView.backgroundColor = [UIColor yellowColor];
        zfjView.frame = CGRectMake(100, 100, 150, 150);
        [zfjView setZFJViewTitleLab];
        [zfjView setZFJViewTitleLab:ZFJ_NSSTRING(((char []) {203, 203, 203, 203, 203, 203, 0}))];
        [zfjView setZFJViewTitleLab:ZFJ_NSSTRING(((char []) {203, 203, 203, 0})) efg:ZFJ_NSSTRING(((char []) {206, 217, 201, 220, 206, 217, 201, 217, 206, 0}))];
        [zfjView setZFJViewTitleLab:ZFJ_NSSTRING(((char []) {206, 206, 217, 201, 220, 217, 206, 220, 0})) efg:ZFJ_NSSTRING(((char []) {201, 206, 217, 220, 206, 204, 200, 206, 204, 0})) hijk:ZFJ_NSSTRING(((char []) {201, 206, 220, 217, 220, 200, 206, 217, 200, 206, 204, 205, 196, 204, 206, 194, 196, 194, 206, 205, 0}))];
        [self.view addSubview:zfjView];
        
        [ZFJView svdsvfdsvfdvbzdfb];
    }
    Python资源分享qun 881982657 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

    加密混淆反编译前后Hopper对比如下:

    我们可以看到再通过Hopper看不到硬编码了!:+1::+1::+1:

    8.翻新资源名

    找到工程中的图片资源并翻新,然后自动替换代码中的引用。

    9.混淆工程目录

    说明:如果你的项目包含PCH,还有自带的Info.plist,需要你手动到project.pbxproj修改路径;

    10.图片压缩工具

    ZFJObsLib集成图片压缩工具,支持一键生成iOS开发三套图标,也支持自定义压缩尺寸,还可以移除Alpha通道,转成RGB图片模式;实现逻辑可参考: zfj1128.blog.csdn.net/article/det…具体如下图:

    展开全文
  • iOS-代码混淆加固策略

    2018-09-22 18:31:26
    对于IOS来说,由于系统是封闭的,APP上架需要通过App Store,安全性来说相当高。但是对于大厂和知名APP而言,别人给的... 第一板斧是防静态分析,这里包括字符串加密、符号混淆、代码逻辑混淆和游戏存档加密; ...

    对于IOS来说,由于系统是封闭的,APP上架需要通过App Store,安全性来说相当高。但是对于大厂和知名APP而言,别人给的安全保障永远没有自己做的来得踏实。所以对于大厂、少部分企业级和金融支付类应用来说加固是相当重要的。

    下面是目前几个专业加固大厂提供的加固策略

    网易

    网易安全三板斧:

    1. 第一板斧是防静态分析,这里包括字符串加密、符号混淆、代码逻辑混淆和游戏存档加密;

    2. 第二板斧是防动态调试、反调试和通信安全(数据加密);

    3. 第三板斧是外挂检测、加速挂、内存修改挂和自动任务挂等

    爱加密

    safengine

    几维安全

    梆梆安全

    本文将针对以上几点进行实现,对于一些不太容易实现的将会做方向性讨论

    • 字符串加密

    • 代码混淆(方法命,类命,变量名,符号表)

    • 代码逻辑混淆

    • 反调试

    字符串加密

    对字符串加密的方式目前我所了解到掌握到的最可靠方式就是用脚本将代码中的所有标记需要加密的字符串进行异或转换,这样代码中就不存在明文字符串了。当然第三方的字符串加密不可能这么简单,具体怎么做的我也不太清楚。不过为了增加字符串加密的难度复杂性,我们可以先将字符串用加密工具转换(例如AES、base64等)后的把加字符串放在工程中,并且把解密的钥匙放在工程中,用异或转换,把解密钥匙和加密后的字符串转换,这样就有2层保障,增加了复杂度。

    首先 我们创建任意一个工程,在工程中写入下面的代码,并在每句打上断点,再选择Xcode工具栏的Debug –> Debug Workflow –> Always Show Disassembly。这样你就可以在断点处进入汇编模式界面,最后运行程序

    /* 加密NSString字符串 */
        NSString *str = @"Hello World";
        NSLog(@"%@",str);
        /* 加密char*字符串 */
        char* cStr = "Super Man";
        NSLog(@"%s",cStr);
    

    断点处进入汇编模式界面

    你会发现,你的字符串内容暴露在了汇编模式中,这会导致别人在逆向分析你的工程时能看见你的字符串内容,我们一般接口、域名、加解密钥匙串、AppKey、AppId等比较重要的东西会放在客户端用作字符串,这就很容易暴露出来。

    步骤1 首先需要在工程代码中进行修改,把下面的宏和decryptConfusionCS,decryptConstString函数放入代码中,用宏包含每个需要转换的字符串。

    /* 字符串混淆解密函数,将char[] 形式字符数组和 aa异或运算揭秘 */
    extern char* decryptConfusionCS(char* string)
    {
        char* origin_string = string;
        while(*string) {
            *string ^= 0xAA;
            string++;
        }
        return origin_string;
    }
    
    /* 解密函数,返回的是NSString类型的 */
    extern NSString* decryptConstString(char* string)
    {
        /* 先执行decryptConfusionString函数解密字符串 */
        char* str = decryptConfusionCS(string);
        /* 获取字符串的长度 */
        unsigned long len = strlen(str);
        NSUInteger length = [[NSString stringWithFormat:@"%lu",len] integerValue];
         NSString *resultString = [[NSString alloc]initWithBytes:str length:length encoding:NSUTF8StringEncoding];
        return resultString;
    }
    
    
    /*
     * 使用heyujia_confusion宏控制加密解密
     * 当heyujia_confusion宏被定义的时候,执行加密脚本,对字符串进行加密
     * 当heyujia_confusion宏被删除或为定义时,执行解密脚本,对字符串解密
     */
    #define heyujia_confusion
    
    #ifdef heyujia_confusion
    /* heyujia_confusion 宏被定义,那么就进行执行解密脚本 */
    /* confusion_NSSTRING宏的返回结果是NSString 类型的 */
    #define confusion_NSSTRING(string) decryptConstString(string)
    /* confusion_CSTRING宏的返回结果是char* 类型的 */
    #define confusion_CSTRING(string) decryptConfusionCS(string)
    #else
    /* heyujia_confusion 宏没有被定义,那么就执行加密脚本 */
    /* 加密NSString类型的 */
    #define confusion_NSSTRING(string) @string
    /* 加密char *类型的 */
    #define confusion_CSTRING(string) string
    #endif
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        /* 使用confusion_NSSTRING宏包含需要加密的NSString字符串 */
        NSString *str = confusion_NSSTRING("Hello World");
        NSLog(@"%@",str);
        /* 使用confusion_NSSTRING宏包含需要加密的char*字符串 */
        char* cStr = confusion_CSTRING("Super Man");
        NSLog(@"%s",cStr);    
    }
    

    步骤2 使用终端cd 到需要加密的工程目录下 执行touch confusion.py 和 touch decrypt.py 命令,生产加密和解密脚本文件

    步骤3 把下面代码加入解密脚本confusion.py中

    #!/usr/bin/env python
    # encoding=utf8
    # -*- coding: utf-8 -*-
    # author by heyujia
    # 脚本将会用于对指定目录下的.h .m源码中的字符串进行转换
    # 替换所有字符串常量为加密的char数组,形式((char[]){1, 2, 3, 0})
    
    import importlib
    import os
    import re
    import sys
    
    
    # replace替换字符串为((char[]){1, 2, 3, 0})的形式,同时让每个字节与0xAA异或进行加密
    # 当然可以不使用0xAA 使用其他的十六进制也行 例如0XBB、0X22、0X11
    def replace(match):
        string = match.group(2) + '\x00'
        replaced_string = '((char []) {' + ', '.join(["%i" % ((ord(c) ^ 0xAA) if c != '\0' else 0) for c in list(string)]) + '})'
        return match.group(1) + replaced_string + match.group(3)
    
    
    # obfuscate方法是修改传入文件源代码中用confusion_NSSTRING标记的所有字符串
    # 使用replace函数对字符串进行异或转换
    def obfuscate(file):
        with open(file, 'r') as f:
            code = f.read()
            f.close()
            code = re.sub(r'(confusion_NSSTRING\(|confusion_CSTRING\()"(.*?)"(\))', replace, code)
            code = re.sub(r'//#define ggh_confusion', '#define ggh_confusion', code)
            with open(file, 'w') as f:
                f.write(code)
                f.close()
    
    
    # openSrcFile方法是读取源码路径下的所有.h和.m 文件
    # 对每个文件执行obfuscate函数
    def openSrcFile(path):
        print("混淆的路径为 "+ path)
        # this folder is custom
        for parent,dirnames,filenames in os.walk(path):
            #case 1:
            #        for dirname in dirnames:
            #            print((" parent folder is:" + parent).encode('utf-8'))
            #            print((" dirname is:" + dirname).encode('utf-8'))
            #case 2
            for filename in filenames:
                extendedName = os.path.splitext(os.path.join(parent,filename))
                if (extendedName[1] == '.h' or extendedName[1] == '.m'):
                    print("处理源代码文件: "+ os.path.join(parent,filename))
                    obfuscate(os.path.join(parent,filename))
    
    
    #这里需要修改源码的路径为自己工程的文件夹名称
    srcPath = '../daimahunxiao'
    
    if __name__ == '__main__':
        print("本脚本用于对源代码中被标记的字符串进行加密")
    
        if len(srcPath) > 0:
            openSrcFile(srcPath)
        else:
            print("请输入正确的源代码路径")
            sys.exit()
    

    步骤4 把下面的解密代码放入decrypt.py解密脚本中

    #!/usr/bin/env python
    # encoding=utf8
    # -*- coding: utf-8 -*-
    # author by heyujia
    # 解密脚本
    # 替换所有标记过的加密的char数组为字符串常量,""
    
    import importlib
    import os
    import re
    import sys
    
    
    # 替换((char[]){1, 2, 3, 0})的形式为字符串,同时让每个数组值与0xAA异或进行解密
    def replace(match):
        string = match.group(2)
        decodeConfusion_string = ""
        for numberStr in list(string.split(',')):
            if int(numberStr) != 0:
                decodeConfusion_string = decodeConfusion_string + "%c" % (int(numberStr) ^ 0xAA)
        replaced_string = '\"' + decodeConfusion_string + '\"'
    
        print("replaced_string = " + replaced_string)
    
        return match.group(1) + replaced_string + match.group(3)
    
    
    # 修改源代码,加入字符串加密的函数
    def obfuscate(file):
        with open(file, 'r') as f:
            code = f.read()
            f.close()
            code = re.sub(r'(confusion_NSSTRING\(|confusion_CSTRING\()\(\(char \[\]\) \{(.*?)\}\)(\))', replace, code)
            code = re.sub(r'[/]*#define ggh_confusion', '//#define ggh_confusion', code)
            with open(file, 'w') as f:
                f.write(code)
                f.close()
    
    
    #读取源码路径下的所有.h和.m 文件
    def openSrcFile(path):
        print("解密路径: "+ path)
        # this folder is custom
        for parent,dirnames,filenames in os.walk(path):
            #case 1:
            #        for dirname in dirnames:
            #            print((" parent folder is:" + parent).encode('utf-8'))
            #            print((" dirname is:" + dirname).encode('utf-8'))
            #case 2
            for filename in filenames:
                extendedName = os.path.splitext(os.path.join(parent,filename))
                #读取所有.h和.m 的源文件
                if (extendedName[1] == '.h' or extendedName[1] == '.m'):
                    print("已解密文件:"+ os.path.join(parent,filename))
                    obfuscate(os.path.join(parent,filename))
    
    
    #源码路径
    srcPath = '../daimahunxiao'
    if __name__ == '__main__':
        print("字符串解混淆脚本,将被标记过的char数组转为字符串,并和0xAA异或。还原代码")
        if len(srcPath) > 0:
            openSrcFile(srcPath)
        else:
            print("请输入正确的源代码路径!")
            sys.exit()
    

    步骤5 根据自己的需求修改下脚本里面的代码 和 文件路径。

    步骤6 把步骤1中的宏heyujia_confusion注释了,然后执行加密脚本,在终端中输入python confusion.py,

    (1.如果报错,请查看下自己Mac电脑中的python版本,如果是python3就输入python3 confusion.py.

    (2.如果报Non-ASCII character '\xe8' in file confusion.py on line 2相关的错,请确定脚本的前面3行是

    #!/usr/bin/env python
    # encoding=utf8
    # -*- coding: utf-8 -*-
    

    必须有这三行代码,才能在脚本中输入中文

    (3.如果报IndentationError: unexpected indent,请注意脚本中的每行代码的换行符和缩进格式必须标准

    执行完步骤6后的结果

    此时字符串已被加密,运行程序会发现一切正常

    输出结果

    加密后汇编界面

    加密后汇编界面看不见我们的字符串内容了,但是我们用来解密的方法还是暴露在了汇编界面,所以我们后期还需要对方法名,变量名,类命等做混淆。

    步骤7 把步骤1中的宏heyujia_confusion取消注释,然后执行解密脚本,在终端中输入python decrypt.py

    解密后

    解密后文本又变回了原样。

    这里只是基本的异或转换加密,让代码中的字符串变成看不懂的char [],实际操作中远远不止这么简单

    例如:

    • 首先:我们先用加密工具例如:AES.Base64等把需要转换的字符串先加密变成加密字符串

    • 然后:在用异或转换加密的脚本把加密字符串进行转换(包括解密用的钥匙串)

    • 在使用的时候:先异或解密字符串,然后根据解密钥匙串把字符串在转为可用的字符串

    ps.还有一种保护字符串的方法,就是使用NSLocalizedString字符串本地化。

    虽然跟着我的步骤你确实加密成功了,但是你却无法实际验证。所以要验证最终的混淆结果是否达到效果,你还需要学习如何破壳解密IPA如何动态静态逆向编程分析工程源码,大家可以先看看我这篇文章。先掌握逆向分析后在来做代码混淆,就能验证混淆结果是否有效

    变量、方法名,类名混淆

    对于混淆这一块,网上真的是千篇一律,基本都是copy的念大婶的内容,没有一点自己的创新和思考。网上的方法我也用过,但是有缺陷,只能混淆方法名或者说自己固定的内容去替换。第一不自动,对于大项目而言每个方法名自己添加,太麻烦。第二变量混淆有问题,因为只是单纯的字符串替换,用宏代替。当遇到使用_ 下划线访问变量时,就会出现错误。

    对于变量、方法名,类名的混淆,其实跟字符串混淆差不多,都是加密混淆,然后解密混淆。不同的是,变量、方法名,类名的混淆目的是为了让别人反编译的时候不知道你的变量、方法,类是具体用来干什么的,不会想明文那样一目了然。增加逆向难度。混淆的内容不需要想字符串一样,最后程序运行时还要转成中文正常使用。由于本人对shell脚本语言也不是非常熟悉,想要按照自己的思路写一套完整的混淆脚本还不行。所以这部分也是在网上找的,算是目前最实用最完善的混淆

    首先 打开终端cd到需要混淆的工程目录下,输入

    touch obConfusion.sh (加密混淆脚本文件)

    touch obDecrypt.sh(解密混淆脚本文件)

    生成2个脚本文件

    然后在工程目录以外创建一个文件夹,用于保存加密时生成的加密文本内容,该内容会在解密是用到

    最后是在obConfusion.sh和obDecrypt.sh文件中加入脚本内容

    下面是加密混淆脚本内容

    #!/bin/sh
    ##################################
    #  (该脚本是在https://github.com/heqingliang/CodeObfus 上找到的)
    #  代码混淆脚本  heyujia 2018.03.15
    #
    ##################################
    
    #识别含有多字节编码字符时遇到的解析冲突问题
    export LC_CTYPE=C
    export
    
    #配置项:
    #项目路径,会混淆该路径下的文件
    ProjectPath="/Users/xieyujia/Desktop/ios/学习项目/daimahunxiao"
    #这个路径是混淆成功后,原文本和替换文本解密对应的文件存放路径(该路径不能在项目目录或其子目录),混淆成功后会在该路径下生成一个解密时需要的文件,根据该文件的文本内容把混淆后的内容更换为原文本内容,该文件名的组成由$(date +%Y%m%d)"_"$(date +%H%M)及日期_小时组成,每分钟会不一样。所以解密的时候需要每次更换文件路径
    SecretFile="/Users/xieyujia/Desktop/ios/学习项目/tihuan"$(date +%Y%m%d)"_"$(date +%H%M)
    
    #第一个参数为项目路径
    if [[ $1 ]]
    then
    if [[ $1 != "_" ]]; then
    ProjectPath=$1
    fi
    fi
    #第二个参数指定密钥文件路径及文件名
    if [[ $2 ]]
    then
    if [[ $2 != "_" ]]; then
    SecretFile=$2
    fi
    fi
    ##############################################################################
    
    #查找文本中所有要求混淆的属性\方法\类,只会替换文本中ob_开头和_fus结尾的字符串(区分大小写,例如oB_就不会做混淆),如果注释内容有该类型的字符串,也会进行替换。对于使用 _下划线访问的变量属性,不会有影响,一样会替换成对应_的混淆内容。
    resultfiles=`grep 'ob_[A-Za-z0-9_]*_fus' -rl $ProjectPath`
    #查找结果为空则退出
    if [[ -z $resultfiles ]]
    then
    echo "项目没有需要混淆的代码"
    exit
    else
    echo "开始混淆代码..."
    echo  > $SecretFile
    fi
    
    x=$(awk  '
    BEGIN{srand();k=0;}
    #随机数生成函数
    function random_int(min, max) {
    return int( rand()*(max-min+1) ) + min;
    }
    #随机字符串生成函数
    function random_string(len) {
    result="UCS"k;
    alpbetnum=split("a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z", alpbet, ",");
    for (i=0; i<len; i++) {
    result = result""alpbet[ random_int(1, alpbetnum) ];
    }
    return result;
    }
    /ob_[A-Za-z0-9_]*_fus/{
    x = $0;
    #匹配需要混淆的属性变量方法
    while (match(x, "ob_[A-Za-z0-9_]*_fus") > 0) {
    tempstr=substr(x, RSTART, RLENGTH);
    #判断是否有之前已经找过的重复字符串
    for ( i = 0; i < k; i++ ){
    if (strarr[i] == tempstr){break;}
    }
    if(i<k){
    #重复字符串,直接删除。所以不用担心混淆内容过多,可能会出现重复的混淆字符串
    x=substr(x, RSTART+RLENGTH);
    continue;
    }else{
    #不是重复字符串,添加到替换数组
    strarr[k++]=tempstr;
    }
    randomstr=random_string(20);
    printf("%s:%s|", tempstr,randomstr);
    #替换随机字符串
    gsub(tempstr,randomstr, x);
    x = substr(x, RSTART+RLENGTH);
    }
    }' $resultfiles )
    
    #加密对写入密钥文件
    echo $x > $SecretFile
    
    recordnum=1
    while [[ 1 == 1 ]]; do
    record=`echo $x|cut -d "|" -f$recordnum`
    if [[ -z $record ]]
    then
    break
    fi
    record1=`echo $record|cut -d ":" -f1`
    echo "原项:"$record1
    record2=`echo $record|cut -d ":" -f2`
    echo "加密项:"$record2
    #替换文件夹中所有文件的内容(支持正则)
    #单引号不能扩展
    sed -i '' "s/${record1}/${record2}/g" `grep $record1 -rl $ProjectPath`
    echo "第"$recordnum"项混淆代码处理完毕"
    let "recordnum = $recordnum + 1"
    done
    
    #查找需要混淆的文件名并替换
    filerecordnum=1
    while [[ 1 == 1 ]]; do
    filerecord=`echo $x|cut -d "|" -f$filerecordnum`
    if [[ -z $filerecord ]]
    then
    break
    fi
    filerecord1=`echo $filerecord|cut -d ":" -f1`
    #echo "原项:"$filerecord1
    filerecord2=`echo $filerecord|cut -d ":" -f2`
    #echo "加密项:"$filerecord2
    #改文件名
    
    find $ProjectPath -name $filerecord1"*"| awk '
    BEGIN{frecord1="'"$filerecord1"'";frecord2="'"$filerecord2"'";finish=1}
    {
    filestr=$0;
    gsub(frecord1,frecord2,filestr);
    print "mv " $0 " " filestr";echo 第"finish"个混淆文件处理完毕";
    finish++;
    }'|bash
    let "filerecordnum = $filerecordnum + 1"
    done
    

    下面是解密混淆脚本的内容

    #!/bin/sh
    ######################################
    #
    #  代码还原脚本  RyoHo 2018.03.15
    #
    ######################################
    
    #识别含有多字节编码字符时遇到的解析冲突问题
    export LC_CTYPE=C
    export
    
    #配置项:
    #已经混淆的项目路径
    ProjectPath="/Users/xieyujia/Desktop/ios/学习项目/daimahunxiao"
    #这个是文件路径而不是目录,是混淆的时候生成的文本文件路径,每次不一样。所以每次加密后,解密时需要更换路径
    SecretFile="/Users/xieyujia/Desktop/ios/学习项目/tihuan20180315_1456"
    #第一个参数为项目路径
    if [[ $1 ]]
    then
    if [[ $1 != "_" ]]; then
    ProjectPath=$1
    fi
    fi
    #第二个参数指定密钥文件路径及文件名
    if [[ $2 ]]
    then
    if [[ $2 != "_" ]]; then
    SecretFile=$2
    fi
    fi
    ##############################################################################
    #内容还原
    x=`cat $SecretFile`
    recordnum=1
    while [[ 1 == 1 ]]; do
    record=`echo $x|cut -d "|" -f$recordnum`
    if [[ -z $record ]]
    then
    break
    fi
    record1=`echo $record|cut -d ":" -f1`
    echo "原项:"$record1
    record2=`echo $record|cut -d ":" -f2`
    echo "加密项:"$record2
    #若项目中加密项与密钥文件的加密项不符合则退出程序
    searchresult=`grep $record2 -rl $ProjectPath`
    if [[ -z $searchresult ]]; then
    echo "指定的密钥文件不能还原"
    exit
    fi
    #替换文件夹中所有文件的内容(支持正则)
    #单引号不能扩展
    sed -i '' "s/${record2}/${record1}/g" $searchresult
    echo "第"$recordnum"项混淆代码还原完毕"
    let "recordnum = $recordnum + 1"
    done
    #文件还原
    filerecordnum=1
    while [[ 1 == 1 ]]; do
    filerecord=`echo $x|cut -d "|" -f$filerecordnum`
    if [[ -z $filerecord ]]
    then
    break
    fi
    filerecord1=`echo $filerecord|cut -d ":" -f1`
    #echo "原项:"$filerecord1
    filerecord2=`echo $filerecord|cut -d ":" -f2`
    #echo "加密项:"$filerecord2
    #改文件名
    
    find $ProjectPath -name $filerecord2"*"| awk '
    BEGIN{
    frecord1="'"$filerecord1"'";
    frecord2="'"$filerecord2"'";
    finish=1;
    }
    {
    filestr=$0;
    gsub(frecord2,frecord1,filestr);
    print "mv " $0 " "filestr ";echo 第"finish"个混淆文件还原完毕"
    finish++;
    }'|bash
    let "filerecordnum = $filerecordnum + 1"
    done
    

    应大家需要把脚本源码地址放出来

    建议大家看看脚本内容,有利于学习理解。该脚本是有针对性的混淆内容,可以自己修改脚本中的正则表达式来确定混淆的内容。脚本中只会替换文本中ob_开头和fus结尾的字符串(区分大小写,例如oB就不会做混淆),如果注释内容有该类型的字符串,也会进行替换。对于使用 下划线访问的变量属性,不会有影响,一样会替换成对应的混淆内容。

    提供一个shell脚本学习的网站

    作者:树下敲代码的超人

    展开全文
  • 当时只是略知一二,看过而已,没理解的那么深入,这次根据LLVM + Clang的整个编译流程简单做个记录,而且顺便在每个不同阶段做代码混淆做一下Demo介绍。这里需要安装很多很多东西,个人认为Mac电脑都会安装个Ho...
  • 关于Swift集成framework的方法也查了很多资料,但大同小异,主要有两种 1.利用cocoaTouch Framework建立如图 进入xcode之后,里面就是制作framework的界面和正常的项目一样,不过不能运行(ps:这里只是一个SDK并...
  • 对象存储Swift介绍

    2013-09-09 16:38:45
    OpenStack Object Storage(Swift)是OpenStack开源云计算项目的子项目之一,被称为对象存储,提供了强大的扩展性、冗余和持久性。本文将从架构、原理和实践等几方面讲述SwiftSwift并不是文件系统或者实时的数据...
  • 2.优化类名混淆重名问题; 3.优化代码和项目结构; 更新说明 https://gitee.com/zfj1128/ZFJObsLib_dmg ----------------------------------------分割线-------------------------------------...
  • SWIFT 5.1现在已经正式发布,尽管它只是一个小版本,但它包含了大量的更改和改进-从基本的新特性,比如模块稳定性(它使sdk供应商能够发布预编译的SWIFT框架),到所有的为SwiftUI提供动力的新语法特性,甚至更远的...
  • 这阵子一直在自学Swift, 因为之前iOS的开发一直用Objective-C, 所以习惯了C语言那种宏定义方式, Swift作为一款更加安全的语言, 放弃了C语言中的宏定义, 有效的防止预编译时代码宏替换的安全隐患, 但是也并非不能进行...
  • OpenStack Object Storage(Swift)是OpenStack开源云计算项目的子项目之一,被称为对象存储,提供了强大的扩展性、冗余和持久性。本文将从架构、原理和实践等几方面讲述SwiftSwift并不是文件系统或者实时的数据...
  • 1.iOS应用安全之代码混淆设计篇 2.iOS应用安全之代码混淆实现篇 针对设计篇描述的大致思路,现在针对各个问题点,给出实现方法 该脚本大致使用的工具如下:vi、grep、sed、find、awk、cut、sort、uniq、cat、md5等...
  • 2014年的苹果全球开发者大会(WWDC),当Craig Federighi向全世界宣布“We have new programming language”(我们有了新的编程语言)的时候,全场响起了最热烈和持久的掌声,伴随着掌声到来的语言叫Swift。...
  • Swift-枚举、结构体、类学习如下教程的记录 Getting to Know Enums, Structs and Classes in Swift Swift Tutorial: Initialization In Depth, Part 1/2 Swift中的type system:枚举参考: 官方文档-枚举 明确指定...
  • [译] Swift 代码格式化

    2019-06-10 18:15:29
    原文地址:Swift Code Formatters 原文作者:Mattt 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:iWeslie 校对者:swants, fireairforce 我刚离开了一家时髦的咖啡馆。里面有很多 iOS ...
  • OpenStack Object Storage(Swift)是OpenStack开源云计算项目的子项目之一,被称为对象存储,提供了强大的扩展性、冗余和持久性。本文将从架构、原理和实践等几方面讲述SwiftSwift并不是文件系统或者实时的数据...
  • 第二章:OpenStack架构OpenStack Swift是神奇的,它将一组无关的廉价商品存储服务器转变成可扩展的,耐久的,便于管理的存储系统.我们将通过理解对象逻辑结构和Swift怎样虚拟化底层硬件去组织数据来具体分析Swift的架构...
1 2 3 4 5 ... 20
收藏数 1,363
精华内容 545
热门标签