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

📄 mifare1.c.bak

📁 mifarea卡程序mifarea卡程序mifarea卡程序
💻 BAK
📖 第 1 页 / 共 2 页
字号:
            cmd[1] = i;
            return 2;
        }
        
        i = M500ReadValue(m1block, cmd+1, m1bakblock);
        if(i != MI_OK)
        {
            cmd[0] = FAIL;
            cmd[1] = i;
            return 2;
        }
        else
        {
            if(m1eptype)        // msb first ep
            {
                epvalue = buftolong51(cmd+1);
                longtobuf86(epvalue, cmd+1);
            }
            // success
            cmd[0] = SUCCESS;
            return 5;
        }
    }
    else if(cmd[1] == CMD_DECEP)
    {
        uchar m1bakblock, m1eptype;
        
        m1bakblock = m1data[0];
        m1eptype = m1data[1];
        m1data += 2;
        m1block = (m1sector << 2) + m1block;
        m1bakblock = (m1sector << 2) + m1bakblock;
        
        if(len != 10)
        {
            cmd[0] = ERRORCMDLEN;
            return 1;
        }
    
        epvalue = buftolong86(m1data);
        
        i = M500ReadValue(m1block, cmd, m1bakblock);
        if(i != MI_OK)
        {
            cmd[0] = FAIL;
            cmd[1] = i;
            return 2;
        }
    
        if(!m1eptype)    // lsb first ep
            oldepvalue = buftolong86(cmd);
        else            // msb first ep
            oldepvalue = buftolong51(cmd);
        
        epvalue = oldepvalue - epvalue;
            
        if(!m1eptype)    // lsb first ep
            longtobuf86(epvalue, cmd);
        else            // msb first ep
            longtobuf51(epvalue, cmd);
    
        if(MI_OK != (i = M500WriteValue(m1block, cmd, m1bakblock)))
        {
            cmd[0] = FAIL;
            cmd[1] = i;
            return 2;
        }
        
        i = M500ReadValue(m1block, cmd+1, m1bakblock);
        if(i != MI_OK)
        {
            cmd[0] = FAIL;
            cmd[1] = i;
            return 2;
        }
        else
        {
            if(m1eptype)        // msb first ep
            {
                epvalue = buftolong51(cmd+1);
                longtobuf86(epvalue, cmd+1);
            }
            // success
            cmd[0] = SUCCESS;
            return 5;
        }
    }
    else if(cmd[1] == CMD_RDEP)
    {
        uchar m1bakblock, m1eptype;
        
        m1bakblock = m1data[0];
        m1eptype = m1data[1];
        m1data += 2;
        m1block = (m1sector << 2) + m1block;
        m1bakblock = (m1sector << 2) + m1bakblock;
        
        if(len != 6)
        {
            cmd[0] = ERRORCMDLEN;
            return 1;
        }
    
        i = M500ReadValue(m1block, cmd+1, m1bakblock);
        if(i != MI_OK)
        {
            cmd[0] = FAIL;
            cmd[1] = i;
            return 2;
        }
        else
        {
            if(m1eptype)        // msb first ep
            {
                epvalue = buftolong51(cmd+1);
                longtobuf86(epvalue, cmd+1);
            }
            // success
            cmd[0] = SUCCESS;
            return 5;
        }
    }
    else if(cmd[1] == CMD_WREP)
    {
        uchar m1bakblock, m1eptype;
        
        m1bakblock = m1data[0];
        m1eptype = m1data[1];
        m1data += 2;
        m1block = (m1sector << 2) + m1block;
        m1bakblock = (m1sector << 2) + m1bakblock;
        
        if(len != 10)
        {
            cmd[0] = ERRORCMDLEN;
            return 1;
        }
    
        if(m1eptype)        // msb first ep
        {
            epvalue = buftolong86(m1data);
            longtobuf51(epvalue, m1data);
        }
    
        if(MI_OK != (i = M500WriteValue(m1block, m1data, m1bakblock)))
        {
            cmd[0] = FAIL;
            cmd[1] = i;
            return 2;
        }
        i = M500ReadValue(m1block, cmd+1, m1bakblock);
        if(i != MI_OK)
        {
            cmd[0] = FAIL;
            cmd[1] = i;
            return 2;
        }
        else
        {
            if(m1eptype)        // msb first ep
            {
                epvalue = buftolong51(cmd+1);
                longtobuf86(epvalue, cmd+1);
            }
            // success
            cmd[0] = SUCCESS;
            return 5;
        }
    }
    
    // 使用philips的命令加减钱包
    else if(cmd[1] == CMD_PINCEP)
    {
        uchar m1bakblock, m1eptype;
        
        m1bakblock = m1data[0];
        m1eptype = m1data[1];
        m1data += 2;
        m1block = (m1sector << 2) + m1block;
        m1bakblock = (m1sector << 2) + m1bakblock;
        
        if(len != 10)
        {
            cmd[0] = ERRORCMDLEN;
            return 1;
        }

        // convert data
        if(m1eptype)        // msb first ep
        {
            epvalue = buftolong86(m1data);
            longtobuf51(epvalue, m1data);
        }
        
        epstatus = M500GetEpStatus(m1block, m1bakblock);

        // increment
        if(epstatus & 0x01)
        {
            i = M500Increment(m1block, m1data, m1bakblock);
        }
        else if(epstatus & 0x02)
        {
            i = M500Increment(m1bakblock, m1data, m1block);
        }
        else
        {
            cmd[0] = FAIL;
            cmd[1] = MI_VALERR;
            return 2;
        }
        // either success or fail, i will send the ep value
        if(i != MI_OK)
        {
            cmd[0] = FAIL;
            //cmd[1] = i;
            //CommSend(cmd, 2);
            //break;
        }
        else
        {
            cmd[0] = SUCCESS;
        }

        i = M500ReadValue(m1block, cmd+1, m1bakblock);
        if(i != MI_OK)
        {
            cmd[0] = FAIL;
            cmd[1] = i;
            return 2;
        }
        else
        {
            // success
            if(m1eptype)        // msb first ep
            {
                epvalue = buftolong51(cmd+1);
                longtobuf86(epvalue, cmd+1);
            }
            
            return 5;
        }
    }
    else if(cmd[1] == CMD_PDECEP)
    {
        uchar m1bakblock, m1eptype;
        
        m1bakblock = m1data[0];
        m1eptype = m1data[1];
        m1data += 2;
        m1block = (m1sector << 2) + m1block;
        m1bakblock = (m1sector << 2) + m1bakblock;
        
        if(len != 10)
        {
            cmd[0] = ERRORCMDLEN;
            return 1;
        }

        // convert data
        if(m1eptype)        // msb first ep
        {
            epvalue = buftolong86(m1data);
            longtobuf51(epvalue, m1data);
        }
        
        epstatus = M500GetEpStatus(m1block, m1bakblock);

        // increment
        if(epstatus & 0x01)
        {
            i = M500Decrement(m1block, m1data, m1bakblock);
        }
        else if(epstatus & 0x02)
        {
            i = M500Decrement(m1bakblock, m1data, m1block); //070207, switch bakblock and block
        }
        else
        {
            cmd[0] = FAIL;
            cmd[1] = MI_VALERR;
            return 2;
        }
        // either success or fail, i will send the ep value
        if(i != MI_OK)
        {
            cmd[0] = FAIL;
            //cmd[1] = i;
            //CommSend(cmd, 2);
            //break;
        }
        else
        {
            cmd[0] = SUCCESS;
        }

        i = M500ReadValue(m1block, cmd+1, m1bakblock);
        if(i != MI_OK)
        {
            cmd[0] = FAIL;
            cmd[1] = i;
            return 2;
        }
        else
        {
            // success
            if(m1eptype)        // msb first ep
            {
                epvalue = buftolong51(cmd+1);
                longtobuf86(epvalue, cmd+1);
            }
            
            // cmd[0] = SUCCESS; // see the dec operation
            return 5;
        }
    }
    else if(cmd[1] == CMD_BLOCKCOPY)
    {
        uchar m1bakblock;
        
        m1bakblock = m1data[0];
        m1block = (m1sector << 2) + m1block;
        m1bakblock = (m1sector << 2) + m1bakblock;
        
        if(len != 5)
        {
            cmd[0] = ERRORCMDLEN;
            return 1;
        }
        
        i = M500Copy(m1block, m1bakblock);
        if(i != MI_OK)
        {
            cmd[0] = FAIL;
            cmd[1] = i;
            return 2;
        }
        else
        {
            cmd[0] = SUCCESS;
            return 1;
        }
    }
    
    else
    {
        // error package
        cmd[0] = ERRORCMD;
        return 1;
    }

}

