Giter VIP home page Giter VIP logo

codeobscure's Introduction

Codeobscure

Introduce

该项目主要用于OC混淆代码,如果您的项目有安全需求。想避免class-dump来解读您的代码,你不妨使用该项目。该工具基本全自动运行,设置得当基本不需要额外的对工程进行操作。如果有问题欢迎反馈,我会及时修复!

该工具经过随机开源项目的测试,测试项目如下,具有非常好的通用性,并且一步完成混淆工作。

演示(项目:iOS-2048)

ScreenShot Gif

class_dump 效果(项目:iOS-2048)

效果

Installation

运行如下命令:

$ gem install codeobscure

Usage

使用实例

使用过程中请使用绝对路径

-l可以接多路径,用逗号分割,如下:

实例1:混淆方法、类名、属性, 过滤Pods和Download Example :

codeobscure -o /Users/mac/Downloads/Examples/Messenger.xcodeproj  -l /Users/mac/Downloads/Examples/Pods,/Users/mac/Downloads/Examples/Download

实例2:仅仅混淆方法和类名

codeobscure -o /Users/mac/Downloads/Examples/Messenger.xcodeproj -f f,c

实例3:生成ignoresymbols文件,用于写入要过滤的关键字

codeobscure -i XcodeprojPath	

实例4: 重置-l记录的要过滤的关键字

codeobscure -r 

实例5:严格模式过滤,并且用单词模式进行替换。(如果代码中含有很多的KVO以及Runtime代码,使用严格模式,会更好的帮助你。)

codeobscure -o /Users/mac/Downloads/Examples/Messenger.xcodeproj -t w -s

注意: 由于苹果新版系统有SIP(系统完整性保护)默认是开启的,所以由于安装方式不同,可能在运行命令的时候出现:attempt to write a readonly database (SQLite3::ReadOnlyException)的问题。如果出现这个问题,请在命令行上加上sudo

codeobscure -h 命令帮助

使用工具是时候,路径直接用绝对路径,不支持相对路径。(直接把文件拖到终端显示出来的路径就是绝对路径)

Usage: obscure code for object-c project
-o, --obscure XcodeprojPath      obscure code
-l, --load path1,path2,path3     load filt symbols from path
-r, --reset                      reset loaded symbols
-f, --fetch type1,type2,type3    fetch and replace type,default type is [c,p,f].c for class,p for property,f for function
-i, --ignore XcodeprojPath       create a ignore file, you can write your filt symbols in it.eg:name,age ...
-t, --type replaceType           obscure type = [r,w,c] ,r: random w: random words c: custom replace rule
  • -o [Xcodeproj后缀的项目文件].
  • -l [路径] 加载要过滤文件的路劲. 如果你不想混淆某些文件,用这个参数。
  • -r 重置已加载的过滤的字符,-l的过滤文件字符会保存起来,如果你下一次不需要过滤这些文件,请用该命令重置一下.
  • -f, --fetch type1,type2,type3 获取需要混淆的类型,默认参数是c,p,f。也就是类名,属性和方法。c代表类名,p代表属性,f代表方法。
  • -t r、w、c 替换的文本形式 r:随机字符串 w:单词 c:自定义。自定义模式暂未实现。
  • -s 严格模式, 适用于KVO和Runtime比较多的代码。普通代码也可以使用。

版本说明

  • v0.1.2添加-i选项,执行这个选项会创建一个ignoresymbols文件,在这个文件中填写你要忽略的方法、属性或类名(英文逗号分割)。它仅仅作用于你的这个项目,和-l不一样,它不会被记录下来。假设你在-l过滤某些名称后,项目中仍然有某些名称冲突了,这个选项更方便你使用它,把冲突名称写入ignoresymbols,然后运行-o重新生成混淆文件。

  • v0.1.3 优化-l-o的性能,提高运行速度

  • v0.1.4 放宽ignoresymbols的格式限制,字段之间以逗号分割即可,你可以为了可读性在字段之间添加空格换行等空白字符。例如

      v0.1.4之前必须如下,否则会过滤识别有问题:
      		name,age,sex,nick
      v0.1.4版本:
      		name, age ,sex,  nick 
      	   以及:
      	   name,
      	   age,
      	   sex,
      	   nick
      	   
      这些方式都是可以的
    
  • v0.1.5 添加NSClassFromString以及setValue:forKeyPath:等字段过滤,进一步优化运行出现不识别方法崩溃的情况。添加替换方式[-t],包括:随机字符 , 随机单词,自定义替换(目前自定义替换暂未实现,将在0.1.6中实现)

      生成结果示例:	
      r :#define getHeight ZbgTCtOTDmEazebk
      w :#define getHeight nodulatedBasutoland
      c :等待实现
    

