JS逆向-国税增值税发票查询平台的漫漫过程

一、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的值进行判断

 这里还有个小坑要踩一踩,原以为到这里就算结束了,事实上不是,发票信息结果里面还有玄机,仔细一看,购买方名称与销售方名称时不时要颠倒顺序,原因就在下面这段代码里。

 最后的成品:

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值