剧透:就是使用了一下 Chrome DevTools 的 Memory 功能,通过已知的 JS 变量的值查找 JS 内存中变量的引用

# 一:不分析一下现有的网页翻译方法么?

总所周知,(As is well known to us all,)谷歌的网页翻译很强大,根据我的使用经验谷歌有五个途径进行网页翻译:

1. 使用 Chrome 的《翻译此页》功能:这是唯一没有被墙的方法直接就能用,但无法显示原文
2. 使用 google 翻译的网页翻译:这个方法可以显示原文(并且原文直接加到了 dom 里)并且处理起来方便,但这种方法不好调用且复杂的页面会乱掉(因为翻译时是将页面下载到 google 后台翻译,然后由 google 后台将页面返回)
3. 《本次使用的方法》使用 google 网站翻译器:这个方法可以显示原文并且调用方便,但原文在 JS 深处(后面会写)
4. 使用译者翻译工具:网页放到这里翻译后完全是乱的,但愿以后能好用
5. 使用付费的 google 翻译:暂时没有试过,不知道能不能处理复杂的网页标签嵌套

经过挺长时间的分析我最后选择了《使用 google 网站翻译器》进行翻译,现在要解决的就是获取到原文

# 二:不分析一下使用 google 网站翻译器翻译后的网页的原文可能存放的位置么?

好长的标题。。

可能存在的位置:

1. DOM 树中?:F12->Elements->Ctrl+F-> 输入原文查找。没有找到,不在 DOM 树中保存。
2. 本地存储中?:F12->Application-> 查看 Local Storage 等。没有找到,不在本地存储中保存。
3. 服务器上?:虽然一像就不可能,但还是看了一下,F12->Network-> 鼠标移到文字上看看显示原文是有网络请求没。没有网络请求,不在服务器上。
4. iframe 中?:没有。。
5. 文件上?:你是在逗我?
6. JavaScript 内存中?:没的跑,一定在这里了。(这个虽然是最有可能的,但因为我之前就尝试找过浪费好久也没找到,所以这回我先排除了其他可能,确定在 JS 内存中再进行专攻)

# 三:不想法找到 JS 内存中的变量么?

一开始我是尝试使用 Source 逆向《element_main.js》,但《element_main.js》过于复杂最后决定换方法。

然后我决定递归遍历 window 对象

function TraversalObject(obj)
{
for (var i in obj) {
if (typeof (obj[i]) == "object") {
console.log('===recursion===',i)
TraversalObject(obj[i]); //递归遍历
}
else {
console.log(i)
}
}
}
TraversalObject(window);

然后到 frames 死循环了(貌似这种无限的递归引用有很多)

那么,有一款可以查找 JS 内存中的变量的的器么?
当然有!!!Chrome DevTools 的 Memory 就可以轻松查找到 JS 内存中的变量!!!

# 四:不使用 Chrome DevTools 的 Memory 来查找 JS 内存中的变量么?

