一、研究的目的:
1、加密芯片的目的: 防止软件被盗版,很多公司采用硬件保护软件,软硬件相结合加大了破解的难度。Appro公司的IPNC方案,就有一个6pin加密芯
片,放在CMOS sensor板上面。用加密芯片,保护Appro公司的2A lib.
2、加密芯片的原理:通过主程序调用加密程序,调用时,从RAM里面随机调用一组数据作为明文,与程序里面的密钥混合产生一组暗文,暗文传到加
密芯片,按反算法与加密芯片中密钥产生明文,与RAM中的明文比较,一致程序继续,不一致程序中断(I2C)。
3、研究的目的:让程序在没有加密芯片的情况下,绕开加密算法正常执行。
二、研究方法
客户提供的是静态库,对静态库研究最好的办法就是反汇编静态库,弄清楚程序的详细流程。
三、研究工具
1、IDA Pro:反汇编的是静态库,IDA Pro是最好的反汇编工具。它可以清晰的看到程序的流程。
四、研究步骤
1、从静态库的打印信息着手。打印信息如下:
APPRO 2A Created
XXXXX IAE_CMD_SET_CONFIG XXXXX
222 Aew_Cal_LoadParam: dfc check sum success
(nand offset: 0x00500010, size: 0x0000181c, checksum: 0x00022155)
################DFC ret=0##################
############################################################
##### AEWB IPNC_DM368IMX036 formal version for FW2.60.01 20120106. #####
############################################################
--->Chip init PASS
2、启动反汇编工具,选择Unix -static lib,选择.o文件
一共有8个.o文件,需要创建8个工程
3、根据搜索的情况,定位反汇编的具体位置 例如:dfc check sum success出现在Appro_aew_cal.o文件
4、从加密芯片的原理可以看出程序是受if else控制,如果加密芯片有效,则程序继续执行。
5、if else 对应的汇编语句格式为:
CMP R3,R1
BNE Ioc_FA0 ;通过CMP后的条件,跳转到指定位置执行。
6、比较的伪指令如下:
BEQ 相等
BNE 不等
BPL 非负
BMI 负
BCC 无进位
BCS 有进位
BLO 小于(无符号数)
BHS 大于等于(无符号数)
BHI 大于(无符号数)
BLS 小于等于(无符号数)
BVC 无溢出(有符号数)
BVS 有溢出(有符号数)
BGT 大于(有符号数)
BGE 大于等于(有符号数)
BLT 小于(有符号数)
BLE 小于等于(有符号数)
7、破解思路:为了兼容有加密芯片的设备,我这里是采用的修改CMP R3,R1的方法,也就是说,不管有没有加密芯片则程序始终执行2A 算法。
8、机器码的研究,每条汇编语句都对应4字节的二进制编码。
CMP R2,R3 --> 03 00 52 E1
CMP R3,R3 --> 03 00 53 E1
7、函数、静态库、动态库的关系
编译完的某个函数是以连续的方式存在于静态库和动态库中的。可以通过反汇编工具找到相关修改点的机器码,然后在静态库或者动态库中找到对应
的位置(采用64个字节的二进制搜索),按照预定的机器码修改。(这里要非常小心,需要观察对应位置前后的机器码是否一致,防止修改到其他地
方)
8、将修改后的动态库重新打包,测试
1、加密芯片的目的: 防止软件被盗版,很多公司采用硬件保护软件,软硬件相结合加大了破解的难度。Appro公司的IPNC方案,就有一个6pin加密芯
片,放在CMOS sensor板上面。用加密芯片,保护Appro公司的2A lib.
2、加密芯片的原理:通过主程序调用加密程序,调用时,从RAM里面随机调用一组数据作为明文,与程序里面的密钥混合产生一组暗文,暗文传到加
密芯片,按反算法与加密芯片中密钥产生明文,与RAM中的明文比较,一致程序继续,不一致程序中断(I2C)。
3、研究的目的:让程序在没有加密芯片的情况下,绕开加密算法正常执行。
二、研究方法
客户提供的是静态库,对静态库研究最好的办法就是反汇编静态库,弄清楚程序的详细流程。
三、研究工具
1、IDA Pro:反汇编的是静态库,IDA Pro是最好的反汇编工具。它可以清晰的看到程序的流程。
四、研究步骤
1、从静态库的打印信息着手。打印信息如下:
APPRO 2A Created
XXXXX IAE_CMD_SET_CONFIG XXXXX
222 Aew_Cal_LoadParam: dfc check sum success
(nand offset: 0x00500010, size: 0x0000181c, checksum: 0x00022155)
################DFC ret=0##################
############################################################
##### AEWB IPNC_DM368IMX036 formal version for FW2.60.01 20120106. #####
############################################################
--->Chip init PASS
2、启动反汇编工具,选择Unix -static lib,选择.o文件
一共有8个.o文件,需要创建8个工程
3、根据搜索的情况,定位反汇编的具体位置 例如:dfc check sum success出现在Appro_aew_cal.o文件
4、从加密芯片的原理可以看出程序是受if else控制,如果加密芯片有效,则程序继续执行。
5、if else 对应的汇编语句格式为:
CMP R3,R1
BNE Ioc_FA0 ;通过CMP后的条件,跳转到指定位置执行。
6、比较的伪指令如下:
BEQ 相等
BNE 不等
BPL 非负
BMI 负
BCC 无进位
BCS 有进位
BLO 小于(无符号数)
BHS 大于等于(无符号数)
BHI 大于(无符号数)
BLS 小于等于(无符号数)
BVC 无溢出(有符号数)
BVS 有溢出(有符号数)
BGT 大于(有符号数)
BGE 大于等于(有符号数)
BLT 小于(有符号数)
BLE 小于等于(有符号数)
7、破解思路:为了兼容有加密芯片的设备,我这里是采用的修改CMP R3,R1的方法,也就是说,不管有没有加密芯片则程序始终执行2A 算法。
8、机器码的研究,每条汇编语句都对应4字节的二进制编码。
CMP R2,R3 --> 03 00 52 E1
CMP R3,R3 --> 03 00 53 E1
7、函数、静态库、动态库的关系
编译完的某个函数是以连续的方式存在于静态库和动态库中的。可以通过反汇编工具找到相关修改点的机器码,然后在静态库或者动态库中找到对应
的位置(采用64个字节的二进制搜索),按照预定的机器码修改。(这里要非常小心,需要观察对应位置前后的机器码是否一致,防止修改到其他地
方)
8、将修改后的动态库重新打包,测试
9、测试结果,成功绕过加密芯片执行2A算法.