- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试对 Java Card 进行某种定时攻击。我需要一种方法来测量发送命令和获得答案之间耗时。我正在使用 winscard.h
接口(interface),语言为c++
。 .我为 winscard.h
接口(interface)创建了一个包装器,以简化我的工作。例如发送一个 APDU
现在我正在使用这个似乎有效的代码。基于this回答我更新了我的代码
byte pbRecvBuffer[258];
long rv;
if (this->sessionHandle >= this->internal.vSessions.size())
throw new SmartCardException("There is no card inserted");
SCARD_IO_REQUEST pioRecvPci;
pioRecvPci.dwProtocol = (this->internal.vSessions)[sessionHandle].dwActiveProtocol;
pioRecvPci.cbPciLength = sizeof(pioRecvPci);
LPSCARD_IO_REQUEST pioSendPci;
if ((this->internal.vSessions)[sessionHandle].dwActiveProtocol == SCARD_PROTOCOL_T1)
pioSendPci = (LPSCARD_IO_REQUEST)SCARD_PCI_T1;
else
pioSendPci = (LPSCARD_IO_REQUEST)SCARD_PCI_T0;
word expected_length = 258;//apdu.getExpectedLen();
word send_length = apdu.getApduLength();
CardSession session = (this->internal.vSessions).operator[](sessionHandle);
byte * data = const_cast<Apdu&>(apdu).getNonConstantData();
auto start = Timer::now();
rv = SCardTransmit(session.hCard, pioSendPci,data,
send_length, &pioRecvPci, pbRecvBuffer,&expected_length);
auto end = Timer::now();
auto duration = (float)(end - start) / Timer::ticks();
return *new ApduResponse(pbRecvBuffer, expected_length,duration);
class Timer
{
public:
static inline int ticks()
{
LARGE_INTEGER ticks;
QueryPerformanceFrequency(&ticks);
return ticks.LowPart;
}
static inline __int64 now()
{
struct { __int32 low, high; } counter;
__asm cpuid
__asm push EDX
__asm rdtsc
__asm mov counter.low, EAX
__asm mov counter.high, EDX
__asm pop EDX
__asm pop EAX
return *(__int64 *)(&counter);
}
};
我的代码因错误 ESP 的值未在函数调用中正确保存而失败。这通常是调用以一种调用约定声明的函数和以不同调用约定声明的函数指针的结果。
。我的猜测是我的英特尔处理器不支持指令 rdtsc
。我有一个英特尔 Broadwell 5500U。.我正在寻找一种合适的方法来进行这种测量并最终获得更准确的响应。
最佳答案
您提供的错误信息
The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
表示您调用的内联汇编函数中有错误。假设在调用它时使用默认调用约定,它从根本上是有缺陷的:cpuid
破坏了 ebx
,这是一个被调用者保存的寄存器。此外,它只将一个参数压入堆栈,并弹出两个:第二个弹出实际上(最有可能)是函数的返回地址,或者作为堆栈帧的一部分保存的基指针。结果,该函数在调用 ret
时失败,因为它没有可返回的有效地址,或者运行时检测到 esp
的新值(已恢复来自函数开头的值)是完全无效的。这与您使用的 CPU 无关,因为所有 x86 CPU 都支持 RDTSC
- 尽管它使用的基本时钟可能因 CPU 当前速度状态而异,这就是为什么使用不鼓励直接使用指令,应该优先使用操作系统设施,因为它们为指令在不同步进上的不同实现提供补偿。
了解您如何使用 C++11 - 通过使用 auto
来判断 - 使用 std::chrono
测量时间间隔。如果由于某种原因这不起作用,请使用您的操作系统提供的工具(这看起来像 Windows,所以可能要使用 QueryPerformanceCounter
)。如果这仍然不能满足您的要求,您可以使用 __rdtsc
生成 rdtsc
内在函数,不用担心内联汇编。
关于c++ - 在 C++ 中测量 APDU 命令到 Java Card 的时间的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37196673/
嗨,我是 java 卡新手,我有以下数据 CLA '00' INS 'A2' nb not real value P1 '00' P2 '00' LC '08' Data In 'EF08' L
像这样将GPO命令定义为APDU命令: CLA INS P1 P2 Lc Data Le 80 A8 00 00 Lc Data 00 因此,缺少的部分是 Lc 和数据,我们必须根据PDOL的 P
我正在尝试手动生成 AC,我有一个生成 AC 的工具,但我想自己生成它以了解其算法。 我的计算对于 Discover 卡来说没问题,但对于 MasterCard 却失败了。据我了解,用于生成AC的数据
我需要通过芯片读取每张可能的卡的 PAN 码。在我的工作中,我只能使用 C,而且我没有可以帮助我完成这项无聊任务的例程。这就是我使用的 APDU 的步骤: 1) 选择 1PAY.SYS.DDF01 0
我正在编写 Java Applet。我需要使用 APDU 命令将预生成的 RSAPrivateCrtKey 上传到小程序。 我在我的电脑上生成 key 。接下来我在 privateKeyBuffer
我一直在使用有线智能卡读卡器 SDK,其中调用是同步的。最近一直在尝试蓝牙接口(interface),但 APDU 命令是异步的,因此我们无法解释为形成下一个 APDU 命令而发送的调用的响应。 任何
问题:假设有一个 Applet 的多个实例。当前选择了一个Applet 实例。是否可以将任何 APDU 命令从选定的 Applet 传递到另一个 Applet 实例?我在JavaCard API 3.
主机发送以下命令给小程序选择EF文件 00 A4 02 00 02 40 01 目的是选择 ID 为 40 01(在命令的数据字段中指定)的 EF 文件。 但是当我调试 process(APDU ap
我对符合 ISO7816-4 标准的首款行业间 APDU 感兴趣。这样的 APDU 可以/允许的最大长度是多少? 我能想到的最长的APDU应该是扩展长度的ISO case 4 APDU。这意味着我们有
我的新 javacard 上有一个小程序的 AID 列表。每个小程序的用途是什么?以及如何获得每个命令都支持的 APDU 命令列表?我需要小程序的 .cap 文件所用的 java 源代码吗?我的另一个
我创建了一个包(AID=0102030405),其中包含两个小程序。 这是第一个小程序 (AID=01020304050202020202) 的程序,它将 bArray 的内容存储到静态字段并在 pr
我正在尝试与显然是根据 EMV 规范实现的 SAM 进行通信。每当我问他们问题时,开发人员只会向我推荐 EMV 书籍。一瘸一拐地通过 EMV 卡和终端规范后,我终于设法一个接一个地发送命令,并使用 C
我正在使用javax.smartcardio通过CardChannel.transmit(CommandAPDU command)向智能卡发送APDU命令。 但是,似乎在某处定义了超时,因为当我没有收
我刚刚开始制作一个使用主机卡模拟 (HCE) 的应用程序,并且我已经完成了各种零碎工作。我需要该应用程序使手机表现得像一张卡,而另一部手机表现得像 NFC 读取器并扫描它,反之亦然,以便交换一小段信息
我正在尝试从智能卡中的文件中读取数据,我正在使用以下 APDU 命令 00 B0 00 02 00 但是我得到了这样的回应: A1 1B 4F 0C A0 00 00 00 77 02 08 05 0
我正在使用 JCard sim,java 卡版本 2.2.2,我想知道 .scr 文件如何与 .java 文件相关联。 (NetBeans IDE 上的 Java 卡模拟器。我没有使用实际的智能卡)。
我正在使用 javax.smartcardio 包来开发与智能卡相关的应用程序。我想发送伪 ADPU 命令来设置阅读器的 LED/LCD 状态。 我发现向读卡器/卡发送 APDU 命令的唯一方法是 C
如您所知,Gloabal Platform Card Specification定义了一个名为 Get Data 的命令来从智能卡中检索一些信息。 GlobalPlatformPro是与智能卡通信的流
哪个 APDU 命令获取卡 ID 的 7 个字节? 我使用带有 ISO14443 层的 T=CL (ISO7816) 协议(protocol)。在检测卡上,我只能看到卡 ID 的 4 个字节。 我发现
我想发送一个响应 APDU,其中包含响应数据字段以及非 0x9000 的状态字。考虑到我对 ISO 7816-4 的理解,这通常应该是可能的。 但是,每当我指定返回数据并尝试发送它时,我看不到任何显式
我是一名优秀的程序员,十分优秀!