注意:由于苹果反馈了如下的被拒信息,因为目前可以用w选项,之后会提供更有意义的单词的替换选项[c]: 被拒信息

  • v0.1.6.3 添加了对storyboard的过滤,避免ViewController类被混淆了引起崩溃的问题。注意:如果是xib请自行过滤,在后面版本会添加xib的过滤。
  • v0.1.6.5 添加了对xib的过滤,避免ViewController类被混淆了引起崩溃的问题。添加对png等图片资源进行混淆功能。默认开启。
  • v0.1.7.0 添加了严格模式。适用于KVO和Runtime较多的代码,普通代码也可以使用。
  • v0.1.7.1 避免过度混淆。保留Cell, ViewController等常用关键字。
  • v0.1.7.5 添加#ifndef #endif 避免和已有宏定义冲突。
  • v0.1.7.7 修复路径带空格问题

使用及原理说明

codeobscure主要用于oc(目前来说由于swift的特性摆在那里,这种方式不适用于swift)的项目,利用iOS安全攻防(二十三):Objective-C代码混淆的方式去进行代码混淆,纯粹的娱乐自己恶心他人。

此工具会默认遍历项目属性,方法和类名进行混淆。当然如果简单的进行遍历的话,会产生无穷无尽的错误,因为你不可能混淆苹果提供给你的官方API,也不能混淆framework和.a的静态编译的库。所以在混淆代码的时候必须排除掉它们。我已经帮你过滤了系统的方法。如果你的项目中使用Pod或者使用了静态库,或者其他比较特别的第三方库,请使用codeobscure -l [路径1,路径2..]的方式去过滤这些库文件。运行codeobscure -o [项目名.xcodepro]去调用混淆你的代码,然后耐心等待一会就可以了。

当然并不意味这你运行了就一定没错误,该工具最大的简化了混淆代码的工作,由于不同的人编写的代码可能各不相同。假设你调用了NSClassFromString("classNameA")而这个类正好被混淆了,它不识别classNameA到底是什么。那么怎么解决这个错误呢。最简单的方式就是在codeObfuscation.h中查询classNameA并删除它的#define即可。 目前最新版针对NSClassFromString 等常规操作已经自动处理了。

在0.1.3中,需要过滤的字段,你不要简单的删掉它,而是使用ignoresymbols

  • 先运行codeobscure -i XcodeprojPath去生成ignoresymbols
  • 然后把需要进一步过滤的某些名字直接添加进入,用英文逗号分隔开来。

例如上面你要删除的,如果你仅仅是删除了,下次要执行codeobscure -o重新生成的时候会又重新生成,你要再次把它从codeObfuscation.h中查询出来并删除。 v0.1.3中你仅仅添加到ignoresymbols就可以很方便的解决这一问题。下次codeobscure -o生成的时候回自动过滤到这些字段。

我测试的项目是有打几年历史的一个项目,代码也挺多的。合理的过滤掉某些不应该混淆的方法。提示错误的仅仅只有一个地方,然后就是运行的时候有几处崩溃,都是因为方法被混淆了,不识别方法导致的,仅仅删除它就可以了。运行完成后,除了解决错误,你不需要进行额外的文件添加删除操作,我已帮你添加好了。你觉得代码混淆不好用,那么直接删除codeObfuscation.h就行了。此致,敬礼!

注意:如果你运行了codeobscure -l [路径1,路径2..],那么它会记录下来要过滤的东西。如果你下次不想过滤已经过滤的库,运行codeobscure -r来重置。

如果有什么不好用的地方,直接写到issue,我会尽量让它更好用。

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/kaich/codeobscure. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

The gem is available as open source under the terms of the MIT License.

codeobscure's People

Contributors

kaich avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

codeobscure's Issues

请教,系统升级到10.13.4 (17E199)后报错

/Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.5.3/lib/codeobscure.rb:80:in block in obscure': undefined local variable or method path' for Codeobscure:Module (NameError) from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.5.3/lib/codeobscure.rb:75:in each'
from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.5.3/lib/codeobscure.rb:75:in obscure' from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.5.3/bin/codeobscure:3:in <top (required)>'
from /usr/local/bin/codeobscure:22:in load' from /usr/local/bin/codeobscure:22:in

'`

需要安装环境嘛

line 2: require: command not found
line 4: Codeobscure.obscure: command not found

小问题

使用时如果主目录为中文,则无法使用

按文档操作之后,生成的codeObfuscation文件为空,并且在系统根目录下生成,不在当前工程目录下

