Month: 6月 2019

构建最小版本的 Chrome

构建最小版本的 Chromium

为什么需要 Chrome 浏览器渲染

  1. 动态 ajax 页面
  2. 页面编码异常或者结构过甚,lxml 无法解析 dirty page examples:
    1. 页面的 style 在 html 外面,并且有黏贴的 Word 文档。http://gzg2b.gzfinance.gov.cn/gzgpimp/portalsys/portal.do?method=pubinfoView&&info_id=-2316ce5816ab90783eb-720f&&porid=gsgg&t_k=null
    2. 有好多个 html 标签,并且编码不一致。http://www.be-bidding.com/gjdq/jingneng/show_zbdetail.jsp?projectcode=1180903010&flag=3&moreinfo=true

    优化方案

    1. 不加载图片和视频,但是保留占位
    2. 使用 proxy api 更改代理
    3. 禁用 H5 相关 API
    4. 删除 ICU 相关

    参考文献

    1. https://peter.sh/experiments/chromium-command-line-switches/
    2. https://joydig.com/port-chromium-to-embedded-linux/
    3. Android 上的 Chrome 裁剪,值得借鉴。https://blog.csdn.net/mogoweb/article/details/76653627
    4. 架构图 https://blog.csdn.net/mogoweb/article/details/76653627
    5. webkit 架构图 https://blog.csdn.net/a957666743/article/details/79702895
    6. Chrome proxy API https://developer.chrome.com/extensions/proxy
    7. Chrome 嵌入式裁剪,直击底层 https://joydig.com/category/chromium/
    8. 官方构建教程 https://chromium.googlesource.com/chromium/src/+/master/docs/linux_build_instructions.md
    9. 编译选项https://blog.csdn.net/wanwuguicang/article/details/79751503

几个新一代命令行工具

新一代命令行工具的特点是语法简单,符合直觉。他们大多使用 rust 或者 go 编写。

duf

显示磁盘信息的工具 https://github.com/muesli/duf

dust

https://github.com/bootandy/dust

sd

sd 可以替代 sed。sd 是使用 rust 编写的,所以使用的正则引擎和你在 JS 和 Python 中熟悉的正则引擎是一致的,也就不需要各种奇奇怪怪的转义了。sd 还具有字符串模式,也就是关闭正则表达式,这也避免了一些转义的工作量。

安装

# 首先安装 rust,如果没有安装的话
~$ curl https://sh.rustup.rs -sSf | sh
~$ cargo install sd

使用

# 和 sed 的对比:
sd: sd before after
sed: sed s/before/after/g

# 字符串模式,-s 开启,可以看到括号就是括号
> echo 'lots((([]))) of special chars' | sd -s '((([])))' ''
lots of special chars

# 默认是正则模式
> echo 'lorem ipsum 23   ' | sd '\s+$' ''
lorem ipsum 23

# 使用正则分组
> echo 'cargo +nightly w

choose

用于替代 cut 和 awk(一部分)
https://github.com/theryangeary/choose

procs

用于替代 ps

https://github.com/dalance/procs

rga

RipGrepAll

https://github.com/phiresky/ripgrep-all

jq

jq 是一个用于处理 json 的小工具,非常趁手。

https://github.com/denisidoro/navi

unidbg 教程

介绍

unidbg 是一个基于 unicorn 的逆向工具,可以黑盒调用安卓和 iOS 中的 so 文件。unidbg 是一个标准的 java 项目。

由于现在的大多数 app 把签名算法已经放到了 so 文件中,所以要想破解签名算法,必须能够破解 so 文件。但是我们知道,C++ 的逆向远比 Java 的逆向要难得多了,所以好多时候是没法破解的,那么这个时候还可以采用 hook 的方法,直接读取程序中算出来的签名,但是这样的话,需要实际运行这个应用,需要模拟器或者真机,效率又不是很高。

unidbg 就是一个很巧妙地解决方案,他不需要直接运行 app,也无需逆向 so 文件,而是通过在 app 中找到对应的 JNI 接口,然后用 unicorn 引擎直接执行这个 so 文件,所以效率也比较高。

工具

逆向三剑客,unicorn,keystone,capstone,以及 unicorn_java

  1. capstone 反编译框架
  2. unicorn 基于 QEMU 的模拟器

Unicorn 介绍

基础介绍

比如我们单纯只是需要模拟代码的执行而非需要一个真的CPU去完成那些操作, 又或者想要更安全地分析恶意代码, 检测病毒特征, 或者想要在逆向过程中验证某些代码的含义. 使用CPU模拟器可以很好地帮助我们提供便捷.

Java 基础

由于好久没用 java了,一直都用 Python 比较多,先回忆一下需要用到的 java 知识。

java -D 用于指定参数。比如 -Djava.library.path=xxx.so

-cp 用于指定 classpath

Java 中加载 so 文件。

  1. 使用 System.load(String) 可以加载 so 文件
  2. 使用 java.library.path 指定路径
  3. java.library.path 会默认从 LDLIBRARYPATH 中读取

Unsatisfied linked error 的解决

一般是由于缺少库导致的,到作者的帖子中下载对应的

Maven 项目介绍

https://www.cnblogs.com/now-fighting/p/4858982.html

未完待续

参考

  1. 加载 jar 包中的动态库
  2. java 的 -D 选项
  3. java.library.path
  4. unidbg: 作者原贴
  5. unicorn 基础教程,强烈推荐 (https://bbs.pediy.com/thread-225018.htm)
  6. 包含 C 代码的 unicorn 教程英文, 中文
  7. Unicorn 教程 (https://ctf-wiki.github.io/ctf-wiki/reverse/unicorn/introduction/)
  8. unicorn 原理介绍,必读 (https://zhuanlan.zhihu.com/p/30612805)
  9. 逆向常用工具合集 (https://5alt.me/wiki/%E9%80%86%E5%90%91)
  10. unicorn 的流程图
  11. [https://o0xmuhe.github.io/2018/01/15/Unicorn-Engine%E5%88%9D%E4%BD%93%E9%AA%8C/]
  12. pwn tools http://docs.pwntools.com/en/stable/

使用 dokuwiki

为什么说创业团队更需要内部wiki分享

团队之间合作更紧密
操作越来越规范化
要慢慢的学会分享
每个人要在这个阶段学会写技术文档,养成好习惯
大神都是不断积累出来的
以后进了大公司你会发现 那里面wiki不一定都比你现在的wiki好

dokuwiki 默认没有带移动页面的功能,需要安装 move pages 插件。https://blog.csdn.net/wszll_Alex/article/details/80252132

Python 和 JavaScript 语法对比

命名

  1. 注意使用驼峰变量名,不要使用下划线变量名

字符串

格式化

JavaScript:

`hello ${name}`

Python:

f"hello {name}"

文件

打开文件:

JavaScript:

const fs = require(fs).promises;  // 使用 async/await 版本的 fs 模块

await fs.writeFile(filename, data);  // 写入文件

// 文件是否存在
try {
  await fs.stat(filename)
  exitst = true
} catch (e) {
  exists = false
}

Python:

with open(filename, w) as f:
    f.write(data)

os.path.exists(filename)  # 文件是否存在

数组

切片:

JavaScript:

const arr1 = arr2.slice(3, 5);

Python:

arr1 = arr2[3:5]

暂时放弃 vim

使用 vim 也有四五年了,但是现在感觉 vim 还是造成了一些效率低下的情形。主要是对于各种功能支持不全,比如说

  1. 补全功能,总是不完全好用,而且标准库的文档也弹不出来,每个语言也不统一。
  2. 第三方插件支持不统一,比如说 tagbar 支持不了 TypeScript

2019-08 更新,vscode 总是把机器 hang 住,滚回 vim 了
2021-04 更新,tabnine 的自动补全还是不理想,又滚回 vscode 了

当然,不管是用什么编辑器,最常用的插件还是 vim-mode