一、2019年下半年,因为工作需要,有大量增值税发票需要查询真伪,而且是每张必查,当时还不太懂爬虫原理,就用“C#+大漠插件+全球鹰验证码识别"写了个类似于按键精灵那样的桌面应用程序,批量查询发票,用了近三个月,效果很满意。后来由于工作变动,不再需要查询,就没有去维护,就这样放弃了;
二、2021年底,有同事问我能不能做个批量查询工具,顺口就应承下来了。
1、花了近一个月的时间,学习《编辑原理》,开始感觉太抽象,就反复听,反复看书,整一个月,一有空,就听视频、看教材,似乎明白了一点点原理,但离理解还差太远。
推荐视频:国防科技大学-编译原理(国家级精品课)高清流畅_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11t411V74n?p=2&spm_id_from=pageDriver
2、花了近半个月的时间,学习babel插件。
推荐学习资料:Babel 插件通关秘籍 - zxg_神说要有光 - 掘金小册 (juejin.cn)
JS逆向:AST还原极验混淆JS实战 (qq.com)
3、稍微懂了一点点编辑原理的皮毛,再加上了解了一点babel插件的用法,就不知天高地厚地开始了国税增值税发票查询平台的逆向过程。虽然结果还满意,但过程确实很艰辛,个中曲折就不说了。
第一步:过无限debugger似乎不难,无需多说; 第二步:拿到所有js源码文件。过了debugger,拿到js源码应该也不难第三步:因为无法调试,只能先还原JS源码,用babel插件还原
const parser = require('@babel/parser')
const traverse = require('@babel/traverse').default
const t = require('@babel/types')
const generator = require('@babel/generator').default
const fs = require('fs')
var newAst = null;
let jscode = fs.readFileSync(__dirname + '/source/90a1c.js', {
encoding: 'utf-8',
})
let ast = parser.parse(jscode);
hexUnicodeToString(ast); //将所有十六进制编码与Unicode编码转为正常字符
addArrFuncToMemory(ast); //将数组、公用函数添加到内存中
funcToStr(ast); //解密函数实现
var totalObj = {}; //定义一个空对象,用于存放字符串花指令对象
ast = generatorObj(ast); //将字符串花指令对象 写入到totalObj 对象中
changeJunkCode(ast); //遍历花指令对象中的值 ,如果是字符串,则不变,如果不是,则 //在 totalObj 中对象中找到相应的值进行替换,直至为字符串
ast = generatorObj(ast);
changeLastJunkCode(ast); //将对象引用中的字符串花指令转换为对象的字符串
ast = generatorObj(ast);
changeJunkFuncCode(ast); //遍历花指令对象中的值 ,如果是字符串,则不变,如果不是,则在 totalObj 中对象中找到相应的函数进行替换,直至为字符串
ast = generatorObj(ast);
changeLastJunkFuncCode(ast); //将对象引用中的函数花指令转换为对象的字符串
//removeJunkCode(ast); //移除花指令
//changeObjectAccessMode(ast); //对象['属性'] 改为对象.属性
//switchFlat(ast); // 处理switch混淆
let { code } = generator(ast, opts = { jsescOption: { "minimal": true } });
fs.writeFile(__dirname + '/result/new_90a1c.js', code, (err) => { })
第四步: 挂上fiddler的AutoResponder ,就可以自由调试前端代码了
第五步:找到关键代码处理(验证码参数来源、查验提交参数的来源) 第六步:把 js代码扣出来,形成一个独立的js文件
获取验证码参数中的 key9 flwq39 注意callback参数后面的时间戳,这里有个坑,处理不好,查询不了几张发票就让你出错
获取发票信息参数中的key9 flwq39
做到这一步,基本上就可以拿到发票信息了,剩下的,就是对结果进行判断了,主要是key1的值进行判断
这里还有个小坑要踩一踩,原以为到这里就算结束了,事实上不是,发票信息结果里面还有玄机,仔细一看,购买方名称与销售方名称时不时要颠倒顺序,原因就在下面这段代码里。
最后的成品:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)