➜ ToThePenny-master git:(master) ✗ gem install codeobscure
Successfully installed codeobscure-0.1.6.5
Parsing documentation for codeobscure-0.1.6.5
Done installing documentation for codeobscure after 0 seconds
1 gem installed
➜ ToThePenny-master git:(master) ✗ sudo codeobscure -o Depoza.xcodeproj ./
处理图片资源中...
/Users/Blavtes/.rvm/rubies/ruby-2.4.0/lib/ruby/gems/2.4.0/gems/codeobscure-0.1.6.5/lib/codeobscure/imagemix.rb:8: warning: Insecure world writable dir /usr/local/bin in PATH, mode 040777
find: illegal option -- n
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
find: illegal option -- n
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
find: illegal option -- n
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
find: illegal option -- n
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
find: illegal option -- n
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
find: illegal option -- n
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
find: illegal option -- n
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
Depoza.xcodeproj:Debug配置文件已配置完成
Depoza.xcodeproj:Release配置文件已配置完成
Depoza.xcodeproj:Debug配置文件已配置完成
Depoza.xcodeproj:Release配置文件已配置完成
Depoza.xcodeproj:Debug配置文件已配置完成
Depoza.xcodeproj:Release配置文件已配置完成
配置完成!
请直接运行项目,如果项目中出现类似: +[LoremIpsum PyTJvHwWNmeaaVzp:]: unrecognized selector sent to class。在codeObfuscation.h中查询PyTJvHwWNmeaaVzp并删除它!
➜ ToThePenny-master git:(master) ✗ ls
Depoza Depoza.xcodeproj DepozaTests Podfile Pods Screenshots
Depoza Extension Depoza.xcworkspace LICENSE Podfile.lock README.md
➜ ToThePenny-master git:(master) ✗
➜ ToThePenny-master git:(master) ✗

=============
以上操作是否有误?

使用 -l pod路径 没能过滤掉pod的第三方库的方法名

使用 -r 报错
shixiaodadeMac-mini:Shenma_3.6.0 shixiaoda$ codeobscure -r
/Library/Ruby/Gems/2.0.0/gems/codeobscure-0.1.5.1/lib/codeobscure.rb:54:in obscure': undefined local variable or method root_dir' for Codeobscure:Module (NameError)
from /Library/Ruby/Gems/2.0.0/gems/codeobscure-0.1.5.1/bin/codeobscure:3:in <top (required)>' from /usr/local/bin/codeobscure:22:in load'
from /usr/local/bin/codeobscure:22:in `

'
shixiaodadeMac-mini:Shenma_3.6.0 shixiaoda$

项目被锁了

“xxx" is locked for editing and you may not be able to save your changes. Do you want to unlock it?
点unlock无法解决 会一直弹出

通过class-dump查看没有效果

我是根据教程来的,codeObfuscation.h也生成了。但是archive里的.app导出后的.h没有效果,求问是什么原因?
image
image

最后一步失败

你好,我按照wiki要求来操作,所有都成功了,最后运行项目时也成功了,但并没有被混淆,点击某个方法或者类名可以跳转到codeObfuscation.h,但就是混淆失败.还请多多指教

codeobscure -o 没反应

Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.7.5/lib/codeobscure/funclist.rb:194:in `read': No such file or directory @ rb_sysopen - //Users/iosdevop/Downloads/ToThePenny-master/Pods/Headers/Public/KVNProgress/UIImage+KVNEmpty.h (Errno::ENOENT),产生这些错误为什么我跑了codescure这些命令,没反应的,演示也没反应的,就生成了一个func.list的空文件

非常感谢!

测试了几次 终于磨合了这个软件 很强大 非常感谢作者。
不知道对于C++ 的文件有没有作用

麻烦帮我看下这是什么错误啊

/Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.7.5/lib/codeobscure/funclist.rb:3:in require_relative': cannot load such file -- /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.7.5/lib/codeobscure/filtSymbols.rb (LoadError) from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.7.5/lib/codeobscure/funclist.rb:3:in module:FuncList'
from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.7.5/lib/codeobscure/funclist.rb:1:in <top (required)>' from /Library/Ruby/Site/2.3.0/rubygems/core_ext/kernel_require.rb:59:in require'
from /Library/Ruby/Site/2.3.0/rubygems/core_ext/kernel_require.rb:59:in require' from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.7.5/lib/codeobscure.rb:2:in <top (required)>'
from /Library/Ruby/Site/2.3.0/rubygems/core_ext/kernel_require.rb:59:in require' from /Library/Ruby/Site/2.3.0/rubygems/core_ext/kernel_require.rb:59:in require'
from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.7.5/bin/codeobscure:2:in <top (required)>' from /usr/bin/codeobscure:23:in load'
from /usr/bin/codeobscure:23:in `

'

执行codeobscure命令过程中,最后打印如下信息就结束了,没有生成混淆文件,请问怎么处理?

/Library/Ruby/Gems/2.3.0/gems/random-word-2.1.1/lib/random_word.rb:61:in `excluded?': undefined method `length' for nil:NilClass (NoMethodError)
	from /Library/Ruby/Gems/2.3.0/gems/random-word-2.1.1/lib/random_word.rb:23:in `block in each_randomly'
	from /Library/Ruby/Gems/2.3.0/gems/random-word-2.1.1/lib/random_word.rb:19:in `loop'
	from /Library/Ruby/Gems/2.3.0/gems/random-word-2.1.1/lib/random_word.rb:19:in `each_randomly'
	from /usr/bin/codeobscure:1:in `each'

