2018-09-05 银行安全控件原理研究背景正文结语

https://blog.csdn.net/Bone_ACE/article/details/80765299

背景

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

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

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

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

正文

我的尝试

  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 更新用户界面。

image.png

(摘自2013年《键盘输入安全研究》)

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

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

image.png

如上图所示,AcitveX 安全控件的防护原理如下: 1、 当用户将输入焦点定位到安全控件上,准备进行口令输入时,激活相应安全控件。 2、用户通过敲击键盘上的字符,产生相应的电信号。触动操作系统的相应的中断 IRQ。 3、操作系统调用键盘驱动解释相应电信号所代表的字符,并进行相应的数据加密。将驱动解释出来的字符发送到操作系统消息队列中。 4、安全控件将接收到的密文保存在控件内的私密控件中,然后在界面上显示星号(*),并且停止字符的继续传播。 5、当用户点击网页上的登录提交按钮时,安全控件中被通知执行提交动作。安全控件动态将已加密的口令内容添加到页面中要提交的表单中,然后提交表单。 6、IE 将表单中的数据通过 HTTPS 通道传送到服务器,进行相应的处理工作。 依靠微软的驱动,先于用户态下和核心态上层的病毒和木马程序(如 hook 和篡改 SSDT、系统服务 API)获取到键盘输入,以杜绝病毒和木马程序获取到键盘输入。。。 摘自论文《银行网上支付发展研究》,张春鹤,2010年。

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

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

结语

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

题外话

近日群里都在说去年的一个裁判文书,爬虫被告,法人坐牢一年。

image.png

嗯,又一个爬虫案。

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ThoughtWorks

无障碍性测试工具 Pa11y|技术雷达

A11y(Accessibility)指的是用来帮助身心障碍者(残疾人)更加便利的使用先进技术的能力。目前世界上主要由各种人权组织和政府通过一些民间规则和政府规...

3085
来自专栏十月梦想

Vue-router从入门到弃坑

html页面(依次引入vue.js,router.js以及个人配置的app.js)

4143
来自专栏JAVA高级架构

网站性能优化实战——从12.67s到1.06s的故事

2043
来自专栏H2Cloud

Base PyQt4, Simple Web APP Framwork

  长时间以来,一直针对Linux 服务器开发后台程序,每天面对的是黑框框,输出只有日志文件。偶尔需要模拟客户端测试,要么是写几行php代码,在浏览器上点一点,...

4094
来自专栏张善友的专栏

MongoDB 客户端 MongoVue

今天在同事那里看到了一个很不错的MongoDB的客户端工具MongoVue,地址是http://www.mongovue.com/。做的不错,1.0版本的开始收...

5185
来自专栏静晴轩

Win下必备神器之Cmder

诚言,对于开发码字者,Mac和Linux果断要比Windows更贴心;但只要折下,Windows下也是有不少利器的。之前就有在Windows下效率必备软件一文中...

9044
来自专栏知晓程序

如何用 24 小时,开发一款阴阳师小程序?

1604
来自专栏架构师之路

微信钱包中58到家首页为什么这么快

原文标题《前后端分离和模块化-58到家微信首页重构之路》【深度前端干货】 微信钱包内的58到家全新首页已经上线,感兴趣的同学们可以在微信中打开“我的->钱包->...

3107
来自专栏张戈的专栏

清点下博客的插件以及我对WordPress插件的看法

最近,群里又讨论到了关于插件数量的问题,张戈博客的插件不多不少,正好 9 个。个人认为这些插件是目前博客所必需的,或者功能性价比很高的,下面就来晒一晒: 一、S...

2999
来自专栏沈唁志

jQuery等静态资源使用公共库CDN及回退地址

2414

扫码关注云+社区