Java爬虫(四)-- java 调用js函数 模拟页面js密码加密(附几个知识点)

前言

前面一章讲的是模拟登录,留了一个模拟密码加密还没讲。

因为这一过程的调试探索还是蛮多内容的,我更倾向于记录自己整个探索的过程,而不是把工具拿出来讲一下用法,所以单独拿一章来讲。

调试过程

首先,既然要模拟js的加密过程,当然是要调试前端代码,从定位到起加密作用的js代码上面。

F12浏览器调试时,source目录下可以看到当前的浏览器的一些静态文件,包括页面,css,js等文件,一开始先定位到点击登录按钮之后,肯定会执行的js代码,然后在那个上面打断点。

像我要爬取的网站,会根据你所使用的浏览器使用不同的加密算法,所以要通过调试,知道它到底是怎么加密的。

打了断点之后,我成功找到了加密的代码,

image

可以看到起加密作用的就是ciper.Enrypt()方法。把鼠标放在上面,点击如图所示出现的悬浮小窗里面的Enrypt(a,b),就跳到对应的js文件里面。

这里就有一个很神奇的东西了,跳到的js文件并不在我source目录中,而是一个VM+"一串数字"的js中。

查询了去Stack Overflow上面查了之后,看到了如下回答

[VM] (scriptId) has no special meaning. It's a dummy name to help us to distinguish code which are not directly tied to a file name, such as code created using eval and friends.

VM是虚拟机(Virtual Machine)的缩写,后面的数字是代码的编号ID,主要是为了区别原网页的js与其他来源的js(比如eval创建的, ajax获取的等)

也就是说这个加密的js是动态加载出来的。

定位到js之后,接下去就是怎么模拟了。

ScriptEngine

加密算法,可以说是非常复杂,所以不可能用java语言去模拟。就想着能不能在jvm上运行js的文件,这么一搜,还真有。

java中的javax.script,它开始存在于JDK1.6,它可以解析通用的表达式,如三目,还可以利用js函数语法,创造一个就像java的函数一样存在于内存中随时可以被调用的函数,更可以将js中的对象直接转换成java对象。

到了java8 之后 叫做 Nashorn JavaScript 引擎。扩展了很多功能。

只不过这里面我们只使用它加载js文件,调用js中函数的功能,其他功能有兴趣的可以自己去了解一下。

先介绍下基础用法

在Java中直接调用js代码

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
/**  * 直接调用js代码  */
public class ScriptEngineTest {
    public static void main(String[] args) {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("javascript");
          try {
            engine.eval("var a=3; var b=4;print (a+b);");
          } catch (ScriptException e) {
              e.printStackTrace();
          }
      }
}

Java中调用js文件中的function,传入调用参数,并获取返回值

// demo.js
function count(a, b) {   
     c = a * b;   
     return c;   
}  

在Java代码中读取js文件,并参数两个参数,然后回去返回值

 import java.io.FileReader;    
 import javax.script.Invocable;  
 import javax.script.ScriptEngine;  
 import javax.script.ScriptEngineManager;    

 public class ScriptEngineTest {     
     public static void main(String[] args) throws Exception {     
        ScriptEngineManager manager = new ScriptEngineManager();     
        ScriptEngine engine = manager.getEngineByName("javascript");      
         String jsFileName = "demo.js";    
         // 读取js文件     
        FileReader reader = new FileReader(jsFileName);     
        // 执行指定脚本    
         engine.eval(reader);     
        if(engine instanceof Invocable) {     
             Invocable invoke = (Invocable)engine;      
            // 调用count方法,并传入两个参数     
             Double c = (Double)invoke.invokeFunction("merge", 2, 3);     
             System.out.println("c = " + c);     
        }     
    reader.close();   
 }   
} 

实战

了解了前面的基础知识和简单热身后,我这个问题就简单了。我浏览器上调试显示的js拷贝出来新建了一个js文件,放到resource目录下,用ScriptEngine去加载,把明文密码和公钥当做变量传进去调用js 中的function,这就好像是黑箱,我不需要知道里面的加密互相调用是怎么样。

这里有一个坑注意一下:ScriptEngine执行js代码或者js文件的时候,被调用的代码中如果引用了浏览器中存在的对象,就会报错。比如alertnavigator之类的。

ReferenceError: "xxx" is not defined

原因显而易见,这个对象在你的脚本引擎中没有定义。

我在解决这个问题的时候,先是看了一下有哪些对象,这些对象具体起了什么作用。

看了之后发现,都是起着兼容性的作用,不同浏览器版本就会用不同的变量值或者说调用不同的加密方法。我就直接删去了里面兼容性判断部分的代码,给一些变量值指定了定值。最后就起到了同样的效果。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • 天宝十四年,是唐朝需要铭记的一年。面对安史叛军,临危受命的高仙芝领兵御敌,却落了个斩首于潼关城内的结局,大...
    一笔一印记阅读 225评论 0 0
  • 前天发生一件事,我发现我不会买东西了。 事情的起因是我想给车子贴隔热膜,当我有这个想法时,我在脑海里搜索一圈附近的...
    屈菲阅读 190评论 0 1
  • 我是真的该写点儿什么了,不然专业朝那里走,自身的价值在哪里体现,当别人都手握利器前行无忧时,我在做什么,浪费自己余...
    梦在我心梦语中阅读 221评论 0 2
  • 周末回这个小镇,突然想到大学时候 裴同志鼓励我英勇地向初中男同学告白 寒风中,我一颗少女心碎了一地啊 说来也是奇怪...
    NiPai阅读 174评论 0 0