备注:
1、如上错误,是使用随机单词混淆(-t w)执行命令codeobscure出现的,而使用随机字符混淆没问题。(像是random_word的问题)
2、自己写的简单Demo,用随机单词和随机字符都没问题。但是在已上线比较大的项目里使用随机单词混淆会出现如上问题。

本机环境:
RUBYGEMS VERSION: 2.7.7
RUBY VERSION: 2.3.7 (2018-03-28 patchlevel 456) [universal.x86_64-darwin18]
INSTALLATION DIRECTORY: /Library/Ruby/Gems/2.3.0

object c. unity

unity5.3 生成的xcode 工程,oc 代码进行混淆,有问题,麻烦看一下

使用混淆替换命令提示undefined local variable or method

使用的命令是codeobscure -o temp02/temp01.xcodeproj -f f,w,
工程中代码很简单,两个ViewController类
/Library/Ruby/Gems/2.6.0/gems/codeobscure-0.1.8.0/lib/codeobscure.rb:138:in obscure': undefined local variable or method path' for Codeobscure:Module

是不是哪个参数或者配置不对,谢谢

执行codeobscure -o xcode工程路径 命令 就中断了

System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/gems/2.3.0/gems/sqlite3-1.3.11/lib/sqlite3/statement.rb:108:in step': attempt to write a readonly database (SQLite3::ReadOnlyException) from /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/gems/2.3.0/gems/sqlite3-1.3.11/lib/sqlite3/statement.rb:108:in block in each'
from /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/gems/2.3.0/gems/sqlite3-1.3.11/lib/sqlite3/statement.rb:107:in loop' from /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/gems/2.3.0/gems/sqlite3-1.3.11/lib/sqlite3/statement.rb:107:in each'
from /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/gems/2.3.0/gems/sqlite3-1.3.11/lib/sqlite3/database.rb:158:in to_a' from /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/gems/2.3.0/gems/sqlite3-1.3.11/lib/sqlite3/database.rb:158:in block in execute'
from /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/gems/2.3.0/gems/sqlite3-1.3.11/lib/sqlite3/database.rb:95:in prepare' from /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/gems/2.3.0/gems/sqlite3-1.3.11/lib/sqlite3/database.rb:134:in execute'
from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.6.5/lib/codeobscure/filtsymbols.rb:25:in insertValue' from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.6.5/lib/codeobscure/funclist.rb:45:in block (2 levels) in capture'
from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.6.5/lib/codeobscure/funclist.rb:44:in each' from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.6.5/lib/codeobscure/funclist.rb:44:in block in capture'
from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.6.5/lib/codeobscure/funclist.rb:39:in scan' from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.6.5/lib/codeobscure/funclist.rb:39:in capture'
from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.6.5/lib/codeobscure/funclist.rb:194:in block in genFuncList' from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.6.5/lib/codeobscure/funclist.rb:192:in each'
from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.6.5/lib/codeobscure/funclist.rb:192:in genFuncList' from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.6.5/lib/codeobscure.rb:97:in obscure'
from /Library/Ruby/Gems/2.3.0/gems/codeobscure-0.1.6.5/bin/codeobscure:4:in <top (required)>' from /usr/local/bin/codeobscure:22:in load'
from /usr/local/bin/codeobscure:22:in `

'

属性正则匹配有问题

在碰到如下属性时,NSUInteger会被解析出来,而maximumTextLength不解析。
@Property(nonatomic, assign) IBInspectable NSUInteger maximumTextLength;

动态属性混淆错误

在碰到以下这种时,是可以用.语法来进行正常的属性操作的,但是混淆了会不匹配,报错。

  • (CGFloat)lastKeyboardHeight
  • (void)setLastKeyboardHeight:(CGFloat)argv

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.