app风靡的时代,总有一些奇葩的需求。
为了刷量,刷排名,制作壳包,为了通过苹果爸爸审核,想到代码混淆,垃圾代码等策略。
作为一名程序员,怎么办?

爬了一些文章博客。总的来说有一下几方面:

  • 字符串加密:
  • 类名方法名混淆
  • 程序代码混淆
  • 加入安全SDK

除了这些外,还有很多方面可以做加固保护的,以上这些只是范范一谈。制作壳包为了通过审核,还有注入垃圾代码来解决和主包代码重复率的问题。本文主要讲解类名方法名混淆及垃圾代码的问题。如有问题,还请大神指点!

Objective-C的方法名混淆

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

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

第一步 创建如下文件

1、工程中建立pch文件 加入以下内容

#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
//添加混淆作用的头文件(这个文件名是脚本confuse.sh中定义的)
//#import "codeObfuscation.h"
#endif

2、在工程目录下创建confuse.sh文件


#!/usr/bin/env bashTABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="func.list"
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h"
export LC_CTYPE=C#维护数据库方便日后作排重
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
createTabletouch $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_FILEsqlite3 $SYMBOL_DB_FILE .dump 

3、在工程目录下创建fun.list文件,文件中存放需要混淆的方法名,类名,文件等等

didReceiveMemoryWarning

4、配置项目$PROJECT_DIR/confuse.sh

image.png

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

image.png

类名方法名混淆

此方法是参考下开源项目:ios-class-guard

操作步骤如下:

1、 安装工具

brew install ios-class-guard
brew install --HEAD ios-class-guard   # install bleeding edge version:

image.png

ios-class-guard --v #查看版本

2、下载obfuscate_project到工程根目录下

curl -o obfuscate_project https://raw.githubusercontent.com/Polidea/ios-class-guard/master/contrib/obfuscate_project && chmod +x obfuscate_project

效果如果:

image.png

注意点:提交的commit信息它脚本中会移除掉,包括obfuscate_project也会被移除

image.png

WARNING: This will wipe all your not commited changes in your repository
警告:这将会移除你未提交的更改在你的仓库中。

问题点:

image.png

需要修改脚本中的工程名,scheme,sdk等:

image.png

3、然后继续执行:
当你每次想混淆你的项目。都应该执行此操作。存储包含符号映射的json文件,以便在发生崩溃时获取原始符号名称。

bash obfuscate_project

打开工程,发现已经生成了.hjson文件

image.png

4、添加.pch文件

  • Create PCH file in your project's root directory. In Xcode go to File -> New -> File -> iOS -> Other -> PCH File. To ensure backward compatibility iOS-Class-Guard will be looking for a file matching the *-Prefix.pch mask, as an example MyProject-Prefix.pch
  • At the target's Build Settings, in Apple LLVM - Language section, set Prefix Header to your PCH file name.
  • At the target's Build Settings, in Apple LLVM - Language section, set Precompile Prefix Header to YES.

    image.png

$(SRCROOT)/MyProject/MyProject-Prefxi.pch

image.png

容易犯的错误:

image.png

注意是:MyProject-Prefix.pch
因为脚本中pch的名字有Prefix

image.png

每次混淆之后都会删除脚本,清理工程。可以直接修改脚本代码

image.png

ios-class-guard使用命令等

ios-class-guard 0.8 (64 bit)
Usage: ios-class-guard [options] <mach-o-file>where options are:-F <class>     specify class filter for symbols obfuscator (also protocol))-i <symbol>    ignore obfuscation of specific symbol)--arch <arch>  choose a specific architecture from a universal binary (ppc, ppc64, i386, x86_64, armv6, armv7, armv7s, arm64)--list-arches  list the arches in the file, then exit--sdk-ios      specify iOS SDK version (will look for /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS<version>.sdkor /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS<version>.sdk)--sdk-mac      specify Mac OS X version (will look for /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX<version>.sdkor /Developer/SDKs/MacOSX<version>.sdk)--sdk-root     specify the full SDK root path (or use --sdk-ios/--sdk-mac for a shortcut)-X <directory> base directory for XIB, storyboards (will be searched recursively)-P <path>      path to project.pbxproj of Pods project (located inside Pods.xcodeproj)-O <path>      path to file where obfuscated symbols are written-m <path>      path to symbol file map (default value symbols.json)-c <path>      path to symbolicated crash dump

还有一些单独对xib,storyboard,pods等单独操作进行混淆的。点击这里

脚本源码:有兴趣可以研究下脚本源码,这才是核心根源。

