⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 读写sle4442系统逻辑加密卡.txt

📁 压缩包中包括多个驱动程序的原代码
💻 TXT
字号:
读写SLE4442系统逻辑加密卡 
发表时间:2005-11-2 11:04:28   浏览人数:52 
/* iccard.h 
前一阵子做了个IC卡读写程序,可以读写SLE4442系统逻辑加密卡的,本来想在网上找一个,没找到,自己写了一个,为了让后来人可以轻松一点,所以就奉献给大家:) 
注释比较少(本人的坏习惯),看起来有点累,不过建议你在自己看之前先熟悉一下SLE4442的协议。 
程序是经过测试的,在我的931上工作的很好,有什么问题,发信给我 
Ploto_zhu@etang.com  
*/ 
#ifndef IC_CARD_H 
#define IC_CARD_H 
#include <REG931.H> 

#define  RdMainMem   0x30        // outgoing data 
#define  UpdMainMem  0x38        // processing  
#define  RdPrtMem     0x34        // outgoing data 
#define  WrPrtMem    0x3C        // processing 
#define  RdSecMem     0x31        // outgoint data 
#define  UpdSecMem   0x39        // processing 
#define  CmpVerDat   0x33        // processing 


sbit CCIO  = P0^3; 
sbit CCRST = P0^1; 
sbit CCCLK = P0^2; 
sbit CCIN  = P2^7; 

#ifndef uchar 
#define uchar unsigned char  
#endif  
void IC_Reset(uchar *buffer); 
void ReadMainMemory(uchar addrFrom,uchar* buffer,uchar ulen); 
void ReadProtectedMem(uchar rdBuf[4]) ; 
void UpdateMainMemory(uchar addr,uchar value) ; 
void WriteProtectedMem(uchar addr, uchar value)  ; 
void ReadSecMemory(uchar buffer[4])  ; 
void UpdateSecMem(uchar addr, uchar value)   ; 
bit CompareVerifData(uchar value[3])   ; 

#endif 

/* ---------------------   ICCard.c ----------*/ 
#include "iccard.h" 
#include <REG931.H> 
/*  2005-9-4 常州中天科技有限公司 祝启忠*/ 
#ifndef uchar  
#define uchar unsigned char  
#endif 
//sbit CCRST=P0^1; 
//sbit CCCLK=P0^2; 
//sbit CCIO=P0^3; 
//void sendtoPC(uchar*); 
//void sendBuffer(char* buf,char len) ; 

void Delay(int x) 
{ 
    int i; 
    for(i=(x<<1);i>0;i--); 
} 

void OnePlus() 
{ 
    CCCLK=1; 
    Delay(20); 
    CCCLK=0; 
    Delay(20); 
} 
unsigned char ReadByte() 
{ 
    uchar TempByte; 
    uchar Value; 
    uchar i; 
    Value=0; 
    for(i=0;i<8;i++) 
    { 
        CCCLK=1; 
        TempByte=(unsigned char)CCIO; 
        Delay(10); 
        CCCLK=0; 
        Delay(10); 
        Value |= (TempByte<<i); 
    } 
    return Value; 
} 
void ICSendByte(uchar byte) 
{ 
    uchar TempByte; 
    uchar i; 
    for(i=0;i<8;i++) 
    { 
        TempByte= ((byte>>i) & 0x01); 
        CCIO=(bit)TempByte; 
        Delay(8); 
        CCCLK=1; 
        Delay(10); 
        CCCLK=0; 
        Delay(8); 
    } 

} 
void IC_Reset(uchar *buffer) 
{ 
    uchar len; 
    CCCLK=0; 
    CCRST=0; 
    CCIO=1; 
    Delay(800); 
    CCRST=1; 
    Delay(10); 
    CCCLK=1; 
    Delay(10); 
    CCCLK=0; 
    Delay(50); 
    CCRST=0; 
    Delay(10); 
    for(len = 0;len <4;len++) 
        buffer[len]=ReadByte(); 
     
} 


void SendCommand(uchar Cmd[3]) 
{ 
    uchar i; 
    //start condition 
    //当时钟线为高的时候,IO线从1到0 
    CCCLK=0; 
    CCIO=1; 
    Delay(4); 
    CCCLK=1; 
    Delay(8); 
    CCIO=0; 
    Delay(8); 

    CCCLK=0; 
    Delay(5);  //start condition 
    //data 
    //IC卡在时钟的上升沿读取数据 
    for(i=0;i<3;i++) 
        ICSendByte(Cmd[i]); 
    //stop condition 
    //当时钟线为高的时候, IO从0到1 
    CCIO=0; 
    Delay(10); 
    CCCLK=1; 
    Delay(10); 
    CCIO=1; 
    //命令发送结束 
    Delay(10); 

} 

