一、class-dump反编译

1、将打包的ipa反编译下,.ipa改成.zip,并解压

6、右击—显示包内容,找到如下有个白框黑底的 

7、将其复制到桌面xx文件夹中,在终端中输入相关命令 
cd 进入xx文件夹

class-dump -H  二进制文件名字

然后在tt文件中就可以看到多出的很多.h文件

二、ios代码混淆

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

此处使用的混淆方法是:将一些以ycf_xxx开头的方法替换成随机的字符,目前该方法只能针对1个的参数的方法 

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

TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="$PROJECT_DIR/YCFMixConfuseDemo/Resource/func.list" CONFUSE_FILE="$PROJECT_DIR/YCFMixConfuseDemo" HEAD_FILE="$PROJECT_DIR/YCFMixConfuseDemo/Resource/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/[ ]*</</"| sed "/^[ ]*IBAction/d"|awk '{split($0,b," "); print b[2]; }'| sort|uniq |sed "/^$/d"|sed -n "/^ycf_/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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

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

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

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、将新建的PrefixHeader.pch头文件添加到Xcode中去

在Build Settings中搜索Prefix Header,在Prefix Header中写入我们新建头文件的路径 

6、运行项目,但是会报如下问题 

/Users/xxx/Library/Developer/Xcode/DerivedData/YCFMixConfuseDemo-bampqtmksvysbbbaixdeifkkoaqd/Build/Intermediates.noindex/YCFMixConfuseDemo.build/Debug-iphonesimulator/YCFMixConfuseDemo.build/Script-1ED6530E2004577400286FE9.sh: line 2: /Users/youchunfen/Desktop/项目复件/demo/YCFMixConfuseDemo/YCFMixConfuseDemo/Resource/confuse.sh: Permission denied
  • 1

是说confuse.sh没有权限,那么我们cd 到 Resource文件夹中,查看它的权限,发现它没有执行权限,将其修改有可执行的权限 
cd /Users/xxx/demo/YCFMixConfuseDemo/YCFMixConfuseDemo/Resource

查看某个文件的权限 ls -l 文件名 
chmod a+x 文件名 给该文件可执行权限,a是所有人

7、这次就可运行了,但是发现第一次的运行后,然后使用本文的第一部分的class-dump来反编译发现,并没有代码并没有混淆,再次运行后,相关以ycf_开头的函数名才被混淆

appdelegate中原来的函数名 
 
混淆后 

在ViewController中方法名混淆前 

混淆后 

参考链接

 
 
 

最新文章

  1. SQL2014 error 40 ( Microsoft SQL Server, 错误2)
  2. hdu 1015(DFS)
  3. D3+svg 案例
  4. 怎样学习Scala泛函编程
  5. Android 中BaseActivty
  6. yaourt: a pacman frontend(pacman前端,翻译)
  7. *.location.href 用法:
  8. php请求URL中的参数有空格
  9. C# Windows - RadioButton&amp;CheckBox
  10. [转] ArcEngine中打开各种数据源(WorkSpace)的连接
  11. 【hihoCoder第十五周】最近公共祖先&#183;二
  12. 关于++i和i++
  13. mysql常用博客论坛
  14. 手机自动化测试培训:appium目录结构分析
  15. jdk源码-&gt;集合-&gt;ConcurrentHashMap
  16. 微软BI 之SSIS 系列 - 对于平面文件中 NULL 值处理过程中容易极易混淆的几个细节
  17. Spark创建空的DataFrame
  18. Docker:Service
  19. Nginx配置基于ip的虚拟主机
  20. java-mybaits-00202-DAO-原始DAO开发方法

热门文章

  1. shell高级用法
  2. mybatis传多个参数(不使用@param注解情况下),3.4.2版本之后出现#{0}-#{n}参数绑定异常
  3. 关于统一代码规范ResultBean&lt;T&gt;
  4. 零基础入门学习Python(6)--Python之常用操作符
  5. C++解决大数组问题
  6. UVA - 10976 分数拆分
  7. xtu summer individual 6 F - Water Tree
  8. 1016-Prime Ring Problem,素数环,深搜!
  9. [OJ#40]后宫佳丽
  10. MySQL:记录的增删改查、单表查询、约束条件、多表查询、连表、子查询、pymysql模块、MySQL内置功能