llvm学习(七):IR 的基础结构
手头的整个项目差不多完结了,一个月左右的时间,对 llvm 的 pass 理解感觉还行,稍微总结一下从易到难的知识点吧。
手头的整个项目差不多完结了,一个月左右的时间,对 llvm 的 pass 理解感觉还行,稍微总结一下从易到难的知识点吧。
最近开发参考了几个项目,仔细阅读源码的过程中,看到一些不大理解的地方。本来准备先写点基础知识的,看到hikari的作者在自己的 blog 里列举了其他人的 bug,作为后辈我也列举一下前人的 bug 好了。
本文包括一个ollvm的 bug,多个hikari的bug。(不代表 Armariris 没 bug,因为写的太挫了,没忍心看。。。)
2020年01月20日,又发现一个ollvm的 bug,然后发现hikari 作者在 2019.1.1已将其修复,点赞。
昨天搞交叉编译,中间其实有些没解决的问题都跳过了,最近有小伙伴联系我说加载不上的问题,符号各种找不到。刚好今天在做选型的工作,必须要面对这个问题了。
接触soot很久了,网上资料比较少,很多时候都是学术界在搞这个,工业界用它的人并不多,之前也有朋友想让我开这个系列,我觉得也有必要为后人留下一点有用的东西。开个系列吧,估计是个长期的栏目,试试水。
Soot提供的功能有很多,使用时候配置的东西也很多,一时半会是讲不完的,我用它主要是从安全人员的角度出发,从逆向的角度,去审计一些jar和apk,从而节省人力成本。
类似的工具,见过的不多,能数出来的、公开的产品可能是FindSecBugs、FlowDroid、360写的火线、据传阿里聚安全提供的apk扫描,主要思路都一样,反汇编,构造调用图,制定规则。因为各个轮子提供的API都各种各样,所以我用Soot只是一个巧合,可能是因为Flanker前辈最开始用的是soot,后来工作时接的FlowDroid也是soot,现在接的扫描器前人也是用soot写的。也就这么一直用下去了,也推荐后人使用它,至少我觉得这玩意还是很好用的。
目前我在维护自家的产品,要做代码审计,8102年了,肯定要自动化的。学习了很多比较成熟的厂商的案例,例如BAT、数字提供的在线扫apk的业务,通过表现猜测应该是较为完备的正则(我不知道啊,我乱猜的),也有美丽联合SRC公开的扫源码工具,自己构造AST,自己写规则,支持很多语言;其他的不大记得,反正看的挺多的。
扫源码和扫jar包,二者是类似的,但又不完全一样。如果抛开解析文件,只考虑功能的话,扫源码时,依赖的第三方jar的扫不到的,有时候gradle插件搞得东西也扫不到。而扫jar包的话,又会丢失注释的信息,丢失文件的信息。可以说二者各有利弊吧,我偏向是扫jar包,毕竟我是个逆向工程师,不喜欢看源码。
话不多说,看下简单的用法吧,背景的话看其他人的文章去吧。
首先,要我们要写一个待扫描的工程,我一般使用IntellijIdea,点击build,就会在看到了。
既然是8102年了,当然要用最好的构建工具gradle,我们创建一个gradle项目,引入soot的release包。
1 | maven { |
三、解析一个普通jar包
四、学习方法
emmmmm 搞了一天的移植和交叉编译,是真真的脑阔疼,本来想把这部分内容放在后面,但好不容易折腾出来,趁热写掉吧。不出意外的话,全网首发?突然感觉高大上了起来有木有!
上篇讲了单独编译一个 Pass,加载起来非常优雅,而ollvm等项目非常不优雅,为了方便开发,就把它们都移植了一下。工欲善其事必先利其器,突然发现这玩意支持 CLion,开发起来更加优雅了。
llvm系列文章,本文讲一下Pass的编译和加载。网上ollvm等作品都是整个llvm都丢到 git 里了,非常不优雅,所以本文讲一下如何编译、加载单独的 Pass。
最近在搞llvm,最终目的是做 Android 上 Native 的加固,感谢椒哥(小花椒)的帮助,开个系列记录和分享一下吧。
今天准备整理一下git仓库,准备下一期的开发,写一下中间新学到的几个技巧。
前段时间在搞应急,从一个啥都不会的小白学了一些XXE的简单poc构造和防御手段,网上攻击的poc很多,就不多说了,防御方法五花八门,而且有些防御根本就是无效的!!写篇文章分享一下,如何用Java彻底防御XXE。
最近一周都在搞这玩意了,写点文档给后人参考吧。
gradle 自身不提供打包 jar 的功能,后人各种自定义、乱写、以讹传讹,导致经常打包出来的 jar 都不能用,本文介绍三种方式,一种存在风险的方式,两种正确的方式。
上线时候,公司要求使用log4j2,而soot 用的是 slf4j-simple,这个老项目大改起来也不好改,所以比较坑,本文记述一下这个迁移过程。
三个小技巧,工作中遇到了好几次,记录一下,方便后人和自己查看。
最近写 project,但线上发布需要使用 gradle,开发的时候并没有思考这件事,所以就埋了一个巨大的坑,本文描述一下这个恶心的过程,浪费了我一整天的时间。
gradle 有些依赖要翻墙,有些依赖不要翻墙,不知道为啥,设置好代理后怎么都删不掉了,intellij 里试了几遍,记录一下如何删除gradle代理。
关键字:gradle proxy clear delete
真是坑死我了,死活删不掉,看下文吧。