#!/bin/bashset -e# General build options
# WORKSPACE=YourWorkspace.xcworkspace
PROJECT=test.xcodeproj
SCHEME=test
CONFIGURATION=Release
SDK=11.3# Additional build options
XCODEBUILD_OPTS=""
CLASS_GUARD_OPTS="-i IgnoredSymbol -F !ExcludedClass"# In case of using Xcode >= 6 and SDK >= 8
CLASS_GUARD_OPTS_SDK="--sdk-root /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator$SDK.sdk"####################################################
# BUILD SCRIPT STARTS HERE
##################################################### Just in case
echo "WARNING: This will wipe all your not commited changes in your repository"
echo "Press Ctrl-C to Cancel or Enter to proceed."
readfunction echo_and_run() {echo "$@""$@"
}# Jump to directory where obfuscate script is located
pushd $(dirname $0)# Symbols file path
SYMBOLS_FILE="$PWD/symbols.h"# Clean current workspace
echo_and_run git reset --hard
echo_and_run git clean -fdx# Just in case: wipe build/
rm -rf build/# Automatically detect PODS
[[ -f Podfile ]] && [[ ! -f Pods/Manifest.lock ]] && pod install
[[ -f Pods/Pods.xcodeproj/project.pbxproj ]] && CLASS_GUARD_OPTS="$CLASS_GUARD_OPTS -P Pods/Pods.xcodeproj/project.pbxproj"# Build project to fetch symbols
[[ -n "$WORKSPACE" ]] && XCODEBUILD_OPTS="$XCODEBUILD_OPTS -workspace $WORKSPACE"
[[ -n "$PROJECT" ]] && XCODEBUILD_OPTS="$XCODEBUILD_OPTS -project $PROJECT"
[[ -n "$SCHEME" ]] && XCODEBUILD_OPTS="$XCODEBUILD_OPTS -scheme $SCHEME"
[[ -n "$CONFIGURATION" ]] && XCODEBUILD_OPTS="$XCODEBUILD_OPTS -configuration $CONFIGURATION"xcodeversion=`xcodebuild -version | grep -oE '^Xcode\s+\d+' | grep -oE '\d+'`
if ((xcodeversion > 5)) || ((SDK >= 8.0))
then[[ -n "$SDK" ]] && XCODEBUILD_OPTS="$XCODEBUILD_OPTS -sdk iphonesimulator$SDK"
else[[ -n "$SDK" ]] && XCODEBUILD_OPTS="$XCODEBUILD_OPTS -sdk iphoneos$SDK"[[ -n "$SDK" ]] && CLASS_GUARD_OPTS_SDK="--sdk-ios $SDK"
fiecho_and_run xcodebuild $XCODEBUILD_OPTS \clean build \-derivedDataPath buildOBJROOT=build/ \SYMROOT=build/# Insert SYMBOLS_FILE to all .pch found in project
echo_and_run find . -name '*-Prefix.pch' -exec sed -i .bak '1i\
'"#import \"$SYMBOLS_FILE\"
" "{}" \;# Obfuscate project
appsNumber=0;
while read app
doif ((appsNumber > 0))thenecho ""echo ""echo "You cannot use this tool when there is more than one .app file in products. Otherwise, only the first one will be used for obfuscation."echo ""echo ""exit 1fi((appsNumber+=1))TARGET=$(basename "$app" .app)echo "Obfuscating $TARGET in $app..."echo_and_run ios-class-guard \$CLASS_GUARD_OPTS_SDK \$CLASS_GUARD_OPTS \-O "$SYMBOLS_FILE" \"$app/$TARGET"
done < <(find build/ -name '*.app')echo ""
echo ""
echo "Congratulations! Obfuscation completed. You can now build, test and archive Your project using Xcode, Xctool or Xcodebuid..."
echo ""
echo ""

工具混淆

垃圾代码

用于应对苹果对重复应用的审核(Guideline 4.3 Design Spam),避免苹果机审检测概率。

主要功能

  1. 修改工程名
  2. 修改类名前缀
  3. 扫描工程中的代码,生成同等数量的 Category 文件,文件中及是同等方法数量的垃圾代码。
  4. 修改 xxx.xcassets 文件夹中的 png 资源文件名。
  5. 删除代码中的所有注释和空行。

使用步骤如下

1、下载源码。
2、用 Xcode 打开工程并配置参数。如图

image.png

3、运行
使用二进制文件,在终端中执行 GenerateSpamCode

  • spamCodeOut 生成垃圾代码
./GenerateSpamCode \
/Users/wangzelong/Desktop/TeamCode/cardloan \
-spamCodeOut /Users/wangzelong/Desktop/appLog AppLog

注明:appLog是一个文件夹,垃圾代码生成到的文件夹目录。 后面的AppLog是将要生成的垃圾代码分类参数等可以再测试代码中尝试。

  • deleteComments 删除工程目录下 .h .m .swift 文件中的注释和空行。
    ./GenerateSpamCode
    /Users/wangzelong/Desktop/appium
    -deleteComments

参数介绍

坑:
1、Podfile被修改后需要手动pod install
2、如果工程项目很大。则建议导入一部分工程代码去生成垃圾代码,因为项目中很多文件包括依赖的三方库等,可能是 .m 文件中实现的私有类,编译垃圾代码可能会报错,删除该垃圾代码 .h .m 文件及可。

此外提供一个压缩图片的轻量工具:

使用 ImageMagick 对 png 图片做轻量压缩,及不损失图片质量,又可改变图片文件 hash 值。方法:

  1. 安装 ImageMagick
    brew install imagemagick
  2. 压缩工程目录下所有 png 文件
    find . -iname "*.png" -exec echo {} \; -exec convert {} {} \;

作者:二斤寂寞
链接:https://www.jianshu.com/p/d9ad9decb120
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

iOS 代码混淆 垃圾代码相关推荐

  1. 【无标题】android 代码混淆 垃圾代码制造

    原文链接:https://blog.csdn.net/liutietuo/article/details/108824904 一 开启混淆 minifyEnabled true 设置为true 并在项 ...

  2. oc代码混淆_iOS 代码混淆

    一般做了防调试的话,被调试进程会退出的,是防动态分析措施. 代码混淆加花这些是防静态分析措施. 反调试是防动态分析措施. 混淆的方法 方法名混淆其实就是字符串替换,有2个方法可以,一个是#define ...

  3. oc代码混淆_OC代码混淆工具

    之前用python写了一个OC代码混淆脚本(python脚本),每次运行不方便,且其他人使用起来困难,就尝试写了一个mac工具. 工具地址:点我下载   密码:2405 现阶段工具还处于初级阶段,功能 ...

  4. android代码混淆aar_android代码混淆个人总结及踩坑

    前言 公司项目使用组件化开发的形式,需要对自己负责的模块进行一些混淆配置,关于混淆相信做android开发的都或多或少有过一些接触,通过对混淆文件的配置从而将代码中的类名,方法名,成员变量等进行无意义 ...

  5. Python代码部署的三种加密方案:代码混淆、代码编译、代码打包

    前言 最近需要源码部署一个项目,因此探索一下保护源码的方式,由简单到复杂主要总结为以下三大类: 代码混淆:主要是改变一些函数名.变量名 代码打包:思路是把Python代码打包成 .exe 的可执行文件 ...

  6. oc代码混淆_oc代码混淆

    #!/usr/bin/env python#coding=utf8 importosimportreimportrandom#规避文件夹 exclude_dirs = ["JBSDKOthe ...

  7. 【工具】iOS代码混淆工具-iOS源码混淆

    最新更新记录 V2.0.3(2022年12月11日)更新内容: 1.新增导入映射列表的逻辑: 2.优化修复其他混淆逻辑: 3.更新地址 - github 主要功能 ZFJObsLib是专业的iOS源码 ...

  8. 让逆向工程师们头疼的代码混淆,就像永远也走不出的“浪浪山”

    目录 代码混淆究竟是什么? 如何做代码混淆? 代码混淆不等于加密 App 加固非一时之功 "我想离开浪浪山." 在数次尝试破解某个App 时,某个逆向工程师无奈感慨道. 逆向工程师 ...

  9. 几维安全Javascript代码混淆(js加密)在线使用说明

    2019独角兽企业重金招聘Python工程师标准>>> 几维安全Javascript代码混淆是一项在线加密服务,用户只需将JS文件打包成zip包,提交到加密平台,即可完成代码混淆.字 ...

最新文章

  1. 话里话外:浅淡对流程管理的认识及流程管理对企业价值
  2. 类的赋值运算符的重载函数
  3. 从内存中加载并启动一个exe
  4. 超牛逼的异步协程爬虫
  5. Native Application 开发详解
  6. POJ 1953 (DP)
  7. vi/vim: 文件浏览和缓冲区浏览
  8. 警告: 程序集绑定日志记录被关闭。解决方法
  9. linux vim 删除 h,Linux VIM 的使用快捷键之删除, 复制, 粘贴
  10. Linux常用基础命令3
  11. php,javascript获取传递各参数的用法
  12. TortoiseSVN 汉化
  13. vue+elementui上传视频并回显
  14. 熬夜整理Java面试笔试题,你还看不懂吗?
  15. 正确认高分子PEG:识MTA mPEG,Myristic-acid PEG,肉豆蔻酸 PEG,PEG改性肉豆蔻酸
  16. 中国人民解放军郑州计算机学院官网,解放军信息工程大学录取分数线2021
  17. python怎样分析文献综述_教你如何做文献综述
  18. B站【1espresso】NLP - transform、bert、HMM、NER课件
  19. linux 文件添加标签,SELinux——有趣的标签
  20. jQuery :一个 JavaScript 库

热门文章

  1. 面对“寒冬”:谨慎,乐观
  2. 打造口袋版XP系统—— WIN PE系统U盘版
  3. c语言fmod函数6,C语言fmod()函数:对浮点数取模(求余)
  4. 小马哥---高仿苹果7P 主板A7136D系列刷机拆机主板图与开机识别多图
  5. windows10系统下phpstudy安装php8版本
  6. OSI七层模型各层 学习笔记
  7. web基础,用html元素制作web页面
  8. vue项目如何查看vue版本号
  9. vue项目H5页面在苹果手机点击输入框输入内容时 页面自动放大
  10. android 类似金山词霸 每日一句源代码 csdn,个人作业2——英语学习APP案例分析(示例代码)...