-
-
[原创](软件名veresiye)代码混淆脱壳过程分析
-
发表于: 16小时前 239
-
有公司出题脱壳附件中的exe文件,分析发现壳有以下特点:
$$DOSX:0085FA96 stc
$$DOSX:0085FA97 jb short loc_...
或
$$DOSX:0085FAB8 clc
$$DOSX:0085FAB9 jnb short near ptr loc_...
由于stc置1 cflag寄存器 c位, 一定会跳转到下一条jb指令目标地址,clc置0 cflag寄存器 c位, 也一定会跳转到下一条jnb指令目标地址。
大量的无效计算指令(带cflags配置),比如:
$$DOSX:0085FB1F shr edx, 11h
$$DOSX:0085FB22 xor dl, 0F1h
$$DOSX:0085FB25 repne or ebx, 15302B42h
$$DOSX:0085FB2C rep movzx edx, cl
$$DOSX:0085FB30 xor ebx, esi
$$DOSX:0085FB32 sub edi, 30h ;只有这一条指令是参与脱壳计算的
$$DOSX:0085FB35 and ebx, 45h
$$DOSX:0085FB38 jmp short loc_85FB3C
分析出的第一阶段的脱壳过程如下:
$$DOSX:0085F123 BE BE 07 00 00 mov esi, 7BEh ; 解密数据的总大小=0x7be=1982字节, esi每解密一个字节后会递减一.
$$DOSX:0085F167 EB 01 jmp short loc_85F16A ; 开始脱壳
$$DOSX:0085F19D 0F B6 38 movzx edi, byte ptr [eax] ; 读取一个字节数据到edi做解密
; 解密过程
$$DOSX:0085F221 2B FE sub edi, esi
$$DOSX:0085F2A6 2B FE sub edi, esi
$$DOSX:0085F3C0 33 FE xor edi, esi
$$DOSX:0085F40A 2B FE sub edi, esi
$$DOSX:0085F44D 83 C7 7A add edi, 7Ah
$$DOSX:0085F492 03 FE add edi, esi
$$DOSX:0085F4D5 03 FE add edi, esi
$$DOSX:0085F515 83 EF 2B sub edi, 2Bh
$$DOSX:0085F559 2B FE sub edi, esi
$$DOSX:0085F592 33 FE xor edi, esi
$$DOSX:0085F5D8 F2 81 EF A4 B4 CD A3 repne sub edi, 0A3CDB4A4h
$$DOSX:0085F629 33 FE xor edi, esi
$$DOSX:0085F66F F2 81 EF F7 52 36 9A repne sub edi, 9A3652F7h
$$DOSX:0085F6B6 83 EF 38 sub edi, 38h
$$DOSX:0085F6FE 03 FE add edi, esi
$$DOSX:0085F748 81 F7 92 9D 31 4E xor edi, 4E319D92h
$$DOSX:0085F7C8 03 FE add edi, esi
$$DOSX:0085F803 81 EF 80 98 6F 34 sub edi, 346F9880h
$$DOSX:0085F843 F2 81 EF 84 55 B9 57 repne sub edi, 57B95584h
$$DOSX:0085F8C4 81 C7 C2 E9 29 76 add edi, 7629E9C2h
$$DOSX:0085F906 F3 81 EF 7F 00 00 00 rep sub edi, 7Fh
$$DOSX:0085F953 2B FE sub edi, esi
$$DOSX:0085F995 81 F7 DA 27 D5 DE xor edi, 0DED527DAh
$$DOSX:0085F9D5 81 F7 FA 81 47 26 xor edi, 264781FAh
$$DOSX:0085FA1C 2B FE sub edi, esi
$$DOSX:0085FA5D 03 FE add edi, esi
$$DOSX:0085FAF4 F3 83 C7 4E rep add edi, 4Eh
$$DOSX:0085FB32 83 EF 30 sub edi, 30h
$$DOSX:0085FB72 81 EF 9B 8E D4 E6 sub edi, 0E6D48E9Bh
$$DOSX:0085FBB9 F3 83 F7 1A rep xor edi, 1Ah
$$DOSX:0085FBFA 83 C7 6A add edi, 6Ah
$$DOSX:0085FC44 F3 81 EF 8F 87 9C 58 rep sub edi, 589C878Fh
$$DOSX:0085FC88 F3 83 C7 7E rep add edi, 7Eh
$$DOSX:0085FCCA 83 EF 6B sub edi, 6Bh
$$DOSX:0085FD15 83 C7 42 add edi, 42h
$$DOSX:0085FD59 83 EF 58 sub edi, 58h
; 数据解密完成,写入到原数据地址
$$DOSX:0085FD99 F2 57 repne push edi
$$DOSX:0085FDD1 5A pop edx ; 将栈中的保存的原edi值弹出到edx.
$$DOSX:0085FDD2 88 10 mov [eax], dl ; 写入到解密后的数据到原数据地址
$$DOSX:0085FE12 F2 40 repne inc eax ; 定位到下一个字节数据地址
$$DOSX:0085FE54 F3 4E rep dec esi ; 总解密数据长度递减一
; 检查是否所有数据完成解密
$$DOSX:0085FE93 83 EE 00 sub esi, 0
$$DOSX:0085FF18 0F 85 49 F2 FF FF jnz loc_85F167 ; 是则跳出解密过程,否则继续解密下一个字节
第一阶段代码脱壳完成。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课