这次写的问题是好几年前碰到的,想想还是记录一下,而且还有些疑问希望高手解答一下.
dll挟持的代码生成工具使用AheadLib.exe,编译工具vc2008,目标dll为winscard.dll;
用vc2008编译生成winscard.dll后,把它放在主程序的同一目录下,打开主程序,读卡器打开正常,但是无法收发apdu指令(无法通过读卡器跟IC卡片通讯),
Reader is
open:[Identive CLOUD 4700 F Contactless Reader 0]
Active protocol T1
I:00A40400 08
A000000003000000
O:无数据返回
S:无数据返回
用OD经过一轮跟踪发现,有三个全局变量的值跟直接调用原dll不一样,总是全0x00,应该是这里在作怪。
最后想了个办法,重新定义导出这三个全局变量,
EXTERNC EXPORT SCARD_IO_REQUEST
g_rgSCardT0Pci={0},
g_rgSCardT1Pci={0},
g_rgSCardRawPci={0};
注释掉AheadLib生成的导出代码的相应部分
//全局变量不导出
//#pragma
comment(linker,
"/EXPORT:g_rgSCardRawPci=_AheadLib_g_rgSCardRawPci,@66")
//#pragma
comment(linker,
"/EXPORT:g_rgSCardT0Pci=_AheadLib_g_rgSCardT0Pci,@67")
//#pragma
comment(linker,
"/EXPORT:g_rgSCardT1Pci=_AheadLib_g_rgSCardT1Pci,@68")
然后在LoadLibrary原始winscard.dll后,做赋值操作
//同步3个全局变量的值。
memcpy(&g_rgSCardT0Pci,AheadLib::GetAddress("g_rgSCardT0Pci"),sizeof(g_rgSCardT0Pci));
memcpy(&g_rgSCardT1Pci,AheadLib::GetAddress("g_rgSCardT1Pci"),sizeof(g_rgSCardT1Pci));
memcpy(&g_rgSCardRawPci,AheadLib::GetAddress("g_rgSCardRawPci"),sizeof(g_rgSCardRawPci));
重新编译,打开主程序,挟持DLL竟然成功了!(可以在SCardTransmit里随意操作修改发送和接收到的apdu指令)
不过问题来了,幸好这3个全局变量的值在使用过程中不会修改变化,如果有的dll的导出全局变量的值是不断变化的,怎么样才能正确挟持?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课