//读取主存储器 
void ReadMainMemory(uchar addrFrom,uchar* buffer,uchar ulen) 
{ 
    unsigned int len; 
    uchar buf[3]; 
    buf[0]=RdMainMem; 
    buf[1]=addrFrom; 
    buf[2]=0; 
    SendCommand(buf); 

//    sendtoPC(" send ok"); 
    //开始读取数据 
    CCCLK=0; 
    Delay(10); 
    for(len=0;len<256-addrFrom;len++) 
    {     
        if(len < ulen) 
        { 
            buffer[len]=ReadByte(); 
//            sendBuffer(&buffer[len],1); 
        } 
        else 
        {     
            buf[0]=ReadByte(); 
//            sendBuffer(buf,1);    //要给脉冲,但丢弃数据 
        } 
    } 
//    sendtoPC("Read OK"); 
    // 给个结束标志 
    OnePlus(); 
} 

//读取保护内容,一共32位,4个字节 
void ReadProtectedMem(uchar rdBuf[4]) 
{ 
    uchar len; 
    uchar buf[3]; 
    buf[0]=RdPrtMem; 
    buf[1]=buf[2]=0;//addrFrom; 
    SendCommand(buf); 
    //开始读取数据 
    CCCLK=0; 
    Delay(10); 
    for(len=0;len<4;len++) 
    {     
        rdBuf[len]=ReadByte(); 
    } 

    // 给个结束标志 
    OnePlus(); 

} 
//更新主存储器的内容 
void UpdateMainMemory(uchar addr,uchar value) 
{ 
    uchar len; 
    uchar buf[3]; 
    buf[0]=UpdMainMem; 
    buf[1]=addr; 
    buf[2]=value; 
    SendCommand(buf); 
    //给脉冲 
    CCCLK=0; 
    Delay(10); 
    CCIO=0; 
    Delay(10); 
    for(len=0;len<254;len++) 
    {     
        OnePlus(); 
    } 
    CCIO=1; 
    Delay(10); 
    OnePlus(); 


    //    OnePlus(); 
} 
//更新保护存储器中的内容 
void WriteProtectedMem(uchar addr, uchar value) 
{ 
    uchar len; 
    uchar buf[3]; 
    buf[0]=WrPrtMem; 
    buf[1]=addr; 
    buf[2]=value; 
    SendCommand(buf); 

    //给脉冲 
    CCCLK=0; 
    Delay(3); 
    CCIO=0; 
    Delay(10); 
    for(len=0;len<254;len++) 
    {     
        OnePlus(); 
    } 
    CCIO=1; 
    Delay(10); 
    OnePlus(); 
} 

//读取安全区的内容 
void ReadSecMemory(uchar buffer[4]) 
{ 
    uchar len; 
    uchar buf[3]; 
    buf[0]=RdSecMem; 
    buf[1]=buf[2]=0xff;//addrFrom; 
    SendCommand(buf); 
    //开始读取数据 
    CCCLK=0; 
    Delay(10); 
    for(len=0;len<4;len++) 
    {     
        buffer[len]=ReadByte(); 
    } 

    // 给个结束标志 
    CCIO=1; 
    Delay(10); 
    OnePlus(); 

} 
//更新安全区的内容 
void UpdateSecMem(uchar addr, uchar value) 
{ 
    uchar len; 
    uchar buf[3]; 
    buf[0]=UpdSecMem; 
    buf[1]=addr; 
    buf[2]=value; 
    SendCommand(buf); 

    //给脉冲 
    CCCLK=0; 
    Delay(10); 
    CCIO=0; 
    Delay(10); 
    for(len=0;len<254;len++) 
    {     
        OnePlus(); 
    } 
    CCIO=1; 
    Delay(10); 
    OnePlus(); 

} 

//比较密码 
bit CompareVerifData(uchar value[3]) 
{ 
    uchar len; 
    uchar buf[4]; 
    ReadSecMemory(buf); 
    if(buf[0]== 0) 
        return 0; 

    //正确,计数一次 
//    if(buf[0] 
    for(len =0;len <3;len++) 
        if(buf[0] & (1 << len) ) 
        { 
            buf[0] &= ~(1<<len); 
            break; 
        } 
    UpdateSecMem(0,buf[0]);   
//    sendtoPC("Update OK"); 

    for(len = 0;len < 3;len++) 
    { 
         buf[0]=CmpVerDat; 
        buf[1]=len+1; 
        buf[2]=value[len]; 
        SendCommand(buf); 
         
        //给脉冲 
        CCCLK=0; 
//        Delay(5); 
        CCIO=0; 
        Delay(10); 
        OnePlus(); 
        OnePlus(); 

        CCIO=1; 
        Delay(10); 
        OnePlus(); 
    } 


    UpdateSecMem(0,0xff); 

    ReadSecMemory(buf); 

    if(buf[0] & 0x07 == 0x07) 
        return 1; 
       else  
        return 0; 

} 

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -