SENSE4加密狗,网上的资料现在也算比较全了,我也来简单的说说破解思路,
SENSEIV狗通常的调用方式如下:
1、枚举设备,分配空间
2、再次枚举设备,连接设备
3、获取设备信息
4、更改目录,校验用户pin码,执行锁内程序得到返回值
下面具体的来说说各个步骤。
第一步:
DWORD WINAPI S4Enum
(
OUT SENSE4_CONTEXT *pS4CtxList,
IN OUT DWORD *pdwCtxListSize
);
枚举系统连接了多少个设备,这一步不用判断返回值,第一个参数输入NULL如果得到的设备上下文内存数量为0
或者不为sizeof(SENSE4_CONTEXT)的倍数,说明没有找到设备或者列举设备出错。根据返回的设备个数,分配
空间给程序使用
s4CtxList = (SENSE4_CONTEXT *)malloc(dwSize);
s4CtxList结构如下:
typedef struct
{
DWORD dwIndex; /** device index; index begins at zero*/
DWORD dwVersion; /** device version*/
S4HANDLE hLock; /** device handle*/
BYTE reserve[12]; /** reserved*/
BYTE bAtr[MAX_ATR_LEN]; /** ATR*/
BYTE bID[MAX_ID_LEN]; /** device ID*/
DWORD dwAtrLen; /** ATR length*/
}SENSE4_CONTEXT,*PSENSE4_CONTEXT;
第二步:
//根据分配的空间,再次枚举设备,这次要判断函数返回值。
S4Enum(s4CtxList,&dwSize)
S4OpenEx(&s4CtxList[0], &S4_OpenInfo)
S4_OpenInfo结构如下:
typedef struct _S4OPENINFO
{
DWORD dwS4OpenInfoSize; /* size of the structure*/
DWORD dwShareMode; /* share mode*/
} S4OPENINFO;
第三步:
DWORD WINAPI S4Control
(
IN SENSE4_CONTEXT *pS4Ctx,
IN DWORD dwCtlCode,
IN VOID *pInBuffer,
IN DWORD dwInBufferLen,
OUT VOID *pOutBuffer,
IN DWORD dwOutBufferLen,
OUT DWORD *pdwBytesReturned
);
#define S4_LED_UP 0x00000004 /** LED up*/
#define S4_LED_DOWN 0x00000008 /** LED down*/
#define S4_LED_WINK 0x00000028 /** LED wink*/
#define S4_GET_DEVICE_TYPE 0x00000025 /** get the device type*/
#define S4_GET_SERIAL_NUMBER 0X00000026 /** get the device serial number*/
#define S4_GET_VM_TYPE 0X00000027 /** get the virtual machine type*/
#define S4_GET_DEVICE_USABLE_SPACE 0x00000029 /** get the total space of the device*/
#define S4_SET_DEVICE_ID 0x0000002a /** set the device ID*/
#define S4_RESET_DEVICE 0x00000002 /** reset the device*/
#define S4_DF_AVAILABLE_SPACE 0x00000031 /** get the free space of current directory*/
#define S4_EF_INFO 0x00000032 /** get specified file information in current directory*/
#define S4_SET_USB_MODE 0x00000041 /** set the device as a normal usb device*/
#define S4_SET_HID_MODE 0x00000042 /** set the device as a HID device*/
#define S4_GET_CUSTOMER_NAME 0x0000002b /** get the customer number*/
#define S4_GET_MANUFACTURE_DATE 0x0000002c /** get the manufacture date of the device*/
#define S4_GET_CURRENT_TIME 0x0000002d /** get the current time of the clock device*/
第四步:
DWORD WINAPI S4ChangeDir
(
IN SENSE4_CONTEXT *pS4Ctx,
IN LPCSTR lpszPath
);
DWORD WINAPI S4VerifyPin
(
IN SENSE4_CONTEXT *pS4Ctx,
IN BYTE *pbPin,
IN DWORD dwPinLen,
IN DWORD dwPinType
);
DWORD WINAPI S4ExecuteEx
(
IN SENSE4_CONTEXT *pS4Ctx,
IN LPCSTR lpszFileID,
IN DWORD dwFlag,
IN VOID *pInBuffer,
IN DWORD dwInbufferSize,
OUT VOID *pOutBuffer,
IN DWORD dwOutBufferSize,
OUT DWORD *pdwBytesReturned
);
最后处理返回值,关闭设备:
DWORD WINAPI S4Close
(
IN SENSE4_CONTEXT *pS4Ctx
);
关于SENSE4的破解思路就暂时写到这,写得不好的请不要扔石头,欢迎大家交流。
以后还会有几篇实战的例子,到时候会详细的分析具体的加密方法和处理过程。
微信扫一扫打赏
支付宝扫一扫打赏
