破解Rockey3加密狗复制方法:调用狗的指令

破解Rockey3加密狗复制方法:调用狗的指令

 

目的:普及一下Rockey3狗的基本知识及分析的一些方法,有机会分析一下Rockey3的狗壳。

练习内容:系统所带的文件

说明:Rockey3下文中简称R3狗

破解Rockey3加密狗复制方法:调用狗的指令  

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条之间,当然并不一定,如果指令少,还可以用

猜的办法来获得算法,但如果过长,那时间将是天文数字。

 
上一篇:sql 计算auc


下一篇:PTA数据结构与算法题目集(中文) 7-34