专栏首页Albert陈凯2018-09-05 银行安全控件原理研究背景正文结语

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 条评论
登录 后参与评论

相关文章

  • 2018-10-14 Chrome 不自动填写密码了 autofill not work

    我照着这个里面的方案试验了一次 https://www.v2ex.com/t/255542

    Albert陈凯
  • 2018-10-28 String.valueOf(null) 会报空指针异常

    https://stackoverflow.com/questions/4042675/why-string-valueofnull-is-causing-nu...

    Albert陈凯
  • 2019-02-12 Chrome 又不能自动登录了,每次都要找方法麻烦

    Albert陈凯
  • Solution for wear-leveling

    Flash is a type of electrically-erasable programmable read-only memory (EEPROM) ...

    anytao
  • 使用Python和IBM Watson可视化的个性简介

    伟大的社会心理学家James Pennebaker曾经说过:“通过更仔细地观察人们用语言表达思想的方式,可以开始了解他们的个性,情感和与他人的关系。”他和许多其...

    代码医生工作室
  • C++核心准则R.31:如果需要实现标准库以外的智能指针,遵照标准库中的基本模式​

    The rules in the following section also work for other kinds of third-party and ...

    面向对象思考
  • C#学习系列之人脸识别控制台接口调用

    要想使用C#的人脸识别控制台,对于没有使用过的朋友,可能会遇到比较多的坑,所以我这里就先去踩了坑,趁着这段时间,把能直接运行的步骤告诉大家。

    算法发
  • Baozi Training Leetcode solution 274: H-Index

    从growth at all cost 到profitability mindset,都是被Uber Wework 弄得。软银老板Masa的头发估计又得脱落几根...

    包子面试培训
  • 丽江古城数字小镇建设即将起航

    ? 有人说,人活一辈子一定要去趟丽江,小桥流水的清静生活,是很多人梦寐以求的。 穿着花布鞋踏在石板路上,让人感到前所未有的轻松和愉悦。 ? 丽江,成为了许多...

    腾讯文旅
  • Jenkins Tips 002: 处理Shell返回字符串为数组

    想通过 Shell 先对数据进行处理,然后返回到 Jenkins pipeline 里,但只能得到 Shell 返回的字符串,因此需要在 Jenkinsfile...

    Peter Shen

扫码关注云+社区

领取腾讯云代金券