vvvv88.com [原创]某短视频假造机分析和回话-Android安全-看雪-安全社区|安全招聘|kanxue.com
发布日期:2024-12-14 04:56 点击次数:195
在windows流行的技术,假造机保护是多东说念主不敢碰的东西咫尺照旧亦然如斯vvvv88.com,pc的性能比转移端性能要卓著不少,假造化和变异的代码多到令东说念主发指,因此在加密保护强度上要比转移端要强许多许多,为了转移端App更好的体验(ANR率)转移端加密强度短时天职不会达到pc上的强度,跟着转移cpu性能越来越好校服加密强度会逐年加强。
早年酷爱酷爱使然分析洽商过windows端VMProtect、Safengine Shielden、Themida、VProtect、Enigma Protector等等假造机,最近发现国内流行的短视频也有假造机加密同期也相比感酷爱酷爱,便着手了我的分析之旅。
分析任何假造机必须要扣汇编教唆级细节。
安卓出身这样多年了于今莫得像windows端olldbg、x64dbg那样友好的调试器,IDA PRO固然自带了安卓调试器老是莫得相像中的自若。lldb看成转移端iOS和android开拓的御用调试器,带源码调试在开拓环境中还算相比友好,而汇编级调试只可输入号召行了,这是许多用惯了gui调试器的东说念主接纳不了的,然则个东说念主发现lldb调试自若性独特的好,功能上比IDA Pro的安卓调试器苍劲太多了。
libEncryptor.so一共包含了三套假造机,三套假造机各自孤苦况且代码一模一样,本文重心只分析vm2假造机。假造机教唆编解码参考鉴戒了arm64的一部分限定,并达成了我方的一套限定,在后头的解码分析中会有许多和arm64解码相似的场所。另外假造机并莫得像VMProtect那样将一条教唆分割成多条"微教唆"的形貌,此假造机莫得把现时真实的险阻文放到假造机险阻文去模拟扩充,而是运行了一套我地契独的险阻文。
在函数中调用假造机时会传入一个指针数组类型参数变量,这是传入到假造机进口的惟一参数。
c伪代码来示意函数调用假造机进口
反汇编版块:
IDA Pro稽查进口的cfg图,复杂要道看似很难其实少许齐不毛糙,话说追想cfg看起来和ollvm的混浊平坦化相称相似,其实和ollvm混浊关联不大,只不外一部分的switch被拉平了,在了解调治逻辑后分析也不算复杂。在代码中照旧能看到两个ollvm swtich var变量,其作用莫得贯注分析,但所有这个词cfg图笃定与ollvm关联不是很大,忖度开启ollvm后性能会大幅下落影响app启动速率了。在参加假造机运行时前,在进口需要准备假造机所需的内存和参数。对假造机内存布局情况必须了解如指掌,这样在动态和静态分析时才不会迷失标的。
vm2_run只是只分派了保存被调用者寄存器的堆栈内存空间,并莫得分派适意的堆栈内存,在假造机真实着手之前会将传递进来的5个参数即0x-x4对假造机中的假造寄存器和真实专用寄存器进行开动化。vm_run还开动化了解码opcode的switch表,在开动化时发现一共开动化了6张switch表,天然在handler中还存在其他switch表,这样多表是若何来的?忖度编写时唯独1-2张表,在编译器优化后表就被分割成多块了。
假造寄存器开动化vm2_run开动化时会将传递的5个参数赋值给假造寄存器,其中包括PC和SP的值。
真实专用寄存器假造机运行时使用了真实假造器vvvv88.com,其中包括临时寄存器和专用寄存器,临时寄存器保存多种类型的值,而专用寄存器在假造机从着手到退出只保存一种指定类型数据或恒定不变。opcode位域伪代码:w12保存了4位32字节的opcode,在opcode初度解码时,日本鬼父第三季位域中的变量会放到真实寄存器。位域伪代码示例:w12[26]: 取第26位到放到入方针的26位w12[26->0]: 取第26位并放入到方针的指定位 w12[27-26->1-0]: 取27位和26位放入到方针第1位和第0位|: 按位或
假造机context假造机中也有专用寄存器,在调用外部函数时,其中x4假造机中保存外部函数地址,x5假造机中保存参数指针,x25假造机中调用外部函数时的跳板地址。另外假造寄存器和aarch64中的寄存器并不是逐一双应的,在这里只是对每个假造寄存器启了一个相应的名字浮浅厚实和记挂。
pOpcode取出4个字节的opcode并获得低5位解码出op1。
在opcode初度解码时会解码4个寄存器操作数,从中索求4个位域的字段,划分保存到真实专用寄存器w8、w9、w10、w11,在arm64教唆有计划当教唆是MADD、MSUB、UMADDL、UMSUBL、SMADDL、SMADDL等会有4个寄存器操作数的情况,在这里相似亦然如斯。初度解码时位域布局:w12[31,30-26,25-21,20-16,15-12,11-6,5-0]w12[5-0:6] = op1w12[11-6:6] = op2w12[15-12:4]|[31:1] = Xm/Wmw12[20-16:5] = Xt/Wtw12[25-21:5] = Xn/Wnw12[30-26:5] =Xa/Waw8: Rd(Xt/Wt)方针寄存器操作数,w12[20-16->5-0],取出16-20位保存最低位,5位不错示意0-31个寄存器。w9: Rn(Xn/Wn)(第一个源寄存器操作数,w12[25-21->5-0],取出21-25位保存最低位,5位不错示意0-31个寄存器。w10: Rm(Xm/Wm)第二个源寄存器操作数,w12[15->4] | w12[14->3] | w12[13->2] | w12[12->1] | w12[31->0],5位不错示意0-31个寄存器。w11: Ra(Xa/Wa)第三个源寄存器操作数,w12[30->4] | w12[29->3] | w12[28->2] | w12[27-26->1-0],5位不错示意0-31个寄存器。寄存器操作数伪代码示意如下:操作数大小: X为64位操作数、W为32位操作数。方针操作数: d=destination register, t=target register。源寄存器:第一个源寄存器为n,第二个寄存器为m,第三个寄存器为a。R: 示意寄存器64或32位操作数,X是64位操作数、W代表32位操作数。
在高等谈话中若是一个switch太多,在某些编译器编译优化后出咫尺多张switch子表和子表的子表的情况,关于一些换取代码的多个case会并吞到一个case中再次switch分发的情况。字据编译器的优化编译的特点,在解决switch的case为了减少查找次数找到最终的case,在代码中会往往看到大于(GT)、小于(LE)瓜分支跳转,看到这个不要招引,这是编译器优化case的成果,这样作念的方针是减少查找次数使用了肖似二分查找的算法,当看到B.EQ的跳转方针和B.NE的下一条教唆便是匹配到了case常量了。在初度解码后分发历程中平方还会有二次解码,除了MADD和MSUB等等教唆有4个寄存器操作数,教唆只需一般教唆唯独2-3个寄存器操作数,一条无缺的arm64教唆至少需要二个寄存器操作数,这里也相似如斯,当教唆唯独二个寄存器操作数时即一个方针操作数Xt和第一个源操作数Xn,其他的位域字段就会适意下来,举例:op2、Xm、Xa,在二次解码时这些适意的位域字段原有的值就会袒护被再次诓骗构成其他寻址形貌举例:shift、extend、imm等等。在假造机教唆op1的值是11(0xb)时,分发处得意解码op2,解码op2时Xt、Xn、Xm等操作数位置会发生变化,原有的x10/w10第三个源操作数在op2中酿成方针操作数,第一个源操作数酿成x8/w8,第二个源操作数酿成x9/w9,各操作数的位域解码形貌不变,变的只是操作数扮装。Xt:Rd(Xt/Wt)方针寄存器操作数(x10/w10),w12[15->4] | w12[14->3] | w12[13->2] | w12[12->1] | w12[31->0],5位不错示意0-31个寄存器。Xn: Rn(Xn/Wn)(第一个源寄存器操作数(x8/w8),w12[20-16->5-0],取出16-20位保存最低位,5位不错示意0-31个寄存器。Xm: Rm(Xm/Wm)第二个源寄存器操作数(x9/w9),w12[25-21->5-0],取出21-25位保存最低位,5位不错示意0-31个寄存器。
从op1的取值边界为0-63一共64条教唆,当op1是11时还有存在op2和op3的情况,由于假造机的handler太过雄伟分析所有的教唆太过耗时,咱们方针是回话代码逻辑,只需分析扩充过的handler,关于莫得扩充过的handler毁灭分析。在了解了op1解码形貌后,通过剧本得到扩充次数最多的教唆并优先分析:
得到扩充次数最多的教唆:
从python打印的成果来看23、11、40前边三个教唆使用最为频繁,因篇幅关联只分析这三条教唆,其中op1值是11的还存在第二个操作码op2,这里选定op1=11 & op2=12的教唆进行分析。
准备下一条教唆: pc指针地址加4
大香蕉在线当op1值等于11时会解码第二个或第三个操作码。
分析完取指、解码、扩充后大体得到了一个隐约的假造机扩充框架,为了浮浅记挂和厚实使用c伪代码来形貌。
使用剧本分解opcode的op1和op2打印所有需要分析的handler。
一共打印出15个handler,好在需要分析回话的教唆未几:
在15个handler并回话后,咫尺再行编写剧本decode_opcode.py解码opcode,将打印回话的教唆打印出伪汇编代码并保存文献ttencryptor.asm和generate_aes_key_iv.asm。
vm2回话的伪汇编代码,经过分析主要作念了这些事件:
由于vm2会调用vm3生成aes的key和iv,因此vm3的代码也需要分解回话generate_aes_key_iv.asm:
这便是libEncryptor.so中ttEncrypt函数的加密算法了。
为了考据算法是否灵验,这里使用了dy模块中的ttEncrypt算法和tt确凿立注册代码:
成果:
在分析完之后假造机保护的强度莫得念念像中的那么好,在分析过的假造化加密强度非要分10个品级的话,VMProtect为10级、Safengine Shielden强度为9级、Themida强度9级、VProtect强度7级、Enigma Protector强度3级,而它的强度品级仅为1级。
[招生]科锐逆向工程师培训(2024年11月15日实地vvvv88.com,而已教授同期开班, 第51期)
上传的附件: ttEncrypt.zip (37.79kb,257次下载)