Llvm “防”反向 pass

你们都懂LLVM

1 个赞

大致看了下。Function重命名需要判断是否为declaration,我似乎没看到这部分代码。
参见我的博客 http://mayuyu.io/2017/06/02/LLVMHacking-0x1/

不懂,看起来是分享,我给换了下类别。
先赞,后看。

你需要实现的常量文本加密的话我这边用的做法是把原来的GV CDA替换成加密的然后在所有的Instrution类User那里插入allocainst后解密

当然我不清楚GCC那边啥样所以不过是我个人意见而已

Hi Akko,

搜索到大大的7天精通llvm代码混淆系列 orz

  1. 我对OC不熟悉,还得向大大们学习 :slight_smile: 我的主要方向是静态分析,例如检查memset调用时的空引用解析 LLVM后端,例如AVR芯片
  2. 我对”CFG的混淆“持观望态度:应该有benchmark对比CFG混淆后影响ELF尺寸、性能等问题。

期待大大们的反馈,谢谢!

Regards,
Leslie Zhai - a LLVM developer

拜读~

GCC v4.6之后(可能更早一点的版本)支持插件了 :slight_smile: LLVM PASS还得放在llvm/lib/Transforms/下,可能我不够深入,DragonEgg就是一个GCC插件,目前完成了GCC Frontend → GIMPLE → LLVM IR的”翻译“ LLVM Weekly - #190, Aug 21st 2017

你说的都没错。但目前混淆的目的就是为了拿体积和性能换攻击者的开销

我不大看得懂,我认识的好多人也看不懂LLVM相关的东西。楼主作为一个LLVM developer,能否用相对直白的语言,发一系列帖子,来介绍一下LLVM和相关的一些概念,如LLVM在开发中的应用等,作一个科普教育呢?
我想对我等LLVM小白来说,应该是非常受用的。
Anyway,谢谢楼主的分享!

我在看你的博客 :slight_smile: http://mayuyu.io/2017/06/02/LLVMHacking-0x1/ 中的代码貌似没有体现判断declaration?可能我看漏了,请大大提示一下,谢谢!

就是F.empty()
IR的函数分为declaration和definition
前者代表实现在当前TU外部由IR的Linker或者目标文件的Native Linker查找。这种函数你重命名了找不到当然就会崩

http://frozengene.github.io/

1 个赞

Kaleidoscope过一遍就差不多知道了

多谢提示!我的测试用例考虑得不够充分。。。

然后控制流平坦化这里好像LLVM自带一个Pass了?在Transforms/Utils里面

感谢 https://github.com/llvm-mirror/llvm/blob/master/lib/Transforms/Utils/FlattenCFG.cpp

哈哈 :slight_smile: 我follow了你的github

Kaleidoscope 就是这个卜 LLVM Tutorial: Table of Contents — LLVM 13 documentation

yEP

然后ir层玩完了也可以搞Platform-Specific的MachineFunctionPass

EDIT: 我已经移除了你论坛账户的新用户限制