博文

目前显示的是 2017的博文

LLVM相关技术文章收集

Chris Lattner的LLVM教程中文版: https://llvm-tutorial-cn.readthedocs.io/en/latest/chapter-1.html IBM - 使用 LLVM 框架创建一个工作编译器: https://www.ibm.com/developerworks/cn/opensource/os-createcompilerllvm1/index.html https://www.ibm.com/developerworks/cn/opensource/os-createcompilerllvm2/index.html

LLVM的类型系统(转

LLVM中的类型系统很重要!有类型,可以使得很多优化成为可能,而且不需要额外的分析。一个强类型系统可使生成的代码更容易理解,并且更容易优化和转换。 1.类型的类别 llvm有以下几种类型: integer   i1, i2, i3, ... i8, ... i16, ... i32, ... i64, ... floating point   float, double, x86_fp80, fp128, ppc_fp128 first class   integer ,  floating point ,  pointer ,  vector ,  structure ,  array ,  label ,  metadata . primitive   label ,  void ,  floating point ,  x86mmx ,  metadata . derived   array ,  function ,  pointer ,  structure ,  packed structure ,  vector ,  opaque . (第一类)first class是最重要的。指令只能产生这些类型的值。 2.原始类型(primitive types) 原始类型是llvm系统中的基础。 integer类型 整数类型是一个位宽度从1到2^23-1的整数。 语法: iN 其中N为位宽。 例子: i1 i32 i1942652 Floating Point类型 float   32-bit floating point value double   64-bit floating point value fp128   128-bit floating point value (112-bit mantissa) x86_fp80   80-bit floating point value (X8...

objc->cpp的对应关系。

通过clang可以方便地把objc的语法转成cpp: clang -rewrite-objc xxx.m 所以可以很方便的看到objc与cpp之间的对应关系。 最近主要工作在符号混淆上,但是踩到了有关selector和runtime的混淆的坑。 NSClassFromString: id obj = [[NSClassFromString(@"MyClass") alloc] init]; id obj = ((id (*)(id, SEL))(void *)objc_msgSend)((id)((id (*)(id, SEL))(void *)objc_msgSend)((id)NSClassFromString((NSString *)&__NSConstantStringImpl__var_folders_92_dfj9jsb51kj3lh2zssbw0dzm0000gn_T_1_38e0f0_mi_0), sel_registerName("alloc")), sel_registerName("init")); NSStringFromClass: NSString *obj = NSStringFromClass([MyClass class]); NSString *obj = NSStringFromClass(((Class (*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("MyClass"), sel_registerName("class"))); Selector: SEL sel = @selector(mySelector); SEL sel = sel_registerName("mySelector");

LLVM-Symbol Obfuscation的采坑之旅 依然踩坑中...

1.要判断数据类型,如果GlobalVariable的getInitializer()为空和dyn_cast转为ConstantDataArray的getInitializer()不是isCString(),都要跳过,不能进行混淆。 2.改名前后的长度要一致。

Cross-compile the LLVM + clang

1.Checkout llvm/clang/compiler-rt(optional) 2.Organize the directory like: llvm/ /tools/ clang /projects/ compiler-rt 3.Run the script below in Terminal. $ mkdir build $ cd build $ cmake -DCMAKE_BUILD_TYPE:String=Release ../obfuscator/ $ make -j5 //5 is the compiler threads, make it bigger to compile faster.

LLVM的LTOPass插件编写

由于LLVM出色的结构,所以我们可以很方便的在LLVM中添加我们自己想要的功能,比如代码结构优化、代码混淆、代码膨胀、控制流混淆等。 参考文档: LLVM.org - WritingAnLLVMPass LLVM.org - LinkTimeOptimization 我们要做的就是编写我们自己的LTOPass模块,然后将其注册进LLVM的代码中然后进行编译。 注册方法: 编写我们自己的Pass模块 修改llvm/Transforms/IPO/PassManagerBuild.cpp 然后把自己的Pass放进 populateLTOPassManager 中 把模块放进 llvm/Transforms/IPO/LLVMBuild.txt 中 编译!

iOS 安全笔记 - App加固方法

iOS Class-Guard -> Symbols Obfuscator Obfuscator-LLVM -> Code Obfuscate Custom LLVM IR 基于libLTO的修改方案(混淆符号) http://llvm.org/docs/LinkTimeOptimization.html

WKWebview与原生的JS交互(js调用原生)

如果在js端直接使用window.webkit.messageHandlers.postMessage方法进行交互,可以是可以,不过如果js需要和安卓进行js交互的话,就需要写两套方案了。 所以,要实现js“优雅”地调用原生,需要实现3个部分: 1.js的注入脚本准备, 2.WKUserContentController的配置, 3.WKWebview的配置。 1.准备js的注入脚本。 我们要声明一个js对象,然后将交互所需的方法放到这个对象里面。 js脚本文件内容如下(实现了setTitle方法): var jsObject = {}; //声明js交互对象 jsObject.bridge = function(name) { //js交互桥接方法   var args = new Array(arguments.length - 1);   for (var i = 0; i < args.length; i++) {     args[i] = arguments[i + 1];   }   window.webkit.messageHandlers[name].postMessage(args); }; jsObject.setTitle = function(title){ //js实际中需要调用的方法         jsObject.bridge("setTitle",title);     }; 2.配置WKUserContentController: 新建一个WKUwerContentController的子类,然后在里面实现载入UserScript的方法。 -(void)loadScript {     NSString *jsPath = [[NSBundle bundleForClass:self.class] pathForResource:@"bridge" ofType:@"js"]; if (jsPath != nil) { NSString *jsContent = [NSString stri...

有关设置NavigationbarItem.titleView的一个坑

今天遇到一个bug, 仅仅是设置了titleView,然后发现push出去再pop回来,内存和CPU占用暴涨,界面锁死。 然后去查了内存泄露发现没有任何问题。 后来去跑了Time Profile发现NavigationBar一直在做LayoutSubviews 后来才发现titleView里重写了layoutSubviews方法。 用autolayout实现了相关布局,就解决了问题。