爬虫应对银行安全控件

时间:2024-03-22 07:15:32

背景

之前有个业务需求,抓取用户在银行的个人信息(经授权)。但由于安全控件的原因,程序在密码框无法输入,导致无法抓取。

银行流水,对网贷平台而言这是非常重要的征信数据。我所知道的,就有好些爬虫在为安全控件的问题头疼,甚至有专门的外包,寻求解决方案。

我做过各种检索和尝试,发现大部分方法都是无效的。但银行征信数据的采集,确实有些平台在做,那就说明这个问题能破,那也就没什么好担心的了,静下心一点一点来。

本文分享一些相关资料,但不便公开具体解决方案。想必对很多人而言也算是一个福利贴了。
先上几篇论文。


正文

我的尝试

  1. 首先大家都应该知道,安全控件肯定会对密码做一个加密。银行的安全加密级别,基本上是没法直接正面**的,所以就直接上模拟浏览器吧。然而在密码框,webdriver用各种姿势的按键输入都无效。疑惑开始。。
  2. 想想,安全控件是独立的一个exe安装在系统上的,可能是密码输入调用了浏览器之外的东西,所以浏览器层的模拟输入无效。那就换系统级的模拟输入吧。来,python调用winAPI接口模拟键盘输入,无效;按键精灵,无效。
  3. 奇怪,再来。屏幕键盘,无效。我平时是用着两台电脑的,之间用mousewithoutborders共享鼠标键盘。发现直连键盘的那台机能输入,但另一台机没法输入,在密码输入框,怎么按都没有输入。
  4. 好吧,用键盘钩子监控一下键盘的输入吧。发现正常输入密码时,监控到的字符变成空了。看来加密控件在hook层之前就动了手脚。

寻求原因

以上为热身动作,开始吧。先搜索键盘输入一个按键的传递流程,再搜索安全控件的功能(目的)和实现原理。

百度 谷歌很容易搜得到的,我就不说了。下面提一些比较关键的内容。

Windows 操作系统中,PS/2 键盘输入信息的传递流程如下:
1)用户敲击按键,一个按键被按下时,键盘发送相应的电信号到计算机主板上的键盘控制器(i8042);
2)键盘控制器告知CPU有键按下,同时将按键信息以键盘扫描码的形式写到键盘 I/O 接口(其中 0x60 端口保存按键扫描码,0x64 端口记录键盘控制器的状态),并产生终端请求IRQ1;
3)操作系统根据 IOAPIC 重定位表查到 IRQ1 所对应的中断号(正常情况为0x93),在根据中断向量表(IDT)查得这一中断对应的中断处理函数的地址,调用中断处理程序(ISR)进行处理;ISR 读出 0x60 端口的键盘扫描码,将之转换成系统扫描码,封装包含按键信息的 IO 请求包(IRP),将 IRP 发往键盘端口驱动(PS/2 键盘的端口驱动为 i8042 prt.sys);
4)键盘端口驱动将按键信息发往键盘类驱动(Kdbclass.sys,所有类型键盘通用);
5)键盘类驱动将按键信息封装到系统消息中发往 csrss.exe,按键信息首先被保存到系统消息队列中;
6)csrss.exe 将按键信息分发到各个应用程序的线程消息队列;
7)焦点窗口所属的程序从线程消息队列中读取被转为 ASCII 码(如果需要,还需要经过输入法编辑器 IME 的处理)的按键信息,并调用 use32.dll 更新用户界面。
爬虫应对银行安全控件
(摘自2013年《键盘输入安全研究》)

以上,可以很清晰的看到 PS/2 类型键盘的传递流程。而银行的安全控件,应该是从第2层拿了端口数据进行加密。对于这种情况,我们只需要查询所要输入字符的键盘扫描码,发送到60/64端口即可。事实上我们网上搜到的大部分“驱动级模拟键盘输入”,都是这种。
然而,这是对于 PS/2 这种键盘而言的。可是目前只有笔记本和部分老台式机才保留有 PS/2 ,现在主流的服务器都是只接受 USB 键盘的。所以向端口发送键盘扫描码这种方式并不好用。


来,再来看一下安全控件的原理。

爬虫应对银行安全控件
如上图所示,AcitveX 安全控件的防护原理如下:
1、 当用户将输入焦点定位到安全控件上,准备进行口令输入时,**相应安全控件。
2、用户通过敲击键盘上的字符,产生相应的电信号。触动操作系统的相应的中断 IRQ。
3、操作系统调用键盘驱动解释相应电信号所代表的字符,并进行相应的数据加密。将驱动解释出来的字符发送到操作系统消息队列中。
4、安全控件将接收到的密文保存在控件内的私密控件中,然后在界面上显示星号(*),并且停止字符的继续传播。
5、当用户点击网页上的登录提交按钮时,安全控件中被通知执行提交动作。安全控件动态将已加密的口令内容添加到页面中要提交的表单中,然后提交表单。
6、IE 将表单中的数据通过 HTTPS 通道传送到服务器,进行相应的处理工作。

依靠微软的驱动,先于用户态下和核心态上层的病毒和木马程序(如 hook 和篡改 SSDT、系统服务 API)获取到键盘输入,以杜绝病毒和木马程序获取到键盘输入。。。

摘自论文《银行网上支付发展研究》,张春鹤,2010年。

嗯,难怪我用系统 API 和 hook 都无效,原来安全控件在之前就已经把数据加密了。了解安全控件在哪里加密,那我们在它之前来模拟就好了。3、操作系统调用键盘驱动解释相应电信号所代表的字符,并进行相应的数据加密。Windows系统自带键盘驱动,供标准USB键盘使用。但有些特殊的像游戏键盘,经常会编写自己的键盘驱动,我们可以找相关的开发资料。另外,有些游戏对鼠标键盘的输入要求高响应,经常会像安全控件的做法那样,直接读驱动解释出来的数据。我们只需要找相应的外挂程序,也能作一些参考。

《驱动挂载对网银的入侵以及相应的防御方式》中,就是通过驱动挂载监控到密码的输入。然而攻防是个博弈的过程,两者都不断在发展,技术不断更新。。

结语

本文纯属瞎扯淡,我只是做了一些技术上的分享,我可没有怂恿你去爬银行数据哦。

题外话

近日群里都在说去年的一个裁判文书,爬虫被告,法人坐牢一年。
爬虫应对银行安全控件

嗯,又一个爬虫案。

咋说呢,天眼查广告都做到地铁里了,大大一墙广告忒威风;征信数据的同步服务,一条就是几毛到几元不等,这油水,这数据。。

咋说呢,爬虫工程师不应该仅限于爬虫,可以搞搞安全,玩玩大数据。现如今大家都在互相爬,一起爬,一份数据100个人大家一人爬一遍,何必呢。。