如何在Windows 10(mobile)上向智能卡发送低级命令(非APDU)?

如何在Windows 10(mobile)上向智能卡发送低级命令(非APDU)?,windows,nfc,win-universal-app,smartcard,apdu,Windows,Nfc,Win Universal App,Smartcard,Apdu,我正在编写基于Microsoft提供的代码。中的所有内容都与APDU命令有关。例如,TransmitAsync方法描述为: 异步传输提供的应用程序协议数据单元(APDU)命令并返回响应 然而,由于这是一个带有字节数组参数的方法,我认为我可以通过使用此方法摆脱APDU。我在文件CardReader.xaml.cs中插入了一些代码: private async Task HandleCard(SmartCard card){ ...... // Handle MIFARE Stand

我正在编写基于Microsoft提供的代码。
中的所有内容都与APDU命令有关。例如,TransmitAsync方法描述为:

异步传输提供的应用程序协议数据单元(APDU)命令并返回响应

然而,由于这是一个带有字节数组参数的方法,我认为我可以通过使用此方法摆脱APDU。我在文件CardReader.xaml.cs中插入了一些代码:

private async Task HandleCard(SmartCard card){
    ......
    // Handle MIFARE Standard/Classic
    LogMessage("MIFARE Standard/Classic card detected");
    var mfStdAccess = new MifareStandard.AccessHandler(connection);
    var uid = await mfStdAccess.GetUidAsync();
    LogMessage("UID:  " + BitConverter.ToString(uid));

    // My code
    LogMessage("==============");
    await SendBytes(connection, new byte[] { 0xFF, 0xCA, 0, 0, 0 }); //APDU Test
    await SendBytes(connection, new byte[] { 0x50, 0x00 }); // Halt card
    await SendBytes(connection, new byte[] { 0x52 }); //Wake card
    return;
    ......
}
private async Task<byte[]> SendBytes(SmartCardConnection connection, byte[] RawData)
{
    LogMessage("> " + BitConverter.ToString(RawData).Replace("-", " ").ToUpper());
    byte[] res = (await connection.TransmitAsync(RawData.AsBuffer())).ToArray();
    LogMessage("< " + BitConverter.ToString(res).Replace("-", " ").ToUpper());
    return res;
}
private async Task HandleCard(智能卡){
......
//手柄为标准型/经典型
日志信息(“检测到MIFARE标准/经典卡”);
var mfStdAccess=新的MifareStandard.AccessHandler(连接);
var uid=await mfStdAccess.GetUidAsync();
日志消息(“UID:+BitConverter.ToString(UID));
//我的代码
日志消息(“=========================”);
等待发送字节(连接,新字节[]{0xFF,0xCA,0,0,0});//APDU测试
等待发送字节(连接,新字节[]{0x50,0x00});//停止卡
等待发送字节(连接,新字节[]{0x52});//唤醒卡
返回;
......
}
专用异步任务SendBytes(SmartCardConnection连接,字节[]RawData)
{
LogMessage(“>”+BitConverter.ToString(原始数据)。替换(“-”,“”)。ToUpper());
字节[]res=(wait connection.TransmitAsync(RawData.AsBuffer()).ToArray();
日志消息(“<”+位转换器.ToString(res).Replace(“-”,”).ToUpper());
返回res;
}
我在手机上运行该应用程序,向Mifare Classic 1K卡发送命令。然而,我得到的是:

> FF CA 00 00 00
< 02 27 9F 8F 90 00
> 50 00
< 63 00
> 52
< 63 00
>FF CA 00
<02 27 9F 8F 90 00
> 50 00
< 63 00
> 52
< 63 00

显然,APDU一个有效。我不知道6300是什么,但我猜它是APUD命令中的SW响应?
我在论坛上看到,您可以使用NfcAdapter在Android手机上执行此操作。我的代码有什么问题?或者甚至可以在Windows 10 Mobile上发送低级命令(以清除APDU)?
谢谢。

PCSC有特定于存储卡的命令。这样,您就可以获得对Mifare的支持。当然,您必须获得读卡器制造商对Mifare卡的支持,但Mifare仍然非常流行

但是,不支持本机Mifare命令。您需要将其转换为第3.2.2.1节中的PCSC命令


因此,您不需要删除本机命令。只需将存储卡特定的APDU发送到读卡器,读卡器就会将本机命令发送到该卡。

您必须按照Maarten的命令发送PCSC命令。有一个写在c#上的库将低级Mirafe命令封装到PCSC APDU


检查一下

我不知道,您是如何得出这样的假设的,即“停止卡”和“唤醒卡”是由原始MIfare令牌理解的。这些命令旨在向处理器卡发出信号,表明处理器可以切换到时钟停止模式或从时钟停止模式返回以降低功耗。Mifare卡没有处理器,只有硬接线逻辑。我也不确定,除了留下一条完善的道路之外,你希望通过摆脱APDU结构获得什么。也许我用了一个不合适的例子。读卡器和卡之间有三个步骤的身份验证。我想通过低级命令(没有proxmark)了解更多信息。在防碰撞和卡选择之后,如果读卡器发送60 30 76 4a(块30身份验证),Mifare卡将以4字节质询进行响应。然而,这对我不起作用。