bit M1Search(unsigned char *snr)
{
    char atq[2];
    static bit fret = 0;
    unsigned char i;
    static unsigned int starttime = 0;
    static unsigned int hascardtime = 0;
    
    if(GetTenTickCount() - starttime <= 50)
        return fret;
        
    starttime = GetTenTickCount();
    
    for(i=0; i<4; i++)
    {
        if(M500Request(PICC_REQALL /*PICC_REQSTD*/, atq) == MI_OK)
        {
            if(MI_OK == M500Anticoll(snr))
            {
                if(MI_OK == M500Select(snr))
                {
                    if(fret == 0)
                    {
                        if(starttime - hascardtime >= CardConfirmTime)
                            fret = 1;
                    }
                    return fret;
                }
            }
        }

        #ifdef WATCHDOG
        ResetWDT();
        #endif
    }
    
    hascardtime = starttime;
    return (fret = 0);
}

long buftolong86(char *buf)
{
    char invbuf[4];
    
    invbuf[0] = buf[3];
    invbuf[1] = buf[2];
    invbuf[2] = buf[1];
    invbuf[3] = buf[0];
    
    return  *(long *)invbuf;
}

void longtobuf86(long val, char *buf)
{
    char *invbuf;
    
    invbuf = (char *)&val;
    
    buf[0] = invbuf[3];
    buf[1] = invbuf[2];
    buf[2] = invbuf[1];
    buf[3] = invbuf[0];
}

long buftolong51(char *buf)
{
    return *(long *)buf;
}

void longtobuf51(long val, char *buf)
{
    memcpy(buf, (char *)&val, 4);
}

unsigned char M1Auth(unsigned char keyab, unsigned char *key, unsigned char sec)
{
    unsigned char i;
    
    if(keyab)
        keyab = PICC_AUTHENT1B;
    else
        keyab = PICC_AUTHENT1A;
        
    i = M500Auth(keyab, snr, key, sec);
    if(MI_OK != i)
    {
        return i;
    }
    else
    {
        // search current key in key buffer
        for(i=0; i<m1keycnt; i++)
        {
            if(sec == (m1keystatus[i] & 0x7f))
                break;
        }
        
        if(i >= m1keycntmax)        // not found and buffer full
            i = 0;
        else if(i >= m1keycnt)      // not found and buffer not full
            m1keycnt += 1;
        // else                     // found
            
        ///////////////////////////////////////////////////////
        memcpy(m1keys[i], key, 6);       // store key
        if(PICC_AUTHENT1A == keyab)
            m1keystatus[i] = sec & 0x7f;    // key a
        else
            m1keystatus[i] = sec | 0x80;    // key b
        
        return MI_OK;
    }
}

⌨️ 快捷键说明

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