破解Rockey3加密狗复制方法:调用狗的指令
目的:普及一下Rockey3狗的基本知识及分析的一些方法,有机会分析一下Rockey3的狗壳。
练习内容:系统所带的文件
说明:Rockey3下文中简称R3狗
1. 查找狗(RY_FIND)
目的: 查找指定密码的加密狗是否存在
输入参数:
function = RY_FIND 功能码 1
*p1 = 密码1 //必须
*p2 = 密码2 //必须
*p3 = 密码3 (可选)
*p4 = 密码4 (可选)
返回:
retcode = 0 表示成功,其它为错误码。无狗错误码为3
当成功时,*lp1 中为加密狗的硬件ID
//说明:1)密码1及密码2的是必须的,也是查找狗的基础,也称为一级口令。
密码3和密码4是高级密码,只有有了这一组密码才可以写狗的用
户ID区,模块区,自定义算法区,这三块的内容中除用户ID区
外,其它二个正是狗的复制难点之处。
2)返回的lp1中数据类型为无符号整数,这一个也正是识别不同的R4
狗的重要之处。同时也是一些软件加密要用的内容。
2. 打开狗(RY_OPEN)
目的: 打开指定密码及硬件ID 的加密狗
输入参数:
function = RY_OPEN
*p1 = 密码1 //和1功能中应该相同,且不可改变Lp1中的硬件ID
*p2 = 密码2 //和1功能中应该相同
*p3 = 密码3 (可选)
*p4 = 密码4 (可选)
*lp1 = 硬件ID
返回:
retcode = 0 表示成功,其它为错误码。
当成功时,*handle 为加密狗的句柄
lp2 为加密狗的类型
//说明: 在lp2中的类型比较重要,一些狗用的比较好的。会判断当
前的狗的类型,如果类型不对,就是其它的参数相同,也会
不认当前的狗。
在这里请注意狗的类型不同,相应的数据量也不同,标版内
存区为24个字节,自定义算法区 32条指令,增强版及网络版
内存区为120个字节,自定义算法区为80条指令。
3. 关闭狗(RY_CLOSE)
目的: 关闭相应handle 的加密狗
输入参数:
function = RY_CLOSE
*handle = 狗的句柄
返回:
retcode = 0 表示成功,其它为错误码。
4. 读狗(RY_READ)
目的: 读出加密狗用户读写区的内容
输入参数:
function = RY_READ
*handle = 狗的句柄
*p1 = 位置
*p2 = 长度(以字节为单位)
buf = 缓冲区的指针
返回:retcode = 0 表示成功,其它为错误码。
当成功时,buf 中为读入的内容。
//buf是直接的内存区,在读数据时要根据功能3中返回的类型判断长度,不
要超长,标版24 增强及网络版是120。
5. 写狗(RY_WRITE)
目的: 向用户读写区内写入内容
输入参数:
function = RY_WRITE
*handle = 狗的句柄
*p1 = 位置
*p2 = 长度(以字节为单位)
buffer = 缓冲区的指针
返回:
retcode = 0 表示成功,其它为错误码。
//说明同上
6. 随机数(RY_RANDOM)
目的: 从加密狗得到一个随机数
输入参数:
function = RY_RANDOM
*handle = 狗的句柄
返回:
retcode = 0 表示成功,其它为错误码。
当成功时,*p1 中为加密狗返回的随机数
//这个在实际加密的过程中没有多大的意义,在自定义的算法中有意
义,但不是我们调用得到的。这个功能对用户开放无多大的意义。
7. 种子码(RY_SEED)
目的: 得到种子码的返回码
输入参数:
function = RY_SEED
*handle = 狗的句柄
*lp2 = 种子码 //重要之处,在分析时一定要注意这个入口值是多少
返回:
retcode = 0 表示成功,其它为错误码。
当成功时,
*p1 = 返回码1
*p2 = 返回码2
*p3 = 返回码3
*p4 = 返回码4
//说明:4个返回值用处很大,也是加密者经常使用的功能,这个种子码和狗的密
码相关,同号狗(指密码相同)生成的种子返回值都是相同的。
这个功能在狗壳的分析中也是难度最大的,如果没有狗,那是没有办法
知道返回值的,但可以采用变通的方式来完成,从而取得种子码的返回
值,也就是常说的无狗脱狗壳的方法。
8. 写用户ID(RY_WRITE_USERID)
目的: 写入用户定义的ID
输入参数:
function = RY_WRITE_USERID
*handle = 狗的句柄
*lp1 = 用户ID //是一个无符号长整型
返回:
retcode = 0 表示成功,其它为错误码。
//这个功能要求在1功能和3功能中打开狗时指定高级密码,否则是不允许写入的,
如果无高级密码状态下写入次数过多,将可能会损坏狗或将狗狗死,请慎重操作。
9. 读用户ID (RY_READ_USERID)
目的: 读出用户定义的ID
输入参数:
function = RY_READ_USERID
*handle = 狗的句柄
返回:
retcode = 0 表示成功,其它为错误码。
当成功时,*lp1 为用户ID
//读可以不用高级密码。
10. 设置模块(RY_SET_MOUDLE)
目的: 设置模块字及递减属性
输入参数:
function = RY_SET_MOUDLE
*handle = 狗的句柄
*p1 = 模块号
*p2 = 用户模块字
*p3 = 是否允许递减(1 = 允许,0 = 不允许)
返回:
retcode = 0 表示成功,其它为错误码。
//模块的数据比较特殊,只有有高级密码的情况下才可以写,但就是具有了全部的
密码,也不能读出模块的内容,但可以用变通的方法来读出它的数值。
11. 检查模块属性(RY_CHECK_MOUDLE)
目的: 检查模块属性字
输入参数:
function = RY_CHECK_MOUDLE
*handle = 狗的句柄
*p1 = 模块号
返回:
retcode = 0 表示成功,其它为错误码。
当成功时,
*p2 = 1 表示此模块有效
*p3 = 1 表示此模块可以递减
//这一项功能常用在一些试用版的软件上,使用了递减功能,使模块内的数据逐步
减1,当为0时,当前模块将无效,测试功能也就结束了。
12. 写算法(RY_WRITE_ARITHMETIC)
目的: 向加密狗中写入自定义算法
输入参数:
function = RY_WRITE_ARITHMETIC
*handle = 狗的句柄
*p1 = 算法区位置
buffer = 算法指令串
返回:
retcode = 0 表示成功,其它为错误码。
// 自定义是难度最高的部分,也是这个R3的狗特点之一,可以将一些关键计算写到
狗中,指令格式见后面。但因为狗的自身原因,不可能写入太多的指令,否则软件
的速度会很受影响,算法常是1-10条之间,当然并不一定,如果指令少,还可以用
猜的办法来获得算法,但如果过长,那时间将是天文数字。