首页
社区
课程
招聘
[原创]关于DLL挟持测试的问题
发表于: 2017-9-1 17:52 3864

[原创]关于DLL挟持测试的问题

2017-9-1 17:52
3864

这次写的问题是好几年前碰到的,想想还是记录一下,而且还有些疑问希望高手解答一下.

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的导出全局变量的值是不断变化的,怎么样才能正确挟持?



[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
我记得有直接把导出表里的全局变量指向另一个导入dll的方法
2017-9-1 18:36
0
雪    币: 3622
活跃值: (2559)
能力值: ( LV6,RANK:83 )
在线值:
发帖
回帖
粉丝
3
hzqst 我记得有直接把导出表里的全局变量指向另一个导入dll的方法
变量是值类型,不是指针也可以吗?
2017-9-4 14:02
0
游客
登录 | 注册 方可回帖
返回
//