阳光网驿-企业信息化交流平台【DTC零售连锁全渠道解决方案】

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

老司机
查看: 3935|回复: 5

[讨论] 揭开加密狗模拟的神秘面纱之ET99

[复制链接]
  • TA的每日心情
    擦汗
    2017-2-17 11:07
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2009-8-21 11:49:20 | 显示全部楼层 |阅读模式
    揭开加密狗模拟的神秘面纱之ET99
    大家好,自从前面发了  揭开加密狗模拟的神秘面纱系列的Rockey6的1,2,3和Rockey2的相关文章,很多朋友给予了热情的支持。
    今天正好有点时间,整理了一下笔记,草草的出了篇  揭开加密狗模拟的神秘面纱之ET99。
    PJ笔记只是随笔的记录,本文或许有错误的地方,还望各位拍砖

    废话少说

    ET99和前面两篇文章中提及的R6和R2均属飞天一家公司
    ET99应该是R2的升级版本和即将推出的ET199篇文章介绍的ET199狗一样是为了冲击S系列的加密狗而推出的,这两款产品具有价格低廉,性能优良等特点,打的S狗**********(省略**字数)

    因其提供了生成随机数和MD5效验功能,还加入了操作权限等特色功能,故在低端市场,这个狗非常让人喜欢
    下面看看相关说明
    再次声明:下面的部分内容摘抄自飞天官方的SDK内容,有朋友在前面说了,抄来的SDK谁不会啊
    是的抄SDK谁都会,不过我要说的是我的文章只是思路而不是PJ过程
    想要看过程的,对不起,恕难提供,思路就是万能过程
    任何一种狗的操作都是如下流程
    找狗->打开狗->效验狗->操作够(读/写/运行)->关闭狗
    先看下查找狗的操作
    查找ET99需要使用函数
    et_FindToken
    看下函数定义
    ===========================================================
    et_FindToken(
                  unsigned char* pid,
                  int * count
                  )
    功能说明:
        查找计算机上指定 pid 的 ET99 个数。
    参数:
        pid:      [in]产品标识, 为固定长度 8 个字节的字符串;
        count: [out]还回的设备个数;
    返回值:
        ET_SUCCESS:执行成功,Count 为查找到的 ET99 的数目。
        ET_UNIT_NOT_FOUND:没有可以用的硬件,此时 Count 值为 0。
    ===========================================================
    由这个函数得知,找到狗返回0
    那你写模拟的时候直接返回0就OK了
    我就不写示例代码了,下面说到的东西也不再写代码
    只说思路
    找到锁当然要打开了,打开ET99使用函数et_OpenToken
    看下函数定义
    ============================================================
    et_OpenToken(

                  ET_HANDLE* hHandle,

                  unsigned char*pid,

                  int ind )

    功能说明:
        打开指定 PID 的硬件,由 index 指定打开硬件的索引,index 应该小于等于找到
    的 Token 数目。进入匿名用户状态。
    参数:
        hHandle:[out]打开设备的句柄,返回给用户,供以后的函数调用;
        pid: [in]输入的硬件设备的 pid, 为固定长度 8 个字节的字符串;
        index:[in]打开第 index 个硬件设备。
    返回值:
        ET_SUCCESS:执行成功。
        ET_UNIT_NOT_FOUND:打开指定的设备失败。
    ================================================================
    打开函数最重要的是PID的值,如果PID=0那么这只ET99就可以软复制了,因为不效验狗号
    如果PID<>0那么最好的办法就是模拟了,当然现在又不少人手里有硬复制工具        也是可以的了

    写程序返回0就是打开狗成功了
    关闭锁这里就不说了
    再来看度狗内数据的操作需要使用的函数et_Read
    看下函数定义
    ==============================================================
    et_Read(
             ET_HANDLE hHandle,
             WORD offset,
             int Len,
             unsigned char* pucReadBuf
             )
    功能说明:
        从指定的位置,读取指定的数据到指定的 BUFFER 中。此函数调用需要有
    User 权限,且调用以后不改变安全状态。
    参数:
        hHandle:[in]设备句柄
        Offset: [in]偏移量
        Len: [in]长度,不能超过 60,如果超过则需要读多次。
        pucReadBuf: [out]读出的数据存放此缓存区中,调用者保证缓冲区大小至
    少是 Len,否则可能产生系统存取异常。
    返回值:
        ET_SUCCESS:表示成功。
        ET_INVALID_PARAMETER:无效的参数。
        ET_NOT_SET_PID:没有设置 PID。
        ET_ACCESS_DENY:权限不够。
    ===============================================================
    这个函数很重要,具有以下用途
    1,读取事先定义好的数据
    2,软件运行时需要带狗注册的,把注册信息写进狗存储区,然后软件再次读出效验注册授权
    需要注意的是:如果你要写这个功能的模拟狗,那么你需要事先知道狗内的数据和对应的位置以及数据的长度
    怎么得到狗内的数据呢,可以先不写模拟狗,只写个假的函数接口,监视到读狗的PID和PIN之后使用读狗程序读出需要的数据
    或者使用DLL的api转向来实现数据偷取,我写了这个狗的数据偷取发在UnPack,需要的可以去看下,不过后来发现转向这个api经常会出问题
    原因不明,想到了另外一个方法还没来得及试验
    狗木马和官方读狗程序的改进版可在我的小站下载 bbs.key123.net
    得到数据后就可以写模拟了
    使用内存copy操作吧得到的数据写进内存缓冲区的相应位置
    然后再给一个0的返回

    读狗操作处理好之后有必要再看看写狗操作
    虽然并不是所有软件有这个操作,以防万一还是看看吧
    看下函数定义
    ===============================================================
    et_Write(
             ET_HANDLE hHandle,
             WORD offset,
             int Len,
             unsigned char* pucWriteBuf
             )
    功能说明:
        将 buf 中,Length 长的数据写到指定的偏移。有存取权限控制。匿名状态不
    可用,且在普通用户状态时还需要检查设备的配置。不改变安全状态。
    参数:
        hHandle:[in]设备句柄;
        Offset: [in]偏移;
        Len: [in]长度,不能超过 60,如果超过则需要写多次;
        pucWriteBuf: [in]等写入的数据缓存区指针;
    返回值:
        ET_SUCCESS:表示成功。
        ET_HARD_ERROR:硬件错误
        ET_INVALID_PARAMETER:无效的参数。
        ET_NOT_SET_PID:没有设置 PID。
       ET_ACCESS_DENY:权限不够。
       ET_COMMUNICATIONS_ERROR:没有打开设备。
    ==================================================================
    如果软件需要带狗注册,那么应该是用到了写狗操作
    把注册后的信息写入狗内
    软件下次运行的时候读取注册信息以便效验注册授权,这个操作处理起来不是太难
    思路是先监视软件写了什么,然后把监视到得数据放在read操作里面做相应处理即可,理论上这个操作只会在软件没有注册的时候会使用
    软件注册之后在运行就直接效验注册信息,只有效验不正确才会再次使用写操作

    产生随机数的功能我没有遇到过,故本文不做讨论

    其他的比如产生产品标识 ,产生超级用户 PIN 码,重置普通用户 PIN 码等功能,你是不会在软件上看到的
    这属于开发功能,如果你能搞到种子就可以硬复制了

    下面看看比较有特色的功能
    MD5效验
    看下函数定义
    ===============================================================
    MD5_HMAC(
                 unsigned char * pucText,
                 unsigned long ulText_Len,
                 unsigned char * pucKey,
                 unsigned long ulKey_Len,
                 unsigned char * pucToenKey,
                 unsigned char * pucDigest
                 )
    功能说明:
        标准 HMAC_MD5 的软件实现,参照 RFC2104 标准。可用于产生 TOKEN 硬
    件需要的 KEY。产生的计算结果,可以与其它系统(如服务器端系统)进行对比,
    以验证算法的正确性。匿名状态可用不改变安全状态。
    参数:
        pucText:[in]等处理的数据缓存区指针,大于 0 小于等于 51 个字节
        ulText_Len :[in]数据长度,大于 0 小于等于 51
        pucKey:[in]密钥,按标准 RFC2104,长度可以任意
        ulKey_Len:[in]密钥长度
        pucToenKey:[out]硬件计算需要的 KEY,固定 32 字节。
        PucDigest:[out]计算结果,固定 16 字节。
    返回值:
        ET_SUCCESS:表示成功。
        ET_INVALID_PARAMETER:无效的参数。
    计算 HMAC_MD5
    et_HMAC_MD5(
                  ET_HANDLE hHandle,
                  int keyID,
                  int textLen,
                  unsigned char* pucText,
                  unsigned char *digest
                  )
    功能说明:
        利用硬件计算 HMAC-MD5 ,pid 为出厂时,还回错误。权限等同于 KEY 的
    读权限。不改变安全状态。
    参数:
        hHandle:[in]设备句柄
        keyID:[in]密钥指示,范围(1—8)
        pucText:[in]待计算的数据,大于 0 小于等于 51 个字节
        textLen:[in]数据长度,大于 0 小于等于 51
        digest:[out]散列结果的数据指针,固定长度 16 个字节。
    返回值:
        ET_SUCCESS:表示成功;
        ET_NOT_SET_PID:没有设置 PID;
        ET_INVALID_PARAMETER:无效的参数;
        ET_COMMUNICATIONS_ERROR:没有打开设备。、
    ===========================================================
    这个东西不太好说,因为我目前还在试验阶段
    HMAC_MD5是标准算法,我没有找到这个算法的实现类库,更没有找到Delphi版本的
    不知哪位有这个算法的类库或者Delphi版本的代码能共享一下,不胜感激,如有通用DLL接口更好了

    上面很大篇幅是摘抄自SDK内容,既是我亲自写出来还是这些东西,没有什么不同
    不同的只是我手写的话会很累
    到此全文完,里面尚有不少的错误或者漏掉的东西,还望朋友们斧正

    =============================The End=============================
    楼主热帖
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    开心
    昨天 14:21
  • 签到天数: 3898 天

    [LV.Master]伴坛终老

    发表于 2009-8-22 10:51:51 | 显示全部楼层
    这个和深思系列的不一样吗.
    启用邀请码注册,提高发帖质量,建设交流社区

    该用户从未签到

    发表于 2009-9-21 11:25:22 | 显示全部楼层
    我想问问楼主,想学这么技术,有什么好点的书籍,或者网站能够给我参考参考啊~!
    我会编程的,就是C#,但是我不知道如何下手啊,给个指点吧
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情

    2022-7-24 11:02
  • 签到天数: 152 天

    [LV.7]常住居民III

    发表于 2009-9-22 12:11:51 | 显示全部楼层
    楼主写的东西看了,头晕,的确这个东西听深奥的!
    启用邀请码注册,提高发帖质量,建设交流社区

    该用户从未签到

    发表于 2009-10-10 08:41:38 | 显示全部楼层
    如果只是对付DLL调用型的,需要把函数源型写这么长嘛??

    只要告诉大家是DLL劫持,我想很多会点编程的都知道如何重构一个DLL。  只要是DLL型的调用,重构模板我早已写好

    域天,龙脉,飞天,坚石,深思,彩虹(包含圣天诺),WIBU。

    只是个体力活而已

    ylz2004 于 2009-10-10 08:42 补充以下内容

    不如多看看无驱且使用静态编译的狗的模拟吧!!!
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    开心
    2023-9-3 13:54
  • 签到天数: 183 天

    [LV.7]常住居民III

    发表于 2013-7-5 15:22:33 | 显示全部楼层
    这些都是无关紧要的,重要的是种子码
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表