1. 翻译后创建快照
![翻译后创建快照](https://note.youdao.com/yws/api/personal/file/5FE321FCA9194DB3A230142F4144BD7A?method=download&shareKey=eb7a1b4f76fcfb6e33a47c4525e433e6)

2. Ctrl+F 在快照中查找字符串,将找到的该值的引用按距离 GC 根的距离升序排列(该值的引用为`window.closure_lm_452827.a.focus[0].Hd.o[9].l[0]`)
![image](https://note.youdao.com/yws/api/personal/file/11558711666341ADB26C8606749D5B1B?method=download&shareKey=1fc113469534c5bd65c855691d0f0941)

3. 原文的引用为`window.closure_lm_452827.a.focus[0].Hd.o`这个数组
![image](https://note.youdao.com/yws/api/personal/file/54D332E924EE481A8247CE95307A3FC3?method=download&shareKey=782e0c4f042208b454415eae4275f651)

4. 进一步测试使用`window.closure_lm_《数字》.a.focus[0].Hd.ia.c`这个数组可以获取到原文,译文,原文对应的译文的 DOM。使用这个数组就可以达到我保存网站翻译结果的需求了。可喜可贺!可喜可贺!
![image](https://note.youdao.com/yws/api/personal/file/D381EA24FA4248B4AB2E17470A8DCA39?method=download&shareKey=8935de64e7820d744fe81966ef30a4f9)

# 五:不看看花絮么?

Source 调试过程:

1. 查看 DOM 发现上面没挂事件
2. Global Listeners 查看 blur 和 focus,发现《element_main.js》中注册了这个事件
3. 使用 {} 美化《element_main.js》
4. 进行偷税的调试

通过 Source 调试《element_main.js》时我发现她的执行的过程是:

1. 鼠标移动到翻译后的文字上执行一堆代码后将这句话高亮(这句话包含的 font 标签依次高亮)
2. popup 中的文字替换成原文
3. 显示 popup

Chrome-逆向分析JS-1分析google网站翻译器原文存放位置的更多相关文章

  1. 使用Chrome逆向分析JS实战---分析google网站翻译器原文存放位置

    剧透:就是使用了一下Chrome DevTools的Memory功能,通过已知的JS变量的值查找JS内存中变量的引用 一:不分析一下现有的网页翻译方法么? 总所周知,(As is well known ...

  2. js基础之javascript的存在形式和js代码块在页面中的存放位置和 CSS 对比

    1.存在形式 文件 如: <script src='js/jc.js'></script> 前页面 <script type='text/javascript'>a ...

  3. javascript基础之javascript的存在形式和js代码块在页面中的存放位置

    1.存在形式 文件 如: <script src='js/jc.js'></script> 前页面 <script type='text/javascript'>a ...

  4. chrome使用Timeline做性能分析

    使用Timeline做性能分析 Timeline面板记录和分析了web应用运行时的所有活动情况,这是研究和查找性能问题的最佳途径.###Timeline面板概览 Timeline面板主要有三个部分构成 ...

  5. 高德JS依赖分析工程及关键原理

    一.背景 高德 App 进行 Bundle 化后,由于业务的复杂性,Bundle 的数量非常多.而这带来了一个新的问题——Bundle 之间的依赖关系错综复杂,需要进行管控,使 Bundle 之间的依 ...

  6. 分析app和wap手机网站的不同

    随着手机3G.4G时代的到来,手机功能的越来越强大,手机App的市场是越来越火爆,时代在更新随之而来的事物也在更新,不能更上时代的步伐是落后的表现,所以不仅仅是手机APP在完善,手机网站WAP也在不断 ...

  7. Chrome Developer Tools之内存分析

    可参考: Chrome Developer Tools之内存分析 http://www.kazaff.me/2014/01/26/chrome-developer-tools%E4%B9%8B%E5% ...

  8. JS 数据类型分析及字符串的方法

    1.js数据类型分析 (1)基础类型:string.number.boolean.null.undefined (2)引用类型:object-->json.array... 2.点运算  xxx ...

  9. 逆向与分析-WebBrowserPassView消息分析

    逆向与分析-WebBrowserPassView消息分析 这个的源头是之前我写的一个博客: http://blog.csdn.net/u013761036/article/details/730427 ...

随机推荐

  1. IIS网站绑定域名

    你新建的网站右键-->编辑绑定-->添加 -->类型:http,IP地址:全部未分配,端口号:80,主机名:你的域名,例如yangche.cn-->确定

  2. python3 -tensorflow-dataset 之map函数 lambda隐函数的应用

    ###隐函数lanbda及map函数的应用实例 ''' lambda 参数1,参数2,参数3,...:表达式 ''' f = lambda x,y :x+y print(f(1,2)) ###输出3 ...

  3. Arrays -数组工具类,数组转化字符串,数组排序等

    package cn.learn.basic; import java.util.Arrays; /* java.util.Arrays是一个与数组相关的工具类,含有大量静态方法,用来实现数组常见的操 ...

  4. 从0 开始手写一个 RPC 框架,轻松搞定!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 来源:juejin.im/post/5c4481a4f265da613438aec3 之前在 RPC框架底层到底什么原理得知 ...

  5. js中的对象类型的基本操作

    示例 /** * 对象属于一种复合数据类型,在对象中可以保存多个不同数据类型的属性 * 对象的分类: * 1.内建对象 * - 由ES标准定义的对象,在任何ES的实现中都可以使用,比如:Math, * ...

  6. swiper轮播图设置每组显示的个数及自定义slide宽度

    一.html演示代码: <div class="swiper-container"> <div class="swiper-wrapper"& ...

  7. 2018-8-10-win10-UWP-发邮件

    title author date CreateTime categories win10 UWP 发邮件 lindexi 2018-08-10 19:17:19 +0800 2018-2-13 17 ...

  8. iconfont图标symbol引用方式,有的图标不能通过设置color样式来修改颜色的解决办法

    现象:iconfont安装后的图标,是通过symbol引用方式,有的图标不能通过color修改颜色的解决办法,有的又可以. <svg class="icon" aria-hi ...

  9. django允许外部访问 项目后台不挂断运行

    1关闭防火墙 1 service iptables stop 2设置django 1 2 3 4 5 6 7 8 9 10 11 开开启django时,使用0.0.0.0:xxxx,作为ip和端口例如 ...

  10. 为什么集合类没有实现Cloneable和Serializable接口?

    为什么集合类没有实现Cloneable和Serializable接口? 克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的.因此,应该由集合类的具体实现来 ...