勾引 英文 [原创]LLVM字符串加密学习条记-软件逆向-看雪-安全社区|安全招聘|kanxue.com
之前看chenx6大佬的博客学习了一下编写基础的LLVM Pass,然而阿谁有很较着的问题是,作家为了处理Function里面重叠援用的屡次解密的问题,特判了援用次数,要是存在多处对global string的援用是无法进行污染的。然而实质的编程中很难不会援用多处字符串,是以阿谁只可污染简便代码。我背面凭据探讨区的说法对此优化了一下,改成Function的EntryBasicBlock处解密勾引 英文,然而过不了llvm-dis,嗅觉是在alloc栈变量的期间出了问题,暂时不知谈若何责罚,背面要是有才气的话再再行写一遍吧。
之后学习了一下pluto-obfuscator名目,里面有一份GlobalEncryption.cpp,借此契机学习一下,趁便写一份New PassManager版块的。
pluto-obfuscator的全局变量加密对全局整数和数组变量进行了处理,选择的步地是编译期加密,运行期解密,便是在IR阶段对全局变量加密,然后对每个全局变量调用解密函数并添加到.ctors中,让时局在运行期进行全局构造的期间解密。
看雪有一个帖子转头几种加密步地转头得相比好,搬运一下
最初取得Module的LLVMContext,取得通盘的全局变量,添加到GVs中
然后筛选出需要加密的全局变量,ObfuTimes是污染次数,默许为1
然后鉴别处理数组和整数类型的全局变量,在这里径直进行加密,然后调用insertArrayDecryption和insertIntDecryption将解密函数添加到全局构造函数表中
因为在解密的步地上其实很像勾引 英文,这里只纪录相比复杂的数组解密,这里用IRBuilder构造了一个for轮回来已矣解密,整数全局变量独一和密钥异或就行了,旨趣是相似的
最初构造一个函数,复返值是void
然后构造四个BasicBlock,用于已矣for轮回的几个阶段
丝袜玉足最初取得func的EntryBasicBlock,然后开动化轮回变量
forCond已矣i < length的部分,要是i < length配置则跳转到轮回体,要是不配置则跳出轮回
轮回体内便是解密的经过了,其实便是和密钥的每一位进行异或,终末跳转到i++
forInc已矣的便是i++了,这里相比简便,终末跳转到forCond进行条款判断,这么就已矣了轮回
forEnd便是复返ret,终末再将函数写入.ctors中,已矣运行期全局构造
以下是我改写成New PassManager的GlobalsEncryption.cpp,加密部分没作念修改,通盘代码在libObfuscator/tree/pluto-enc
写个代码测试一下
污染前后的IR对比
固然这对动调来说是没啥用的
对静态分析来说,这个强度的加密还是有点弱,加密函数很容易就会被看出来,还不错加点另外的平坦化之类的污染,对分析加密函数也栽培难度
[培训]内核驱动高等班勾引 英文,冲击BAT一流互联网大厂责任,每周日13:00-18:00直播讲课