当前位置: 首页 > 知识库问答 >
问题:

用winscard发送APDU。未连接智能卡的dll(PC/SC)

慕容嘉荣
2023-03-14

我正在尝试将APDU命令发送到读卡器本身,而不是智能卡。我使用的测试命令打开和关闭射频场。

如果我第一次连接到智能卡,该命令将通过SCardTransmit发送。但一旦射频场关闭,卡就会断开连接,我无法发送另一个APDU来打开射频场。

基本上有什么方法可以在没有卡的情况下通过pc/sc发送APDU。我想在读卡之前配置读卡器的某些部分。

提前谢谢。

-----编辑-----

正如FPGA战士提到的,我需要使用SCardControl向读卡器发送APDU命令。

我到目前为止已经采取的步骤:

使用SCardConnect连接到“卡”,直接使用SCARD_共享_,未定义SCARD_协议。这将作为成功返回,并为您提供卡片句柄。

_lastError = SCardConnect(_hContext, _cardReaderName, dwShareMode, dwPreferredProtocols, ref phCard, ref _activeProtocol);

返回:0和看起来有效的_hCard句柄。

然后我打电话给SCardControl

_lastError = SCardControl(phCard, CTL_code(3500), txBytes, (uint)txByte.Length, out rxBytes, (uint)rxAttr.Length, out rxLen);

我现在得到错误无效句柄(0x6)。因此,我的SCardConnect似乎不返回有效句柄,即使它不返回错误。

在设备上使用PC_to_RDR_Escape模式的附带注意事项是,如果您安装的驱动程序不允许,您可能需要编辑注册表来打开它。https://msdn.microsoft.com/en-us/library/windows/hardware/dn653571(v=vs.85). aspx

共有3个答案

闾丘冠玉
2023-03-14

我有过类似的经历,在SCardConnect(接收错误\u无效\u句柄)之后调用SCardTransmit

作为一个实验,放线。SCardTransmit之后的Sleep(100)似乎将错误代码从0x6更改为Sleep语句之后的SUCCESS(在调试器中查看)。这不是一个解决方案,而是一个正确方向的提示。编写线程安全代码来处理SCardControl之后的语句将是一种更好的方法。

以下链接是一个很好的参考:

https://www.csharpstar.com/csharp-race-conditions-in-threading/

爱琪
2023-03-14

我可以通过perl绑定这些参数来实现这一点:

#connect witouth card in
$hCard = new Chipcard::PCSC::Card($hContext, $ReadersList[0], $Chipcard::PCSC::SCARD_SHARE_DIRECT, $Chipcard::PCSC::SCARD_PROTOCOL_RAW);  

#send any adpu
$cmd = Chipcard::PCSC::ascii_to_array("FF 00 40 F0 04 05 05 03 03");
$hCard->Transmit($cmd);
归俊
2023-03-14

我不确定为什么要通过向卡发送APDU来配置读卡器。不应该是这样。SCardTransmit用于向一张卡发送命令,如果没有卡,它将不起作用(除非你破解驱动程序,使其撒谎说实际上插入了一张卡)。

您可能正在寻找以下API之一:https://msdn.microsoft.com/en-us/library/windows/desktop/aa375369(v=vs.85)。aspx使您可以更直接地访问读卡器/卡。

指定要在读取器上设置的配置可能会增加更改,以获得有助于您的答案。

 类似资料:
  • 我使用ACR122U-A9读取智能卡,通过以下APDU,我可以获取UID和ATS: 使用NXP TagInfo应用程序(android),我可以看到一个包含我所需数据的十六进制表。使用什么APDU命令可以检索这些数据? 六边形表如下所示: [0000]中是我想要检索的数据。

  • 我已经使用了无需太多努力即可从智能卡读取序列号。然而现在我被指派在空白卡片上创建MF(没有它序列号就无法读取)。我正在根据ISO7816指南创建APDU命令,但无法创建正确的APDU命令,因为我的十六进制值被转换为错误的字节。 我有两个问题 1:命令APDU中的数据采用了错误的字节(标记为*)。 2: SW1和SW2返回为6A 80,这意味着数据栏中的参数是不正确的(我猜是因为负值,而将十六进制格

  • 我正在尝试将小程序(.cap文件)安装到智能卡中。我读到可以使用APDU完成。我使用Netbeans创建了我的小程序,它的助手是//aid/9AE9BE4D27/53。 首先构建apdu,选择安装程序小程序: ; 然后构建将创建我的小程序的apdu(遵循此结构): 我开发了一个应用程序,可以使用。我想如果我发送正确的安装命令,我的。cap文件应安装在卡中。 有了这些信息,谁能帮我建立正确的apdu

  • 我可以毫无问题地从智能卡发送大部分数据。我注意到由于某种原因,我总是需要删除APDU中的前6个字节才能获得真正的数据。 然而,当发送一个特定的数据时,很难知道数据在APDU中的位置。 这是Java智能卡模拟器的代码: 预计发送/接收的数据为: {0x2} 但是,在中间件APDU中接收到的数据响应是: 响应Apdu.get数据(): {0x80,0x32,0x0,0x0,0x8,0x0,0x0,0x

  • 我使用Java卡开发工具包(Java卡3.0.2运行时)创建了一个小程序,我使用生成脚本APDU,然后我想用生成的APDU脚本文件运行,将小程序上传到通过USB连接到我的计算机的真正读卡器上的真正智能卡中。我运行以下命令: 但我犯了一个错误: 有可能实现我想要的目标吗?

  • 前言: 我有一个双接口智能卡读卡器,具有一些扩展功能(除了向卡发送APDU命令和接收APDU响应)。 例如,在其文档中提到,您可以使用以下命令获取读卡器的固件版本: GET_FIRMWARE_VERSION: FF69 44 42 05 68 92 00 05 00 在它的工具,有一个按钮为这个功能,它的工作原理很好: 我甚至嗅了嗅USB端口,看看我的电脑和我的读卡器之间的连接中到底交换了什么: