ET99加密狗破狗思路指导

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

因其提供了生成随机数和MD5效验功能,还加入了操作权限等特色功能,故在低端市场,这个狗非常让人喜欢
下面看看相关说明
再次声明:下面的部分内容摘抄自飞天官方的SDK内容,有朋友在前面说了,抄来的SDK谁不会啊
是的抄SDK谁都会,不过我要说的是我的文章只是思路而不是破解过程
想要看过程的,对不起,恕难提供,思路就是万能过程
任何一种狗的操作都是如下流程
找狗->打开狗->效验狗->操作够(读/写/运行)->关闭狗
先看下查找狗的操作
查找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经常会出问题
原因不明,想到了另外一个方法还没来得及试验
狗木马和官方读狗程序的改进版可在我的小站下载 https://www.360docs.net/doc/2f7767774.html,
得到数据后就可以写模拟了
使用内存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内容,既是我亲自写出来还是这些东西,没有什么不同
不同的只是我手写的话会很累
到此全文完,里面尚有不少的错误或者漏掉的东西,还望朋友们斧正
拍砖方式 860132006@https://www.360docs.net/doc/2f7767774.html, 或者 https://www.360docs.net/doc/2f7767774.html, 提出您宝贵的意见
=============================The End======================================

相关文档
最新文档