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

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

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

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

 最后的成品:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/730336.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存