-
-
有关CC的几点认识
-
发表于:
2006-3-12 16:34
5841
-
有关CC的几点认识
1、什么是cc?
是arm的一种保护方式,把程序中的跳转改成int3,或者插入一些int3,由于int3反汇编后代码是cc,所以称之为cc保护,以上是我对cc名称的理解。
2、壳怎么识别cc?
壳里有表,里面记录了cc的地址,类型,目标,当加壳程序遇到cc时,壳会查表,实现正常功能。
3、如何修复?
当然是得到壳的表,然后改回去。
4、具体方法?
有很多,许多高人都有自己的方法,感觉heXer脱arm4.0的方法最方便,可惜我没学会,不过我发现使用ArmInline修复CC的一点心得:
根据ArmInline保存的文件手动修复,打开文件:
0000bda0h: 01 00 00 00 8A BA 42 00 A2 BA 42 00 18 00 00 00 ; ....?B.⒑B.....
0000bdb0h: 02 00 00 00 75 BB 42 00 7A BB 42 00 05 00 00 00 ; ....u宦.z宦.....
0000bdc0h: 02 00 00 00 7F BB 42 00 9B BB 42 00 02 00 00 00 ; ....宦.?B.....
0000bdd0h: 03 00 00 00 9D BB 42 00 B8 BB 42 00 02 00 00 00 ; ....?B.富B.....
0000bde0h: 03 00 00 00 BA BB 42 00 EC BB 42 00 02 00 00 00 ; ....夯B.旎B.....
0000bdf0h: 03 00 00 00 F9 BB 42 00 FE BB 42 00 05 00 00 00 ; ....?B.?B.....
第一个字节是跳转类型,单数一般是jnz,双数一般是jz,第5-8字节是cc所在地址,表示形式如下:00401234为34 12 40 00。第9-12字节是cc的目标地址,表示方式同前,第13字节是cc所在地址原来的字节数。
具体步骤:
用od载入dump文件,然后查找所有命令:int3,在所有int3上下断。
运行,会中断在int3处,然后在文件中查找地址如在0042BB7F中断,可以看到跳转是02,表示是jz,目标是0042BB9B,改好后就可以了,然后下一个继续。
另外,我发现如果是以下情况可以直接NOP掉5个字节:
cc地址和跳到的地址相差5个字节,则直接NOP掉5个字节,如上面最后一行的cc。
如果cc是由跳转而来,则直接NOP掉5个字节
如果cc后面还是cc,则继续NOP掉5个字节
如果cc出现在没有cmp、test、call的地方,一般NOP掉5个字节
如果点击菜单或按钮就碰到cc,则NOP掉5个字节
另外还要注意:
cc:
005A0B47 CC int3
005A0B48 B0 C3 mov al,0C3
005A0B4A 06 push es
005A0B4B FC cld
005A0B4C 328B 83280300 xor cl,byte ptr ds:[ebx+32883]
005A0B52 00E8 add al,ch
修改后
005A0B47 /0F84 BF000000 je fix1.005A0C0C
005A0B4D |90 nop
005A0B4E |90 nop
005A0B4F |90 nop
005A0B50 |90 nop
005A0B51 |90 nop
005A0B52 |00E8 add al,ch
005A0B54 |D8ED fsubr st,st(5)
需要把出现的nop改回去:
005A0B47 /0F84 BF000000 je fix1.005A0C0C
005A0B4D |8B83 28030000 mov eax,dword ptr ds:[ebx+328]
005A0B53 |E8 D8EDEBFF call fix1.0045F930
否则就挂了,
另外,修改后保持断点是非常有用的,可以在修改失误或错误的情况下修正。
另外,cc在同一个程序里是有规律的。
另外,ArmInline提供的数据基本是对的,个别的并不准确,需要根据自己的经验识别
另外,我没有见到过其他类型跳转的cc,
另外,cc都是在关键的地方出现,包括注册关键处,如果修复好了,就能破解了。
另外,我一般只是修复注册处的cc,
另外,我以后不会再修复cc,太累。
[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!