利用字符替换进行混淆编译--参考念茜大神的杰作

论坛 期权论坛 脚本     
匿名技术用户   2020-12-28 17:41   512   0

参考念茜大神,因为做的过程中遇到点坑,所以翻新出来写一遍,当作巩固


混淆的方法

方法名混淆其实就是字符串替换,有2个方法可以,一个是#define,一个是利用tops。

利用#define的方法有一个好处,就是可以把混淆结果合并在一个.h中,在工程Prefix.pch的最前面#import这个.h。不导入也可以编译、导入则实现混淆。

单段的selector,如func: ,可以通过#define func 来实现字符串替换。

多段的selector,如a:b:c: ,可以通过分别#define a 、b、c 来实现字符串替换。

我的混淆工具


我写了个简易的混淆脚本,主要思路是把敏感方法名集中写在一个名叫func.h的文件中,逐一#define成随机字符,追加写入.h。

脚本如下:(念茜大神是用func.list存需要改的字符,小的不才 实在创建不出.list文件 故用func.h代替)

  1. #!/usr/bin/env bash
  2. TABLENAME=symbols
  3. SYMBOL_DB_FILE="symbols"
  4. STRING_SYMBOL_FILE="func.h"
  5. HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h"
  6. export LC_CTYPE=C
  7. #维护数据库方便日后作排重
  8. createTable()
  9. {
  10. echo "create table $TABLENAME(src text, des text);" | sqlite3 $SYMBOL_DB_FILE
  11. }
  12. insertValue()
  13. {
  14. echo "insert into $TABLENAME values('$1' ,'$2');" | sqlite3 $SYMBOL_DB_FILE
  15. }
  16. query()
  17. {
  18. echo "select * from $TABLENAME where src='$1';" | sqlite3 $SYMBOL_DB_FILE
  19. }
  20. ramdomString()
  21. {
  22. openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16
  23. }
  24. rm -f $SYMBOL_DB_FILE
  25. rm -f $HEAD_FILE
  26. createTable
  27. touch $HEAD_FILE
  28. echo '#ifndef Demo_codeObfuscation_h
  29. #define Demo_codeObfuscation_h' >> $HEAD_FILE
  30. echo "//confuse string at `date`" >> $HEAD_FILE
  31. cat "$STRING_SYMBOL_FILE" | while read -ra line; do
  32. if [[ ! -z "$line" ]]; then
  33. ramdom=`ramdomString`
  34. echo $line $ramdom
  35. insertValue $line $ramdom
  36. echo "#define $line $ramdom" >> $HEAD_FILE
  37. fi
  38. done
  39. echo "#endif" >> $HEAD_FILE
  40. sqlite3 $SYMBOL_DB_FILE .dump

  1. STRING_SYMBOL_FILE="func.h" #这里表示的是输入源

  2. HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h" #表示输出路径,(如果运行工程找不到codeObfuscation.h有可能是路径错了


操作步骤



1.将混淆脚本confuse.sh放到工程目录下 (以上那一段就是confuse.sh
mv confuse.sh your_proj_path/


2.修改Prefix.pch
打开Xcode,修改XXX-Prefix.ch ,添加混淆头文件:
  1. #ifdef __OBJC__
  2. #import <UIKit/UIKit.h>
  3. #import <Foundation/Foundation.h>
  4. //添加混淆作用的头文件(这个文件名是脚本confuse.sh中定义的)
  5. #import "codeObfuscation.h"
  6. #endif
运行.sh后 codeObfuscation.h会把func.h里写的字符安confuse.sh的规则转换成新的字符 新的字符会在codeObfuscation.h里生成

3.配置Build Phase
在工程Build Phase中添加执行脚本操作,执行confuse.sh脚本,如图:



4.创建函数名列表func.h,写入待混淆的函数名,如:
-(void)sample;
-(void)seg1:(NSString *)string seg2:(NSUInteger)num;
func.h就这样写:
sample
seg1
seg2


并将文件放置于与confuse.sh脚本同级
mv func.h your_proj_path/

5.编译查看结果
直接build,混淆脚本会在编译前运行,进行字符随机替换,并且每次build的随机字符不同,


后话:

如果运行confuse.sh 报错Permission denied 是因为该脚本没有设置权限

不要方 给confuse.sh设置权限便可:在终端找到confuse.sh的路径 输入命令 chmod 777 confuse.sh

然后就可以用了





分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP