{
    "version": "https://jsonfeed.org/version/1",
    "title": "做个俗人  贪财好色",
    "subtitle": null,
    "icon": "https://winston950213.github.io/images/favicon.ico",
    "description": "终是庄周梦了蝶 亦是情缘亦是劫",
    "home_page_url": "https://winston950213.github.io",
    "items": [
        {
            "id": "https://winston950213.github.io/2022/11/04/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%8F%8D%E9%80%89/",
            "url": "https://winston950213.github.io/2022/11/04/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%8F%8D%E9%80%89/",
            "title": "正则表达式反选",
            "date_published": "2022-11-04T06:49:43.000Z",
            "content_html": "<p>正则表达式骚操作之反选</p>\n<p><span id=\"more\"></span></p>\n<h2 id=\"search-函数判断是否为-none\"><a class=\"anchor\" href=\"#search-函数判断是否为-none\">#</a> search 函数判断是否为 None</h2>\n<ul>\n<li>在有些时候我们使用 re 中的 search 的时候往往需要判断 search 里面的正则表达式是否为 None; 以前都是  <code>if ...else....</code>  ; 这样当我们的正则表达式很长的时候写起来就和屎一样难看，虽然难看，但还是写了没办法～</li>\n<li>现在使用 bool () 就可以直接把 search 结果转换为 true or flase 可以直接判断 -----&gt;</li>\n</ul>\n<figure class=\"highlight text\"><figcaption data-lang=\"text\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>bool(re.search(\"hi\", \"abcdefghijkl\"))</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>True</pre></td></tr><tr><td data-num=\"3\"></td><td><pre></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>bool(re.search(\"hi\", \"abcdefgijkl\"))</pre></td></tr><tr><td data-num=\"5\"></td><td><pre>False</pre></td></tr></table></figure><h2 id=\"正则表达式反选\"><a class=\"anchor\" href=\"#正则表达式反选\">#</a> 正则表达式反选</h2>\n<p>示例：</p>\n<p>需要匹配出来 h1 标签 ps: 在实际开发中使用 h1 直接匹配太繁琐 so: 使用？！进行反选<br />\n <code>&lt;(?!div).\\*?text-align: center.\\*?/(?!div).\\*?&gt;</code></p>\n",
            "tags": [
                "操作备忘",
                "tips",
                "正则"
            ]
        },
        {
            "id": "https://winston950213.github.io/2022/11/04/git%E6%8A%A5%E9%94%99%EF%BC%9A-fatal-remote-origin-already-exists/",
            "url": "https://winston950213.github.io/2022/11/04/git%E6%8A%A5%E9%94%99%EF%BC%9A-fatal-remote-origin-already-exists/",
            "title": "git报错：'fatal:remote origin already exists'",
            "date_published": "2022-11-04T06:47:04.000Z",
            "content_html": "<p>只要两步，解决  <code>fatal:remote origin already exists</code></p>\n<p><span id=\"more\"></span></p>\n<ol>\n<li>先删除<br />\n <code>$ git remote rm origin</code></li>\n<li>重新添加<br />\n <code>git remote add origin git@github.com:username/repostery.git //关联本地仓库，远程库的名字为origin</code></li>\n</ol>\n",
            "tags": [
                "操作备忘",
                "bug",
                "git"
            ]
        },
        {
            "id": "https://winston950213.github.io/2022/11/04/win10%E5%AE%89%E8%A3%85mitmproxy%E6%8A%A5%E9%94%99-Failed-building-wheel-for-brotlipy/",
            "url": "https://winston950213.github.io/2022/11/04/win10%E5%AE%89%E8%A3%85mitmproxy%E6%8A%A5%E9%94%99-Failed-building-wheel-for-brotlipy/",
            "title": "win10安装mitmproxy报错'Failed building wheel for brotlipy'",
            "date_published": "2022-11-04T06:43:19.000Z",
            "content_html": "<p>缺什么装什么</p>\n<p><span id=\"more\"></span></p>\n<p>到这个网址下载 whl 文件，带路径安装</p>\n<p><span class=\"exturl\" data-url=\"aHR0cDovL3d3dy5sZmQudWNpLmVkdS9+Z29obGtlL3B5dGhvbmxpYnMvI2x4bWw=\">Unofficial Windows Binaries for Python Extension Packages</span></p>\n<p><code>pip install xxx.whl</code></p>\n",
            "tags": [
                "操作备忘",
                "bug",
                "mitmproxy"
            ]
        },
        {
            "id": "https://winston950213.github.io/2022/11/04/win10%E5%AE%89%E8%A3%85mitmproxy%EF%BC%8C%E6%88%90%E5%8A%9F%E4%B9%8B%E5%90%8E%E8%AE%BF%E9%97%AEmitm-it%E5%87%BA%E7%8E%B0%E4%B8%8D%E4%BA%86%E4%B8%8B%E8%BD%BD%E8%AF%81%E4%B9%A6%E9%A1%B5%E9%9D%A2/",
            "url": "https://winston950213.github.io/2022/11/04/win10%E5%AE%89%E8%A3%85mitmproxy%EF%BC%8C%E6%88%90%E5%8A%9F%E4%B9%8B%E5%90%8E%E8%AE%BF%E9%97%AEmitm-it%E5%87%BA%E7%8E%B0%E4%B8%8D%E4%BA%86%E4%B8%8B%E8%BD%BD%E8%AF%81%E4%B9%A6%E9%A1%B5%E9%9D%A2/",
            "title": "win10安装mitmproxy，成功之后访问mitm.it出现不了下载证书页面",
            "date_published": "2022-11-04T06:41:09.000Z",
            "content_html": "<p>浏览器代理老问题</p>\n<p><span id=\"more\"></span></p>\n<h3 id=\"错误重现\"><a class=\"anchor\" href=\"#错误重现\">#</a> 错误重现</h3>\n<p>所有都安装好之后，各种检测都通过时候依旧出现不了证书下载页面。</p>\n<p>此时检测一下浏览器或者计算机是否使用了代理【我就是因为使用了谷歌上网助手而导致不成功的 =-=】</p>\n<h3 id=\"解决方法\"><a class=\"anchor\" href=\"#解决方法\">#</a> 解决方法</h3>\n<p>关闭所有代理工具，使用系统代理</p>\n<h3 id=\"插件推荐\"><a class=\"anchor\" href=\"#插件推荐\">#</a> 插件推荐</h3>\n<p>使用 SwitchyOmega 是所有流量切换到固定端口，监听此端口</p>\n<p>SwitchyOmega: 一个强大的代理切换工具 (官方自述)</p>\n",
            "tags": [
                "操作备忘",
                "bug",
                "mitmproxy",
                "代理",
                "证书"
            ]
        },
        {
            "id": "https://winston950213.github.io/2022/11/04/Ubuntu%E5%AE%89%E8%A3%85curl%E6%8A%A5%E9%94%99%EF%BC%9A%E8%BD%AF%E4%BB%B6%E5%8C%85%E6%9C%89%E6%9C%AA%E6%BB%A1%E8%B6%B3%E7%9A%84%E4%BE%9D%E8%B5%96%E5%85%B3%E7%B3%BB%EF%BC%9A-curl-%E4%BE%9D%E8%B5%96-libcurl4-7-58-0-2ubuntu3-10/",
            "url": "https://winston950213.github.io/2022/11/04/Ubuntu%E5%AE%89%E8%A3%85curl%E6%8A%A5%E9%94%99%EF%BC%9A%E8%BD%AF%E4%BB%B6%E5%8C%85%E6%9C%89%E6%9C%AA%E6%BB%A1%E8%B6%B3%E7%9A%84%E4%BE%9D%E8%B5%96%E5%85%B3%E7%B3%BB%EF%BC%9A-curl-%E4%BE%9D%E8%B5%96-libcurl4-7-58-0-2ubuntu3-10/",
            "title": "Ubuntu安装curl报错：软件包有未满足的依赖关系： curl : 依赖: libcurl4 (= 7.58.0-2ubuntu3.10)",
            "date_published": "2022-11-04T06:39:03.000Z",
            "content_html": "<p>依赖关系错误的老问题了</p>\n<p><span id=\"more\"></span></p>\n<h4 id=\"错误重现\"><a class=\"anchor\" href=\"#错误重现\">#</a> 错误重现</h4>\n<p>执行  <code>sudo apt install curl</code> <br />\n 下列软件包有未满足的依赖关系：<br />\ncurl : 依赖: libcurl4 (= 7.58.0-2ubuntu3.10) 但是 7.68.0-1ubuntu2.1 正要被安装<br />\n E: 无法修正错误，因为您要求某些软件包保持现状，就是它们破坏了软件包间的依赖关系。</p>\n<h4 id=\"解决方法\"><a class=\"anchor\" href=\"#解决方法\">#</a> 解决方法</h4>\n<p>依次执行:</p>\n<ol>\n<li><code>apt-get purge libcurl4</code></li>\n<li><code>apt-get install curl</code></li>\n</ol>\n",
            "tags": [
                "操作备忘",
                "bug",
                "ubuntu"
            ]
        },
        {
            "id": "https://winston950213.github.io/2022/11/04/linux-ubuntu-pip3-list-%E5%87%BA%E7%8E%B0%E8%AD%A6%E5%91%8A/",
            "url": "https://winston950213.github.io/2022/11/04/linux-ubuntu-pip3-list-%E5%87%BA%E7%8E%B0%E8%AD%A6%E5%91%8A/",
            "title": "linux ubuntu pip3 list 出现警告",
            "date_published": "2022-11-04T06:37:05.000Z",
            "content_html": "<h4 id=\"错误重现\"><a class=\"anchor\" href=\"#错误重现\">#</a> 错误重现</h4>\n<p><span id=\"more\"></span></p>\n<pre><code> 执行pip3 list后出现\n</code></pre>\n<p><code>DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.</code></p>\n<h4 id=\"解决方法\"><a class=\"anchor\" href=\"#解决方法\">#</a> 解决方法</h4>\n<ol>\n<li>在  <code>/etc</code>  下新建  <code>pip.conf</code>  :<br />\n <code>sudo nano /etc/pip.conf</code></li>\n<li>写入<br />\n <code>[list] format=columns</code> <br />\n <code>ctrl x</code>  Y 保存</li>\n<li>再次执行  <code>pip3 lsit</code></li>\n</ol>\n",
            "tags": [
                "操作备忘",
                "bug",
                "ubuntu"
            ]
        },
        {
            "id": "https://winston950213.github.io/2022/11/04/Command-python-setup-py-egg-info-failed-with-error-code-1-in-tmp-pip-build-thtq7d55-frida/",
            "url": "https://winston950213.github.io/2022/11/04/Command-python-setup-py-egg-info-failed-with-error-code-1-in-tmp-pip-build-thtq7d55-frida/",
            "title": "Command 'python setup.py egg_info' failed with error code 1 in /tmp/pip-build-thtq7d55/frida/",
            "date_published": "2022-11-04T06:33:38.000Z",
            "content_html": "<p>另一种方法解决 Command &quot;python <span class=\"exturl\" data-url=\"aHR0cDovL3NldHVwLnB5\">setup.py</span> egg_info&quot; failed with error code 1 in /tmp/pip-build-thtq7d55/frida/</p>\n<p><span id=\"more\"></span></p>\n<h4 id=\"错误重现\"><a class=\"anchor\" href=\"#错误重现\">#</a> 错误重现</h4>\n<ul>\n<li>ubuntu20.04 下安装执行  <code>pip3 install frida</code>  安装 frida 报错  <code>Command &quot;python setup.py egg_info&quot; failed with error code 1 in /tmp/pip-build-thtq7d55/frida/</code></li>\n</ul>\n<h4 id=\"解决方法\"><a class=\"anchor\" href=\"#解决方法\">#</a> 解决方法</h4>\n<ul>\n<li>搜索得知执行  <code>pip install --upgrade setuptools</code>  就可以<br />\n<img data-src=\"/images/legacy/202211042235236.png\" alt=\"文章插图\" /></li>\n</ul>\n",
            "tags": [
                "操作备忘",
                "python",
                "bug"
            ]
        },
        {
            "id": "https://winston950213.github.io/2022/11/04/Ubuntu%E6%8D%A2%E6%BA%90/",
            "url": "https://winston950213.github.io/2022/11/04/Ubuntu%E6%8D%A2%E6%BA%90/",
            "title": "Ubuntu换源",
            "date_published": "2022-11-04T06:26:26.000Z",
            "content_html": "<p>在使用 ububtu 的时候免不了切换安装源，网上其他的文本复制总会出现一些或大或小的问题，这里我以清华源为例</p>\n<p><span id=\"more\"></span></p>\n<ol>\n<li>进入官方帮助<span class=\"exturl\" data-url=\"aHR0cHM6Ly9taXJyb3IudHVuYS50c2luZ2h1YS5lZHUuY24vaGVscC91YnVudHUv\"> https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/</span></li>\n<li>选择你想要的版本</li>\n<li>复制粘贴，解决问题</li>\n</ol>\n",
            "tags": [
                "操作备忘",
                "tips"
            ]
        },
        {
            "id": "https://winston950213.github.io/2022/11/04/Kali-Linux-Failed-to-launch-preferred-application-for-category-TerminalEmulator-and-all-files-missing/",
            "url": "https://winston950213.github.io/2022/11/04/Kali-Linux-Failed-to-launch-preferred-application-for-category-TerminalEmulator-and-all-files-missing/",
            "title": "Kali Linux Failed to launch preferred application for category 'TerminalEmulator' and all files missing",
            "date_published": "2022-11-04T06:23:46.000Z",
            "content_html": "<p>I had a similar problem today. Installed Kali 2020.4 64-bit and ran sudo apt update &amp;&amp; sudo apt upgrade as you described. Rebooted the system and was unable to open terminal or browse files (I only tried via the &quot;Home&quot; folder on the desktop).</p>\n<p><span id=\"more\"></span></p>\n<p>I was still able to open QTerminal directly from the application menu to run commands. I was able to fix this by running the following. Hopefully this works for you.</p>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">sudo</span> <span class=\"token function\">apt</span> update</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token function\">sudo</span> <span class=\"token function\">apt</span> upgrade</pre></td></tr></table></figure><p>This returned a list of packages that &quot;were automatically installed and are no longer required:&quot; Remove these packages with the below command.</p>\n<p><code>sudo apt autoremove</code> <br />\nReboot. Then run  <code>sudo apt update &amp;&amp; sudo apt upgrade</code>  again. The following packages were required. Reboot again and terminal/file browsing should be working as expected.</p>\n<p>I suspect one specific package &quot;xfce4-helpers&quot; is causing the issue. I'm new to Linux so not sure of the cause (hopefully someone can elaborate).</p>\n<p>After completing the above steps, run  <code>sudo apt-get install xfce4-helpers</code>  .</p>\n<p>After doing the above</p>\n<ul>\n<li>right click the terminal and remove it from panel</li>\n<li>then right click somewhere on the panel bar and go to &quot;panel&quot;</li>\n<li>next go to &quot;Add New&quot; then scroll down to verve terminal and click on it.</li>\n<li>Add it to the bar panel (it will show up next to notifications).</li>\n<li>Right click again and go to move and move it to where it was.<br />\n(alternatively you can just go to app drop down menu and add Qterm to your desktop).<br />\n 原文指路 --&gt; <span class=\"exturl\" data-url=\"aHR0cHM6Ly9zdXBlcnVzZXIuY29tL3F1ZXN0aW9ucy8xNjE0MDQyL2thbGktbGludXgtZmFpbGVkLXRvLWxhdW5jaC1wcmVmZXJyZWQtYXBwbGljYXRpb24tZm9yLWNhdGVnb3J5LXRlcm1pbmFsZW11bGF0b3I=\">https://superuser.com/questions/1614042/kali-linux-failed-to-launch-preferred-application-for-category-terminalemulator</span></li>\n</ul>\n",
            "tags": [
                "操作备忘",
                "bug",
                "kali"
            ]
        },
        {
            "id": "https://winston950213.github.io/2022/11/04/E-Unable-to-locate-package-neofetch/",
            "url": "https://winston950213.github.io/2022/11/04/E-Unable-to-locate-package-neofetch/",
            "title": "E: Unable to locate package neofetch",
            "date_published": "2022-11-04T06:15:26.000Z",
            "content_html": "<p>ubuntu16.04 在安装  <code>neofetch</code>  的时候会遇到  <code>E: Unable to locate package neofetch</code>  , 这里提供一种解决方式</p>\n<p><span id=\"more\"></span></p>\n<ul>\n<li>在遇到错误搜索之后发现，几乎所有的文章都是先  <code>sudo apt-get update</code>  然后  <code>sudo apt-get install neofetch</code>  . 但是我都未解决我的问题</li>\n<li>继续搜索之后发现这样可以解决\n<ol>\n<li><code>sudo add-apt-repository ppa:dawidd0811/neofetch</code></li>\n<li><code>sudo apt-get update</code></li>\n<li><code>sudo apt-get install neofetch</code></li>\n</ol>\n</li>\n</ul>\n<blockquote>\n<p>来自一篇 16 年的文章:<br />\n 原文指路 ==&gt; <span class=\"exturl\" data-url=\"aHR0cHM6Ly9teS5vc2NoaW5hLm5ldC9saXV5dWFudGFvL2Jsb2cvODAwMzc1\">https://my.oschina.net/liuyuantao/blog/800375</span></p>\n</blockquote>\n",
            "tags": [
                "操作备忘",
                "bug",
                "ubuntu"
            ]
        },
        {
            "id": "https://winston950213.github.io/2022/11/02/%E7%BD%91%E5%9D%80%E5%A4%87%E5%BF%98/",
            "url": "https://winston950213.github.io/2022/11/02/%E7%BD%91%E5%9D%80%E5%A4%87%E5%BF%98/",
            "title": "网址备忘",
            "date_published": "2022-11-02T06:07:40.000Z",
            "content_html": "<p>常用的网址备忘</p>\n<p><span id=\"more\"></span></p>\n<ul>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL3dheWxhdS9naXQtZm9yLXdpbg==\">git 国内下载地址</span></li>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuNTJwb2ppZS5jbi9mb3J1bS5waHA/bW9kPXZpZXd0aHJlYWQmYW1wO3RpZD04MjI0MzQmYW1wO3BhZ2U9MSZhbXA7YXV0aG9yaWQ9OTk0MTA5\">吾爱破解从零开始学安卓逆向教程</span></li>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly9odHRwYmluLm9yZy9nZXQ/c2hvd19lbnY9MQ==\">程序请求头测试网址</span></li>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly9taXJyb3JzLnR1bmEudHNpbmdodWEuZWR1LmNuL2FuYWNvbmRhL2FyY2hpdmUv\">anaconda 清华大学下载地址</span></li>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly9pbnRvbGkuY29tL2Jsb2cvbm90LXBvc3NpYmxlLXRvLWJsb2NrLWNocm9tZS1oZWFkbGVzcy9jaHJvbWUtaGVhZGxlc3MtdGVzdC5odG1s\">浏览器信息检测</span></li>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cubGZkLnVjaS5lZHUvfmdvaGxrZS9weXRob25saWJzLyN0d2lzdGVk\">twisted.whl 下载地址</span></li>\n<li><span class=\"exturl\" data-url=\"aHR0cDovL2Nocm9tZWRyaXZlci5zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2luZGV4Lmh0bWw=\">Chromedriver 下载地址</span></li>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cubWFubmluZy5jb20vYm9va3MvZ3Jva2tpbmctYWxnb3JpdGhtcw==\">算法图解原版链接 (python2.7 实现</span></li>\n<li><span class=\"exturl\" data-url=\"aHR0cDovL3d3dy5nZWV0ZXN0LmNvbS9kZW1vLw==\">极验 demo 地址</span></li>\n</ul>\n",
            "tags": [
                "操作备忘",
                "工具",
                "网址",
                "备忘"
            ]
        },
        {
            "id": "https://winston950213.github.io/2022/11/01/python%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%AD%A6%E4%B9%A0/",
            "url": "https://winston950213.github.io/2022/11/01/python%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%AD%A6%E4%B9%A0/",
            "title": "python多线程学习",
            "date_published": "2022-10-31T08:53:01.000Z",
            "content_html": "<p>python 多线程一点研究，有待深入</p>\n<p><span id=\"more\"></span></p>\n<h4 id=\"线程模块\"><a class=\"anchor\" href=\"#线程模块\">#</a> 线程模块</h4>\n<p>在 Python3 通过两个标准库 _thread 和 threading 提供对线程的支持。</p>\n<ul>\n<li>_thread 提供了低级别的、原始的线程以及一个简单的锁</li>\n<li>threading 对_thread 进行封装并且扩展了功能，所以现在基本上 python 多线程都使用 threading</li>\n</ul>\n<h4 id=\"创建线程\"><a class=\"anchor\" href=\"#创建线程\">#</a> 创建线程</h4>\n<ol>\n<li>方法一:</li>\n</ol>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\"># 使用函数的方式创建</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre> <span class=\"token keyword\">import</span> threading</pre></td></tr><tr><td data-num=\"3\"></td><td><pre> <span class=\"token keyword\">import</span> time</pre></td></tr><tr><td data-num=\"4\"></td><td><pre></pre></td></tr><tr><td data-num=\"5\"></td><td><pre> <span class=\"token keyword\">def</span> <span class=\"token function\">func</span><span class=\"token punctuation\">(</span>arg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>     time<span class=\"token punctuation\">.</span>sleep<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>     <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'thread '</span><span class=\"token operator\">+</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>arg<span class=\"token punctuation\">)</span><span class=\"token operator\">+</span><span class=\"token string\">\" running....\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre></pre></td></tr><tr><td data-num=\"9\"></td><td><pre> <span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>     <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>         t <span class=\"token operator\">=</span> threading<span class=\"token punctuation\">.</span>Thread<span class=\"token punctuation\">(</span>target<span class=\"token operator\">=</span>func<span class=\"token punctuation\">,</span> args<span class=\"token operator\">=</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">,</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>         t<span class=\"token punctuation\">.</span>start<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><ol start=\"2\">\n<li>方法二:</li>\n</ol>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\"># 使用继承 Thread 类的方式创建</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">import</span> threading</pre></td></tr><tr><td data-num=\"3\"></td><td><pre></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">class</span> <span class=\"token class-name\">MyThread</span><span class=\"token punctuation\">(</span>threading<span class=\"token punctuation\">.</span>Thread<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> thread_name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>        <span class=\"token comment\"># 注意：一定要显式的调用父类的初始化函数。</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>        <span class=\"token builtin\">super</span><span class=\"token punctuation\">(</span>MyThread<span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>__init__<span class=\"token punctuation\">(</span>name<span class=\"token operator\">=</span>thread_name<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    <span class=\"token keyword\">def</span> <span class=\"token function\">run</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"%s正在运行中......\"</span> <span class=\"token operator\">%</span> self<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>        MyThread<span class=\"token punctuation\">(</span><span class=\"token string\">\"thread-\"</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>start<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">#此行代码也可分开写，先创建 MyThread 对象，在调用 start 方法</span></pre></td></tr></table></figure><h4 id=\"疑惑\"><a class=\"anchor\" href=\"#疑惑\">#</a> 疑惑</h4>\n<ol>\n<li>\n<p><code>start</code>  和  <code>join</code>  干了什么？</p>\n<p><code>ctrl</code>  + 左键点击进去 start 源码看到注释:</p>\n</li>\n</ol>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token triple-quoted-string string\">\"\"\"Start the thread's activity.</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    It must be called at most once per thread object. It arranges for the</pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    object's run() method to be invoked in a separate thread of control.</pre></td></tr><tr><td data-num=\"5\"></td><td><pre></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>    This method will raise a RuntimeError if called more than once on the</pre></td></tr><tr><td data-num=\"7\"></td><td><pre>    same thread object.</pre></td></tr><tr><td data-num=\"8\"></td><td><pre>\"\"\"</span></pre></td></tr></table></figure><p>简单来说就是激活一个线程，在 run () 方法之后被独立调用，重复调用会抛出  <code>RuntimeError</code></p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token triple-quoted-string string\">\"\"\"Wait until the thread terminates.</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    This blocks the calling thread until the thread whose join() method is</pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    called terminates -- either normally or through an unhandled exception</pre></td></tr><tr><td data-num=\"5\"></td><td><pre>    or until the optional timeout occurs.</pre></td></tr><tr><td data-num=\"6\"></td><td><pre></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>    When the timeout argument is present and not None, it should be a</pre></td></tr><tr><td data-num=\"8\"></td><td><pre>    floating point number specifying a timeout for the operation in seconds</pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    (or fractions thereof). As join() always returns None, you must call</pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    is_alive() after join() to decide whether a timeout happened -- if the</pre></td></tr><tr><td data-num=\"11\"></td><td><pre>    thread is still alive, the join() call timed out.</pre></td></tr><tr><td data-num=\"12\"></td><td><pre></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>    When the timeout argument is not present or None, the operation will</pre></td></tr><tr><td data-num=\"14\"></td><td><pre>    block until the thread terminates.</pre></td></tr><tr><td data-num=\"15\"></td><td><pre></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>    A thread can be join()ed many times.</pre></td></tr><tr><td data-num=\"17\"></td><td><pre></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>    join() raises a RuntimeError if an attempt is made to join the current</pre></td></tr><tr><td data-num=\"19\"></td><td><pre>    thread as that would cause a deadlock. It is also an error to join() a</pre></td></tr><tr><td data-num=\"20\"></td><td><pre>    thread before it has been started and attempts to do so raises the same</pre></td></tr><tr><td data-num=\"21\"></td><td><pre>    exception.</pre></td></tr><tr><td data-num=\"22\"></td><td><pre>    \"\"\"</span></pre></td></tr></table></figure><p>join () 会一直等待知道所有线程结束<br />\n就方法一中的代码如果直接在 for 循环中加入 join 的话会导致执行时间为 10s</p>\n<p>正确做法:</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> threading</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">import</span> time</pre></td></tr><tr><td data-num=\"3\"></td><td><pre></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">func</span><span class=\"token punctuation\">(</span>arg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>    time<span class=\"token punctuation\">.</span>sleep<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'thread '</span><span class=\"token operator\">+</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>arg<span class=\"token punctuation\">)</span><span class=\"token operator\">+</span><span class=\"token string\">\" running....\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    start <span class=\"token operator\">=</span> time<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    threads <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>        t <span class=\"token operator\">=</span> threading<span class=\"token punctuation\">.</span>Thread<span class=\"token punctuation\">(</span>target<span class=\"token operator\">=</span>func<span class=\"token punctuation\">,</span> args<span class=\"token operator\">=</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">,</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>        threads<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>    <span class=\"token keyword\">for</span> t <span class=\"token keyword\">in</span> threads<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>        t<span class=\"token punctuation\">.</span>start<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>    <span class=\"token keyword\">for</span> t <span class=\"token keyword\">in</span> threads<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>        t<span class=\"token punctuation\">.</span>join<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> start<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><ol start=\"2\">\n<li>同时写入多个文件</li>\n</ol>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> threading</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">import</span> time</pre></td></tr><tr><td data-num=\"3\"></td><td><pre></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">func_fs</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>    <span class=\"token keyword\">with</span> <span class=\"token builtin\">open</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>name<span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">.txt\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"w\"</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> target<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>        time<span class=\"token punctuation\">.</span>sleep<span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># 假装写入很久</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>        target<span class=\"token punctuation\">.</span>write<span class=\"token punctuation\">(</span><span class=\"token string\">\"这是一段很长的文本\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre></pre></td></tr><tr><td data-num=\"9\"></td><td><pre><span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">\"__main__\"</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    start <span class=\"token operator\">=</span> time<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>    l_thread <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>        t <span class=\"token operator\">=</span> threading<span class=\"token punctuation\">.</span>Thread<span class=\"token punctuation\">(</span>target<span class=\"token operator\">=</span>func_fs<span class=\"token punctuation\">,</span> args<span class=\"token operator\">=</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">,</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>        l_thread<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>    <span class=\"token keyword\">for</span> t <span class=\"token keyword\">in</span> l_thread<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>        t<span class=\"token punctuation\">.</span>start<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>    <span class=\"token keyword\">for</span> t <span class=\"token keyword\">in</span> l_thread<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>        t<span class=\"token punctuation\">.</span>join<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> start<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h4 id=\"todo\"><a class=\"anchor\" href=\"#todo\">#</a> Todo</h4>\n<ul>\n<li>lock</li>\n<li>生产者消费者模型</li>\n<li>Queue 队列</li>\n<li>爬虫实战</li>\n</ul>\n<h4 id=\"参考链接\"><a class=\"anchor\" href=\"#参考链接\">#</a> 参考链接:</h4>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy43L2xpYnJhcnkvdGhyZWFkaW5nLmh0bWw/aGlnaGxpZ2h0PXRocmVhZGluZyNtb2R1bGUtdGhyZWFkaW5n\">threading</span></p>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy43L2xpYnJhcnkvX3RocmVhZC5odG1sP2hpZ2hsaWdodD1fdGhyZWFkI21vZHVsZS1fdGhyZWFk\">_thread</span></p>\n",
            "tags": [
                "编程语言",
                "python",
                "多线程"
            ]
        },
        {
            "id": "https://winston950213.github.io/2022/11/01/python%E4%B8%BA%E8%A7%86%E9%A2%91%E6%B7%BB%E5%8A%A0%E6%B0%B4%E5%8D%B0/",
            "url": "https://winston950213.github.io/2022/11/01/python%E4%B8%BA%E8%A7%86%E9%A2%91%E6%B7%BB%E5%8A%A0%E6%B0%B4%E5%8D%B0/",
            "title": "python为视频添加水印",
            "date_published": "2022-10-31T08:50:08.000Z",
            "content_html": "<p>python 去水印</p>\n<p><span id=\"more\"></span></p>\n<h3 id=\"环境配置\"><a class=\"anchor\" href=\"#环境配置\">#</a> 环境配置</h3>\n<p><strong>笔者环境：win10 专业版， python3.8.0</strong></p>\n<ul>\n<li>官方文档：<span class=\"exturl\" data-url=\"aHR0cHM6Ly96dWxrby5naXRodWIuaW8vbW92aWVweS9pbnN0YWxsLmh0bWwlRTMlODAlOTAlRTUlOEYlQUYlRTglODMlQkQlRTklOUMlODAlRTglQTYlODElRTklQUQlOTQlRTYlQjMlOTUlRTMlODAlOTE=\">https://zulko.github.io/moviepy/install.html【可能需要魔法】</span></li>\n</ul>\n<ol>\n<li><code>pip install ez_setup</code></li>\n<li><code>pip install moviepy</code></li>\n</ol>\n<h4 id=\"添加图片水印\"><a class=\"anchor\" href=\"#添加图片水印\">#</a> 添加图片水印</h4>\n<figure class=\"highlight text\"><figcaption data-lang=\"text\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>import moviepy.editor as mp</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>#本地视频位置</pre></td></tr><tr><td data-num=\"4\"></td><td><pre>video = mp.VideoFileClip(r\"D:\\resource\\myresource\\4393644710024974337.mp4\")</pre></td></tr><tr><td data-num=\"5\"></td><td><pre></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>#准备log图片</pre></td></tr><tr><td data-num=\"7\"></td><td><pre>logo = (mp.ImageClip(r\"C:\\Users\\zrail\\Downloads\\touxiang.jpeg\")</pre></td></tr><tr><td data-num=\"8\"></td><td><pre>        .set_duration(video.duration) # 水印持续时间</pre></td></tr><tr><td data-num=\"9\"></td><td><pre>        .resize(height=100) # 水印的高度，会等比缩放</pre></td></tr><tr><td data-num=\"10\"></td><td><pre>        .margin(right=8, top=8, opacity=1) # 水印边距和透明度</pre></td></tr><tr><td data-num=\"11\"></td><td><pre>        .set_pos((\"left\",\"center\"))) # 水印的位置</pre></td></tr><tr><td data-num=\"12\"></td><td><pre></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>final = mp.CompositeVideoClip([video, logo])</pre></td></tr><tr><td data-num=\"14\"></td><td><pre># mp4文件默认用libx264编码， 比特率单位bps</pre></td></tr><tr><td data-num=\"15\"></td><td><pre>final.write_videofile(\"test.mp4\", codec=\"libx264\", bitrate=\"10000000\")</pre></td></tr></table></figure><h5 id=\"报错\"><a class=\"anchor\" href=\"#报错\">#</a> 报错</h5>\n<ol>\n<li><code>RuntimeError: The current Numpy installation ('C:\\\\Users\\\\zrail\\\\.conda\\\\envs\\\\py380\\\\lib\\\\site-packages\\\\numpy\\\\__init__.py') fails to pass a sanity check due to a bug in the windows runtime. See this issue for more information: https://tinyurl.com/y3dm3h86</code></li>\n</ol>\n<ul>\n<li>使用搜索引擎找到解决方案，切换 numpy 版本，链接：<span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL251bXB5L251bXB5L2lzc3Vlcy8xNzcyNg==\">https://github.com/numpy/numpy/issues/17726</span></li>\n</ul>\n<h4 id=\"添加文字水印\"><a class=\"anchor\" href=\"#添加文字水印\">#</a> 添加文字水印</h4>\n<figure class=\"highlight text\"><figcaption data-lang=\"text\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre># -*- coding: utf-8 -*-</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>from moviepy.editor import VideoFileClip,CompositeVideoClip</pre></td></tr><tr><td data-num=\"3\"></td><td><pre></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>#本地视频位置</pre></td></tr><tr><td data-num=\"5\"></td><td><pre>from moviepy.video.VideoClip import TextClip</pre></td></tr><tr><td data-num=\"6\"></td><td><pre>#subclip视频截取开始时间和结束时间</pre></td></tr><tr><td data-num=\"7\"></td><td><pre>video = VideoFileClip(r\"D:\\resource\\myresource\\4393644710024974337.mp4\").subclip(0,1)</pre></td></tr><tr><td data-num=\"8\"></td><td><pre></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>#制作文字，指定文字大小和颜色</pre></td></tr><tr><td data-num=\"10\"></td><td><pre>txt_clip = ( TextClip(\"zxl shuiyin\",fontsize=30,color='red')</pre></td></tr><tr><td data-num=\"11\"></td><td><pre>             .set_position('center')#水印内容居中</pre></td></tr><tr><td data-num=\"12\"></td><td><pre>             .set_duration(1) )#水印持续时间</pre></td></tr><tr><td data-num=\"13\"></td><td><pre></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>result = CompositeVideoClip([video, txt_clip]) #在视频上覆盖文本</pre></td></tr><tr><td data-num=\"15\"></td><td><pre>result.write_videofile(\"tttttest.mp4\",fps=25)#fps:视频文件中每秒的帧数</pre></td></tr></table></figure><h5 id=\"报错-2\"><a class=\"anchor\" href=\"#报错-2\">#</a> 报错</h5>\n<ol>\n<li>`OSError: MoviePy Error: creation of None failed because of the following error:</li>\n</ol>\n<p>[WinError 2] 系统找不到指定的文件。.</p>\n<p>.This error can be due to the fact that ImageMagick is not installed on your computer, or (for Windows users) that you didn't specify the path to the ImageMagick binary in file <span class=\"exturl\" data-url=\"aHR0cDovL2NvbmYucHk=\">conf.py</span>, or that the path you specified is incorrect`</p>\n<ul>\n<li>翻译报错信息并使用搜索引擎找到解决方案，链接：<span class=\"exturl\" data-url=\"aHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTE5Mjg4MDcvbW92aWVweS1jYW50LWRldGVjdC1pbWFnZW1hZ2ljay1iaW5hcnktb24td2luZG93cw==\">https://stackoverflow.com/questions/51928807/moviepy-cant-detect-imagemagick-binary-on-windows</span></li>\n<li>安装 ImageMagick，并修改源码链接：<span class=\"exturl\" data-url=\"aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIzOTQ0OTE1L2FydGljbGUvZGV0YWlscy84NjUxNDMwMQ==\">https://blog.csdn.net/qq_23944915/article/details/86514301</span></li>\n</ul>\n<blockquote>\n<p><em>具体没有仔细研究，水印的各种细节有待处理，这里只是抛砖引玉。剩下的靠大家了</em></p>\n</blockquote>\n",
            "tags": [
                "操作备忘",
                "python",
                "水印"
            ]
        },
        {
            "id": "https://winston950213.github.io/2021/05/23/%E6%8A%93%E5%8C%85%E6%80%BB%E7%BB%93%E8%AE%B0%E5%BD%95/",
            "url": "https://winston950213.github.io/2021/05/23/%E6%8A%93%E5%8C%85%E6%80%BB%E7%BB%93%E8%AE%B0%E5%BD%95/",
            "title": "抓包总结记录",
            "date_published": "2021-05-23T04:50:13.000Z",
            "content_html": "<p>逆向学习中抓包的一点总结记录</p>\n<p><span id=\"more\"></span></p>\n<h2 id=\"计算机网络基础\"><a class=\"anchor\" href=\"#计算机网络基础\">#</a> 计算机网络基础</h2>\n<blockquote>\n<p>互联网所有的数据都是基于网络传输，所以懂点网络在逆向过程中也是必不可少的</p>\n</blockquote>\n<ul>\n<li>\n<p>http 与 https:</p>\n<ul>\n<li>https 是披着 ssl 外壳的 http</li>\n<li><span class=\"exturl\" data-url=\"aHR0cDovL3d3dy41MmltLm5ldC90aHJlYWQtMjg2Ni0xLTEuaHRtbA==\">http://www.52im.net/thread-2866-1-1.html</span></li>\n</ul>\n</li>\n<li>\n<p>数据流向:</p>\n<blockquote>\n<p>TCP/IP 协议中，数据流向都是按着这个模式来，无出其右</p>\n</blockquote>\n<p><img data-src=\"/images/legacy/20210521003445.png\" alt=\"文章插图\" /></p>\n</li>\n</ul>\n<blockquote>\n<p>OSI 网络模型 和 TCP/IP 模型的对比</p>\n</blockquote>\n<p><img data-src=\"/images/legacy/20210521004109.png\" alt=\"文章插图\" /></p>\n<blockquote>\n<p>读完 图解 HTTP 的一点碎碎念</p>\n</blockquote>\n<ul>\n<li>IP 协议与 IP 地址:\n<ul>\n<li>我们经常说的 ip 一般表示 IP 地址，但是再谈到协议的时候 IP 一般指的是 IP 协议，并不是 IP 地址</li>\n</ul>\n</li>\n<li>代理 IP 与代理服务器\n<ul>\n<li>代理 IP 分为透明代理，高匿等\n<ol>\n<li>透明代理：目标服务器知道你使用了代理，[原理为首部的  <code>via</code>  , 说法来源于网上]</li>\n<li>高匿代理：目标服务器不知道你使用了代理。这样会认为此次访问是一个真实的 IP 地址</li>\n</ol>\n</li>\n<li>代理服务器分为透明代理服务器，缓存服务器\n<ol>\n<li>透明代理服务器：不对请求响应内容处理的服务器，只做代理。对请求响应内容更改的的称作非透明代理服务器</li>\n<li>缓存代理服务器：将响应内容缓存到服务器，如果源服务器未更新资源则返回缓存内容</li>\n</ol>\n</li>\n</ul>\n</li>\n<li>未完待续</li>\n</ul>\n<h2 id=\"基于工具的抓包\"><a class=\"anchor\" href=\"#基于工具的抓包\">#</a> 基于工具的抓包</h2>\n<h3 id=\"charles-系统代理\"><a class=\"anchor\" href=\"#charles-系统代理\">#</a> charles + 系统代理</h3>\n<blockquote>\n<p>很早期的做法，但是随着 android7 以上不信任系统证书和检测手段增多现在不推荐这种抓包方式</p>\n<p>从 OSI 模型理解，修改系统代理的抓包方式，代理存在于应用层，而使用 VPN 转发的方式抓包在网络层。代理的位置更加底层，更难防护</p>\n</blockquote>\n<h3 id=\"charles-vpn-代理工具\"><a class=\"anchor\" href=\"#charles-vpn-代理工具\">#</a> charles + VPN 代理工具</h3>\n<blockquote>\n<p>VPN 代理工具有很多，比如 Brook, postern, proxyDaivd, drony</p>\n<p>笔者使用的是 postern, 觉得不怎么好，但是其他的用的也不怎么样好，相对之下选了一个相对好的就一直用了</p>\n</blockquote>\n<h4 id=\"抓包环境搭建\"><a class=\"anchor\" href=\"#抓包环境搭建\">#</a> 抓包环境搭建</h4>\n<ol>\n<li>\n<p>charles 安装与配置 [破解可耻，支持正版]</p>\n<ol>\n<li>官网下载最新版:<span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuY2hhcmxlc3Byb3h5LmNvbS9hc3NldHMvcmVsZWFzZS80LjYuMS9jaGFybGVzLXByb3h5LTQuNi4xX2FtZDY0LnRhci5neg==\">https://www.charlesproxy.com/assets/release/4.6.1/charles-proxy-4.6.1_amd64.tar.gz</span> 解压即可使用</li>\n<li>破解 (行为可耻，请勿模仿):\n<ul>\n<li>在 <span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuY2hhcmxlcy5yZW4v\">https://www.charles.ren/</span> 填写 Registered Name, 并生成授权码</li>\n<li><img data-src=\"/images/legacy/20210524001004.png\" alt=\"文章插图\" /></li>\n<li><img data-src=\"/images/legacy/20210524001051.png\" alt=\"文章插图\" /></li>\n</ul>\n</li>\n</ol>\n</li>\n<li>\n<p>postern 安装与配置</p>\n<ol>\n<li>谷歌下载 postern</li>\n<li><img data-src=\"/images/legacy/20210524001259.png\" alt=\"文章插图\" /></li>\n<li><img data-src=\"/images/legacy/20210524001344.png\" alt=\"文章插图\" /></li>\n<li><img data-src=\"/images/legacy/20210524001413.png\" alt=\"文章插图\" /></li>\n</ol>\n</li>\n<li>\n<p>证书安装</p>\n<ol>\n<li>charles 将证书导出到 PC, 导出为 pem 格式</li>\n<li>计算文件名，文件名是一个 Hash 值，而后缀是一个数字。后缀名的数字是为了防止文件名冲突的，比如如果两个证书算出的 Hash 值是一样的话，那么一个证书的后缀名数字可以设置成 0，而另一个证书的后缀名数字可以设置成 1</li>\n</ol>\n</li>\n</ol>\n<figure class=\"highlight text\"><figcaption data-lang=\"text\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>openssl x509 -subject_hash_old -in &lt;Certificate_File></pre></td></tr></table></figure><ol start=\"3\">\n<li>\n<p>修改证书名称</p>\n</li>\n<li>\n<p>复制证书到设备上</p>\n<blockquote>\n<p>复制到系统目录并修改权限（安卓 8.1.0 Magisk Root）</p>\n</blockquote>\n</li>\n</ol>\n<figure class=\"highlight text\"><figcaption data-lang=\"text\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>adb push xxxxxxx.0 /sdcard/</pre></td></tr></table></figure><figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">mount</span> <span class=\"token parameter variable\">-o</span> rw,remount /system 【不修改 没法写入】</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token function\">mount</span> <span class=\"token parameter variable\">-o</span> rw,remount /</pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token function\">mv</span> /sdcard/xxxxxxx.0 /etc/security/cacerts/ 移动文件到系统</pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token function\">chown</span> root:root /etc/security/cacerts/xxxxxx.0 修改用户组</pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token function\">chmod</span> <span class=\"token number\">644</span> /system/etc/security/cacerts/xxxxxxx.0 修改权限</pre></td></tr></table></figure><ol start=\"5\">\n<li>\n<p>重启手机验证</p>\n<p><code>reboot</code></p>\n<p>—by:r0syue</p>\n</li>\n</ol>\n<blockquote>\n<p>由于证书先安装到用户目录再移动到系统目录这样的操作会被 app 将此证书拉黑，如果曾经有过此操作最好先刷机在移动证书.</p>\n</blockquote>\n<blockquote></blockquote>\n<figure class=\"highlight text\"><figcaption data-lang=\"text\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>openssl x509 -subject_hash_old -in  &lt;Certificate_File>报错 ：PEM routines:get_name:no start line:crypto\\pem\\pem_lib.c:745:Expecting: TRUSTED CERTIFICATE</pre></td></tr></table></figure><blockquote>\n<p>解决办法：使用这个命令  <code>openssl x509 -subject_hash_old -in &lt;Certificate_File&gt; -inform der</code>  by: 嘴强王者<br />\n系统证书目录：  <code>/system/etc/security/cacerts/</code></p>\n</blockquote>\n<h3 id=\"httpcanypacket-capture\"><a class=\"anchor\" href=\"#httpcanypacket-capture\">#</a> HttpCany/Packet Capture</h3>\n<blockquote>\n<p>基于安卓手机。优点的话那就是省事。缺点的话可能是屏幕小</p>\n</blockquote>\n<h3 id=\"wireshark\"><a class=\"anchor\" href=\"#wireshark\">#</a> Wireshark</h3>\n<blockquote>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9ib29rLmRvdWJhbi5jb20vc3ViamVjdC8yMTY5MTY5Mi8=\">https://book.douban.com/subject/21691692/</span></p>\n</blockquote>\n<h3 id=\"tcpdump\"><a class=\"anchor\" href=\"#tcpdump\">#</a> tcpdump</h3>\n<blockquote>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9qdWVqaW4uY24vcG9zdC82ODQ0OTA0MDg0MTY4NzY5NTQ5\">https://juejin.cn/post/6844904084168769549</span></p>\n</blockquote>\n<h3 id=\"对抗\"><a class=\"anchor\" href=\"#对抗\">#</a> 对抗</h3>\n<h4 id=\"证书\"><a class=\"anchor\" href=\"#证书\">#</a> 证书</h4>\n<h5 id=\"证书锁定\"><a class=\"anchor\" href=\"#证书锁定\">#</a> 证书锁定</h5>\n<blockquote>\n<p>在代码中指定证书 hash 值</p>\n</blockquote>\n<h5 id=\"反证书锁定\"><a class=\"anchor\" href=\"#反证书锁定\">#</a> 反证书锁定</h5>\n<ol>\n<li>\n<p>服务端校验客户端证书</p>\n<ol>\n<li>\n<p>使用 objection 自带命令</p>\n<p><code>android sslpinning disable</code></p>\n<p><img data-src=\"/images/legacy/20210521144416.png\" alt=\"文章插图\" /></p>\n</li>\n<li>\n<p>使用瘦蛟舞大佬的 DroidSSLUnpinning<br />\n<span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL1dvb3l1bkRvdGEvRHJvaWRTU0xVbnBpbm5pbmc=\">https://github.com/WooyunDota/DroidSSLUnpinning</span></p>\n</li>\n<li>\n<p>使用  <code>JustTrustMe</code>  , 当然了珍惜大佬的升级版本也可以</p>\n<ul>\n<li>原版: <span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL0Z1emlvbjI0L0p1c3RUcnVzdE1l\">https://github.com/Fuzion24/JustTrustMe</span></li>\n<li>升级版: <span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL3cyOTY0ODgzMjAvWHBvc2VkT2tIdHRwQ2F0L3RyZWUvbWFzdGVyL2p1c3RUcnVzdE1lUGx1c2g=\">https://github.com/w296488320/XposedOkHttpCat/tree/master/justTrustMePlush</span></li>\n<li>分析文章: <span class=\"exturl\" data-url=\"aHR0cHM6Ly9iYnMucGVkaXkuY29tL3RocmVhZC0yNTQxMTQuaHRt\">https://bbs.pediy.com/thread-254114.htm</span></li>\n</ul>\n</li>\n<li>\n<p>自己分析 hook 点，去过掉证书锁定</p>\n<ol>\n<li>java.io.File</li>\n<li>java.security.KeyStore</li>\n<li>...</li>\n</ol>\n</li>\n</ol>\n</li>\n<li>\n<p>客户端校验服务端</p>\n<p>未完待续...</p>\n</li>\n<li>\n<p>双向验证</p>\n<blockquote>\n<p>典型的双向验证 Soul 分析，===&gt; <span class=\"exturl\" data-url=\"aHR0cDovL3poYW94aW5jaGVuZy5jb20vaW5kZXgucGhwLzIwMjAvMDcvMTUvb3VsYXBwJUU3JTlBJTg0JUU1JThGJThDJUU1JTkwJTkxJUU4JUFGJTgxJUU0JUI5JUE2JUU3JUEwJUI0JUU4JUE3JUEzLw==\">soul 双向证书破解</span></p>\n</blockquote>\n<p>未完待续...</p>\n</li>\n</ol>\n<h4 id=\"检测系统代理\"><a class=\"anchor\" href=\"#检测系统代理\">#</a> 检测系统代理</h4>\n<figure class=\"highlight text\"><figcaption data-lang=\"text\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>System.getProperty(“http.proxyHost”);</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>System.getProperty(“http.proxyPort”);</pre></td></tr></table></figure><h4 id=\"反系统代理检测\"><a class=\"anchor\" href=\"#反系统代理检测\">#</a> 反系统代理检测</h4>\n<blockquote>\n<p>不使用系统代理的方式抓包，使用 VPN 代理方式</p>\n</blockquote>\n<h5 id=\"检测-vpn\"><a class=\"anchor\" href=\"#检测-vpn\">#</a> 检测 VPN</h5>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>java.net.NetworkInterface.getName<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>android.net.ConnectivityManager.getNetworkCapabilities<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h5 id=\"反-vpn-检测\"><a class=\"anchor\" href=\"#反-vpn-检测\">#</a> 反 VPN 检测</h5>\n<blockquote>\n<p>分析 app,hook 掉检测</p>\n</blockquote>\n<blockquote>\n<p>实战秀动 APP</p>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9tcC53ZWl4aW4ucXEuY29tL3MvVWl4RXhaa1BXSEpBVDNqQUQyc0pKZw==\">https://mp.weixin.qq.com/s/UixExZkPWHJAT3jAD2sJJg</span></p>\n</blockquote>\n<hr />\n<ul>\n<li>看完这篇文章并跟着做了一遍，发现代码都一样，但是就是过不了，于是就使出了瞎几把 hook 大法，将  <code>ConnectivityManager</code>  类全部 hook, 然后修改  <code>getActiveNetwork</code>  返回值，最后成功</li>\n</ul>\n<figure class=\"highlight javascript\"><figcaption data-lang=\"javascript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>Java<span class=\"token punctuation\">.</span><span class=\"token function\">perform</span><span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>    <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>        <span class=\"token keyword\">var</span> ConnectivityManager <span class=\"token operator\">=</span> Java<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"android.net.ConnectivityManager\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>        ConnectivityManager<span class=\"token punctuation\">.</span>getActiveNetwork<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">implementation</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>            <span class=\"token keyword\">var</span> Integer <span class=\"token operator\">=</span> Java<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"android.net.Network\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>            <span class=\"token keyword\">var</span> r1 <span class=\"token operator\">=</span> Integer<span class=\"token punctuation\">.</span>$<span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>            <span class=\"token keyword\">var</span> result <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getActiveNetwork</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>            console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"result is => \"</span><span class=\"token punctuation\">,</span> result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>            <span class=\"token keyword\">return</span> r1<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><p><img data-src=\"/images/legacy/20210523232011.jpg\" alt=\"文章插图\" /></p>\n<h5 id=\"文章收藏\"><a class=\"anchor\" href=\"#文章收藏\">#</a> 文章收藏</h5>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuYW5xdWFua2UuY29tL3Bvc3QvaWQvMTk3NjU3\">https://www.anquanke.com/post/id/197657</span></p>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9tcC53ZWl4aW4ucXEuY29tL3MvVWl4RXhaa1BXSEpBVDNqQUQyc0pKZw==\">https://mp.weixin.qq.com/s/UixExZkPWHJAT3jAD2sJJg</span></p>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuamlhbnNodS5jb20vcC8yNDc2Yzg4NThkYWY=\">https://www.jianshu.com/p/2476c8858daf</span></p>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9hcGktY2FsbGVyLmNvbS8yMDE5LzExLzA1L2NhcHR1cmUtbm90ZS8=\">https://api-caller.com/2019/11/05/capture-note/</span></p>\n<h3 id=\"hook-抓包\"><a class=\"anchor\" href=\"#hook-抓包\">#</a> hook 抓包</h3>\n<blockquote>\n<p>这个仁者见仁智者见智，方法不尽相同，记录几个小工具，方便抄袭</p>\n</blockquote>\n<ul>\n<li>\n<p>OkHttpLogger-Frida</p>\n<ul>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL3NpeXVqaWUvT2tIdHRwTG9nZ2VyLUZyaWRh\">siyujie/OkHttpLogger-Frida: Frida 实现拦截 okhttp 的脚本</span></li>\n</ul>\n</li>\n<li>\n<p>基于 Okhttp 拦截器实现的各种抓包</p>\n<ul>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly9iYnMucGVkaXkuY29tL3RocmVhZC0yNTIxMDAuaHRt\">https://bbs.pediy.com/thread-252100.htm</span></li>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly9iYnMucGVkaXkuY29tL3RocmVhZC0yNTQ1MDMuaHRt\">https://bbs.pediy.com/thread-254503.htm</span></li>\n<li>未完待续</li>\n</ul>\n</li>\n<li>\n<p>r0capture</p>\n<ul>\n<li>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL3IweXN1ZS9yMGNhcHR1cmU=\">r0ysue/r0capture: 安卓应用层抓包通杀脚本</span></p>\n<blockquote>\n<p>hook  <code>ssl_read</code>  ,  <code>ssl_write</code></p>\n<p>光看 hook 点可能觉得很简单，你上你也行，但是分析的过程很重要</p>\n</blockquote>\n</li>\n</ul>\n</li>\n<li>\n<p>自己分析，基于系统库的 hook</p>\n</li>\n</ul>\n<h3 id=\"对抗-2\"><a class=\"anchor\" href=\"#对抗-2\">#</a> 对抗</h3>\n<ul>\n<li>anti_frida</li>\n<li>anti_xp</li>\n</ul>\n<h3 id=\"抓包骚操作\"><a class=\"anchor\" href=\"#抓包骚操作\">#</a> 抓包骚操作</h3>\n<ul>\n<li>\n<p>Android 结合 Wireshark 抓包，不用安装证书</p>\n<ul>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL2xhc3RpbmcteWFuZy9mcmlkYV9ieXBhc3Nfc3NsX2V4YW1wbGUvdHJlZS9tYXN0ZXIvQW5kcm9pZC9hbmRyb2lkX3dpcmVzaGFya190bHM=\">https://github.com/lasting-yang/frida_bypass_ssl_example/tree/master/Android/android_wireshark_tls</span></li>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuNTJwb2ppZS5jbi90aHJlYWQtMTQwNTkxNy0xLTEuaHRtbA==\">https://www.52pojie.cn/thread-1405917-1-1.html</span></li>\n</ul>\n</li>\n<li>\n<p>高版本 android 证书问题</p>\n<ul>\n<li>\n<p>将证书直接 push 到系统根目录下:</p>\n<ul>\n<li><img data-src=\"/images/legacy/20210521165953.png\" alt=\"文章插图\" /></li>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuNTJwb2ppZS5jbi90aHJlYWQtMTE0ODg5Mi0xLTEuaHRtbA==\">https://www.52pojie.cn/thread-1148892-1-1.html</span></li>\n</ul>\n</li>\n<li>\n<p>编译 ROM</p>\n<ul>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuNTJwb2ppZS5jbi90aHJlYWQtMTM4MjY4OC0xLTEuaHRtbA==\">https://www.52pojie.cn/thread-1382688-1-1.html</span></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n",
            "tags": [
                "逆向学习",
                "逆向",
                "安卓",
                "Frida",
                "抓包"
            ]
        },
        {
            "id": "https://winston950213.github.io/2021/05/19/%E5%86%8D%E8%AF%BB-%E5%9B%BE%E8%A7%A3HTTP/",
            "url": "https://winston950213.github.io/2021/05/19/%E5%86%8D%E8%AF%BB-%E5%9B%BE%E8%A7%A3HTTP/",
            "title": "再读[图解HTTP]",
            "date_published": "2021-05-18T15:27:53.000Z",
            "content_html": "<p>总的来说，这本书就好像是一本介绍 http 协议的发展史和一些基本的概念，基本没有很晦涩的概念</p>\n<p><span id=\"more\"></span></p>\n<h3 id=\"网络基础\"><a class=\"anchor\" href=\"#网络基础\">#</a> 网络基础</h3>\n<h4 id=\"tcpip-协议簇\"><a class=\"anchor\" href=\"#tcpip-协议簇\">#</a> TCP/IP 协议簇</h4>\n<ul>\n<li>TCP/IP 协议簇 是互联网中所有协议的总称</li>\n</ul>\n<p><img data-src=\"/images/legacy/20210521003401.png\" alt=\"文章插图\" /></p>\n<ul>\n<li>TCP/IP 数据传输</li>\n</ul>\n<p><img data-src=\"/images/legacy/20210521003445.png\" alt=\"文章插图\" /></p>\n<blockquote>\n<p>TCP/IP 的模型是分为四层，OSI 网络模型是七层，不过有的人也分为五层</p>\n</blockquote>\n<p><img data-src=\"/images/legacy/20210521004109.png\" alt=\"文章插图\" /></p>\n<ul>\n<li>\n<p>DNS 域名解析服务</p>\n<p>通过域名查找 IP 地址，或通过 IP 地址查找域名</p>\n</li>\n<li>\n<p>三次握手与四次挥手</p>\n<p><img data-src=\"/images/legacy/20210521010819.png\" alt=\"文章插图\" /></p>\n</li>\n</ul>\n<blockquote>\n<p>在第三次握手的时候是可以传输数据的</p>\n</blockquote>\n<p><img data-src=\"/images/legacy/20210521010903.png\" alt=\"文章插图\" /></p>\n<h3 id=\"http-协议\"><a class=\"anchor\" href=\"#http-协议\">#</a> HTTP 协议</h3>\n<ul>\n<li>HTTP 协议无法保存状态</li>\n<li>HTTP 协议必须有客户端先发起请求</li>\n<li>HTTP 常用的请求方法\n<ul>\n<li>get, post, put, delete, options 等</li>\n</ul>\n</li>\n<li>URL 和 URI\n<ul>\n<li>...</li>\n</ul>\n</li>\n<li>由于 HTTP 是无状态且每进行一次 HTTP 通信就要断开一次 TCP 连接，所以为解决这些局限就产生了很多骚操作\n<ul>\n<li>升级 HTTP 协议，建立一次 TCP 连接进行多次 HTTP 请求</li>\n<li>不等待响应，类似现在的异步</li>\n<li>使用 cookie 保存用户状态，避免多次请求</li>\n</ul>\n</li>\n</ul>\n<h3 id=\"http-报文信息\"><a class=\"anchor\" href=\"#http-报文信息\">#</a> HTTP 报文信息</h3>\n<blockquote>\n<p>这章感觉没什么实质的东西，主要就是编码，压缩和报文字段的解释</p>\n</blockquote>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuaHVhd2VpY2xvdWQuY29tL2FydGljbGVzLzE2ZTZmYzBmOTVjZDMyYTk1ZGJmOWFlNWFhODU2MTkzLmh0bWw=\">http 报文头各字段详细含义</span></p>\n<h3 id=\"http-状态码\"><a class=\"anchor\" href=\"#http-状态码\">#</a> HTTP 状态码</h3>\n<blockquote>\n<p>约定俗成的规矩，不遵守也没事.</p>\n</blockquote>\n<p><img data-src=\"/images/legacy/20210521012126.png\" alt=\"文章插图\" /></p>\n<h3 id=\"http-协议与-web-服务器\"><a class=\"anchor\" href=\"#http-协议与-web-服务器\">#</a> HTTP 协议与 WEB 服务器</h3>\n<ul>\n<li>\n<p>单台服务器托管多个域名</p>\n<p>脑子抽了，还去专门开了两个虚拟机去做实验，虚拟出来的服务器的内网 ip 地址是不同的，所以在内网访问的话，ip 地址不同所以不冲突。如果穿透到公网的话就会冲突，这样就需要将域名的 80 端口映射到 ip 地址不同的端口了.</p>\n</li>\n<li>\n<p>数据转发</p>\n<ul>\n<li>代理 (此处指的是代理服务器)\n<ul>\n<li>缓存代理服务器：将内容缓存到服务器上，如果请求的源内容未更新，则从缓存服务器返回</li>\n<li>透明代理服务器：对内容不做处理，反之则成为非透明服务器</li>\n<li>代理服务器可有多级，以  <code>Via</code>  首部进行区分</li>\n</ul>\n</li>\n<li>网关\n<ul>\n<li>网关可将 HTTP 协议转化为其他协议</li>\n<li>网关可以加密协议内容</li>\n<li>网关可以用各种方式去提高通信的安全性</li>\n</ul>\n</li>\n<li>隧道\n<ul>\n<li>进行加密通信内容</li>\n<li>将通信内容进行中转，一般用于远距离传输，防止信号衰弱</li>\n</ul>\n</li>\n</ul>\n</li>\n<li>\n<p>缓存</p>\n<ul>\n<li>客户端缓存</li>\n<li>缓存服务器缓存</li>\n<li>缓存有效时间</li>\n</ul>\n</li>\n</ul>\n<h3 id=\"http-首部\"><a class=\"anchor\" href=\"#http-首部\">#</a> HTTP 首部</h3>\n<blockquote>\n<p>都是一些常见的首部，不常见的用的也不多</p>\n</blockquote>\n<h3 id=\"https\"><a class=\"anchor\" href=\"#https\">#</a> HTTPS</h3>\n<blockquote>\n<p><code>HTTPS</code>  就是 披着 SSL 外壳的 HTTP</p>\n</blockquote>\n<ul>\n<li>\n<p>HTTPS 加密方式:</p>\n<ul>\n<li>HTTPS 为了安全性使用混合加密方式对通信内容加密\n<ul>\n<li>不使用对称加密是因为对称加密加解密的密钥相同，而且很容易倒推出原文</li>\n<li>使用混合加密方式，就是公开两把密钥，发送信息时使用对方公开的密钥进行加密，这样在对方接收到信息时就可以使用自己的密钥进行解密，避免了发送密钥时，密钥遭到窃取从而影响信息安全性</li>\n<li>公开两把密钥的缺点：无法确定公开的密钥一定是对方公开的且真实存在的密钥</li>\n</ul>\n</li>\n<li>由于公开密钥的问题诞生了证书认证机构 CA\n<ul>\n<li><img data-src=\"/images/legacy/20210522033046.png\" alt=\"文章插图\" /></li>\n<li>证书机构的信誉很重要</li>\n</ul>\n</li>\n</ul>\n</li>\n<li>\n<p>HTTPS 通信流程</p>\n<ul>\n<li><img data-src=\"/images/legacy/20210522033145.png\" alt=\"文章插图\" /></li>\n</ul>\n</li>\n</ul>\n<h3 id=\"通信中用户身份的认证\"><a class=\"anchor\" href=\"#通信中用户身份的认证\">#</a> 通信中用户身份的认证</h3>\n<blockquote>\n<p>感觉现在大多是表单认证了，其他不是很多</p>\n</blockquote>\n<ul>\n<li>HTTP1.1 认证方式</li>\n<li><img data-src=\"/images/legacy/20210522033419.png\" alt=\"文章插图\" /></li>\n</ul>\n<h3 id=\"基于-http-协议的追加协议\"><a class=\"anchor\" href=\"#基于-http-协议的追加协议\">#</a> 基于 HTTP 协议的追加协议</h3>\n<blockquote>\n<p>随着时代的发展，人们对网络传输的要求越来越高，于是诞生了许多解决 HTTP 协议痛点的追加协议</p>\n</blockquote>\n<ul>\n<li>\n<p>Ajax 技术</p>\n</li>\n<li>\n<p>Comet 通信</p>\n</li>\n<li>\n<p>SPDY [为何会话层在表示层上面表示不理解]</p>\n<ul>\n<li><img data-src=\"/images/legacy/20210522033840.png\" alt=\"文章插图\" /></li>\n<li>多路复用</li>\n<li>请求优先级</li>\n<li>压缩 HTTP 首部</li>\n<li>推送功能</li>\n<li>服务器提示功能</li>\n</ul>\n</li>\n<li>\n<p>WebScocket</p>\n<ul>\n<li><img data-src=\"/images/legacy/20210522035359.png\" alt=\"文章插图\" /></li>\n</ul>\n</li>\n<li>\n<p>HTTP2.0</p>\n<ul>\n<li>作者写的时候还不成熟，但是现在已经在普及了</li>\n</ul>\n</li>\n<li>\n<p>服务器管理文件的 WebDAV</p>\n</li>\n</ul>\n<h3 id=\"构建-web-内容技术\"><a class=\"anchor\" href=\"#构建-web-内容技术\">#</a> 构建 WEB 内容技术</h3>\n<ul>\n<li>\n<p>静态 HTML</p>\n</li>\n<li>\n<p>动态 HTML</p>\n</li>\n<li>\n<p>WEB 应用</p>\n<ul>\n<li>CGI</li>\n<li>Servlet</li>\n</ul>\n</li>\n<li>\n<p>数据发布格式与语言</p>\n<ul>\n<li>XML</li>\n<li>HTML</li>\n<li>JSON</li>\n</ul>\n</li>\n</ul>\n<h3 id=\"web-攻击技术\"><a class=\"anchor\" href=\"#web-攻击技术\">#</a> WEB 攻击技术</h3>\n<blockquote>\n<p>参考资料</p>\n</blockquote>\n<ol>\n<li>&lt;&lt;图解 HTTP&gt;&gt;</li>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly96aHVhbmxhbi56aGlodS5jb20vcC8yNjgxOTY1MjU=\">OSI 七层模型和 TCP/IP 四层模型以及五层模型</span></li>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly95dWhvbmdqdW4uZ2l0aHViLmlvL3RlY2gvMjAyMC8xMS8zMC8lRTclOUMlOEIlRTYlODclODJIVFRQUy0lRTglQUYlODElRTQlQjklQTYlRTYlOUMlQkElRTYlOUUlODQtQ0EtJUU4JUFGJTgxJUU0JUI5JUE2LSVFNiU5NSVCMCVFNSVBRCU5NyVFNyVBRCVCRSVFNSU5MCU4RC0lRTclQTclODElRTklOTIlQTUtJUU1JTg1JUFDJUU5JTkyJUE1Lmh0bWw=\">看懂 HTTPS、证书机构（CA）、证书、数字签名、私钥、公钥</span></li>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly96aHVhbmxhbi56aGlodS5jb20vcC81MzM3NDUxNg==\">“三次握手，四次挥手” 你真的懂吗？</span></li>\n</ol>\n",
            "tags": [
                "读书笔记",
                "网络",
                "基础"
            ]
        },
        {
            "id": "https://winston950213.github.io/2021/05/10/%E6%A8%B1%E8%8A%B1/",
            "url": "https://winston950213.github.io/2021/05/10/%E6%A8%B1%E8%8A%B1/",
            "title": "樱花",
            "date_published": "2021-05-10T01:12:53.000Z",
            "content_html": "<p>实战樱花 app, 难度：有手就行，参数：请求  <code>req</code></p>\n<p><span id=\"more\"></span></p>\n<h2 id=\"抓包\"><a class=\"anchor\" href=\"#抓包\">#</a> 抓包</h2>\n<p>安装好之后先抓包，这次使用的是小黄鸟 + pixel</p>\n<blockquote>\n<p>由于之前在 N5x 上面小黄鸟打开抓包之后 VPN 图标并不能正常出现，这次换了一个版本好了，就可以用了 (孕气好)</p>\n</blockquote>\n<p><img data-src=\"/images/legacy/20210510172226.png\" alt=\"文章插图\" /></p>\n<p>通过抓包可以看到服务器地址为:  <code>http://vip.yinlu.online/v1/svc/sms</code></p>\n<p>参数:  <code>req=5rbFBgelHwvqcXtwsVAfWiMkqJ1cXwuEGEZmyEgOFjrmxVGEMK5jsTYpH1MHbo3yiPMCrO4J8OFeEw7HJyIH0qewUwcbSbH9fJ4N+Yz5ihb9cfCfFT8wnD+GOVy6x6ltWOVHjBNwwOqEzMTbDIFG0rD6CSwwwQBgteVJGiu7iRimwhkILBODqrqqgmmBTrKp0TxdgiLSwRbB6mXJhFItE1VXLhNlhZgbIz1L3DyN4gSmfPjXi79RkZTEqm8wE/wgZ0V4OVElEPWb7B6AA5MrVYWlbjse9Ht85SuLnUFYU1EqAPDq8/T52y6q5rtem1fP3n6Nq/HIU80z52ift5bibQdHDm/Vb3P0wm0hKnFk4UP5/dCZmUPbbSKKbQJQLslRL5vwjYEf7My2QDYysyeidd/ZlfsoF1K3ryB3jv/fg+3J+2XURyyB2eh9WbouB9T0kwYzvXts/jJmlH8HE5ZVCA==</code></p>\n<h2 id=\"参数分析\"><a class=\"anchor\" href=\"#参数分析\">#</a> 参数分析</h2>\n<p>使用 jadx 打开 apk, 可以看到只是混淆了并没有加壳，搜索  <code>v1/svc/sms</code>  可知:</p>\n<p><img data-src=\"/images/legacy/20210510172742.png\" alt=\"文章插图\" /></p>\n<p>点进去可以看到下面有个 code get , 然后右键  <code>Find usage</code>  , 只有两个结果看看就看到结果了</p>\n<p><img data-src=\"/images/legacy/20210510173124.png\" alt=\"文章插图\" /></p>\n<p>使用 objection 快速验证  <code>e.h.a.f.h.e</code>  为收集参数值，在查看  <code>com.dasc.base_self_innovate.base_network.NetWorkStringUtil</code>  为调用加解密.</p>\n<p><img data-src=\"/images/legacy/20210510174332.png\" alt=\"文章插图\" /></p>\n<p><img data-src=\"/images/legacy/20210510174419.png\" alt=\"文章插图\" /></p>\n<p>不继续分析了，其中有个  <code>sign</code>  , 其实静态分析一下就行.</p>\n",
            "tags": [
                "逆向学习",
                "逆向",
                "安卓",
                "Frida",
                "抓包"
            ]
        },
        {
            "id": "https://winston950213.github.io/2021/05/07/%E7%A7%BB%E5%8A%A8TV/",
            "url": "https://winston950213.github.io/2021/05/07/%E7%A7%BB%E5%8A%A8TV/",
            "title": "移动TV",
            "date_published": "2021-05-06T20:22:10.000Z",
            "content_html": "<p>实战移动 TV, 只分析了登录注册</p>\n<p><span id=\"more\"></span></p>\n<blockquote>\n<p>更多详细内容可以参考指纹大佬的文章 ===&gt; <span class=\"exturl\" data-url=\"aHR0cHM6Ly9iYnMucGVkaXkuY29tL3RocmVhZC0yNTg3NzYuaHRt\">https://bbs.pediy.com/thread-258776.htm</span></p>\n</blockquote>\n<h2 id=\"抓包\"><a class=\"anchor\" href=\"#抓包\">#</a> 抓包</h2>\n<p>指纹大佬文章说的抓不到包于是就上了 hook 抓包，hook 抓包是可以的，但是也可以使用  <code>postern + charles</code>  , 在抓包这里没必要纠结太久 (-- 珍惜大佬), 使用 httpcanary 也行.<br />\n 登录:<br />\n<img data-src=\"/images/legacy/20210507134616.png\" alt=\"文章插图\" /><br />\n注册:<br />\n<img data-src=\"/images/legacy/20210507134713.png\" alt=\"文章插图\" /></p>\n<p>可以看到校验还是比较少的，需要分析参数也就  <code>memi1</code>  ,  <code>key</code>  ,  <code>rightkey</code>  .</p>\n<h2 id=\"脱壳\"><a class=\"anchor\" href=\"#脱壳\">#</a> 脱壳</h2>\n<p>脱壳工具现在有很多了，我这里使用的是 youpk, 使用方法很简单，只需要配置一下就可以，前提是有一台 pixel1</p>\n<p>作者文章 ===&gt; <span class=\"exturl\" data-url=\"aHR0cHM6Ly9iYnMucGVkaXkuY29tL3RocmVhZC0yNTk4NTQuaHRt\">https://bbs.pediy.com/thread-259854.htm</span></p>\n<h2 id=\"参数分析\"><a class=\"anchor\" href=\"#参数分析\">#</a> 参数分析</h2>\n<table>\n<thead>\n<tr>\n<th>参数</th>\n<th>值</th>\n<th>处理</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>name</td>\n<td>1111111</td>\n<td>传入</td>\n</tr>\n<tr>\n<td>pass</td>\n<td>123123</td>\n<td>传入</td>\n</tr>\n<tr>\n<td>memi1</td>\n<td>afb9d9b6577c0397</td>\n<td>android id 写死</td>\n</tr>\n<tr>\n<td>key</td>\n<td>3820....dd72</td>\n<td>包签名，写死</td>\n</tr>\n<tr>\n<td>rightkey</td>\n<td>376035775</td>\n<td>包签名，写死</td>\n</tr>\n<tr>\n<td>register</td>\n<td>register</td>\n<td>register 字符串，login 同理</td>\n</tr>\n</tbody>\n</table>\n<blockquote>\n<p>apk 签名是不变的，android id 如果是要大批量生成，hook  <code>android.os.Build</code>  应该可以，没测试</p>\n</blockquote>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\">#内部类处理方法</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>android hooking search classes android.provider.Settings</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>android hooking <span class=\"token function\">watch</span> class_method android.provider.Settings<span class=\"token variable\">$Secure</span>.getString --dump-args --dump-backtrace --dump-return</pre></td></tr></table></figure><blockquote>\n<p>从哪里看出来，meli1 是 Android id?</p>\n</blockquote>\n<p>这个 app 做了一定的混淆，把关键逻辑放到线程中去执行，这样打出来的调用栈就只有 Thread.run. 但是看到 onclick 方法:  <code>v()</code>  返回的就是  <code>android id</code></p>\n<p><img data-src=\"/images/legacy/20210507142705.png\" alt=\"文章插图\" /></p>\n<h2 id=\"尾声\"><a class=\"anchor\" href=\"#尾声\">#</a> 尾声</h2>\n<p>至于基于协议的登录注册，有手就行。我就不贴了</p>\n<p>基本 objection 可以一把梭分析</p>\n",
            "tags": [
                "逆向学习",
                "逆向",
                "安卓",
                "Frida",
                "抓包"
            ]
        },
        {
            "id": "https://winston950213.github.io/2021/04/22/%E7%BA%A6%E5%8D%95/",
            "url": "https://winston950213.github.io/2021/04/22/%E7%BA%A6%E5%8D%95/",
            "title": "约单",
            "date_published": "2021-04-21T16:13:06.000Z",
            "content_html": "<p>约单 app 导游模块分析</p>\n<p><span id=\"more\"></span></p>\n<h2 id=\"抓包\"><a class=\"anchor\" href=\"#抓包\">#</a> 抓包</h2>\n<blockquote>\n<p>这里使用 postern + charles 抓包</p>\n</blockquote>\n<p><img data-src=\"/images/legacy/20210422205012.png\" alt=\"文章插图\" /></p>\n<h2 id=\"静态分析\"><a class=\"anchor\" href=\"#静态分析\">#</a> 静态分析</h2>\n<blockquote>\n<p>通过抓包结果可知响应是加密的，请求参数也需要看一下。经过 jadx 静态反编译可以得知:</p>\n</blockquote>\n<table>\n<thead>\n<tr>\n<th>参数</th>\n<th>分析结果</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>GET</td>\n<td>请求方式</td>\n</tr>\n<tr>\n<td><code>/api3.0/user/box</code></td>\n<td><code>api&#123;https://and.iyuedan.com/api3.0/user/box&#125;</code></td>\n</tr>\n<tr>\n<td><code>?tdid=388b6b40d00b627ce448595e2910f28d6</code></td>\n<td></td>\n</tr>\n<tr>\n<td><code>&amp;time=1618816116054</code></td>\n<td>时间戳</td>\n</tr>\n<tr>\n<td><code>&amp;oaid=null</code></td>\n<td>写死</td>\n</tr>\n<tr>\n<td><code>&amp;token=1650097369I622d07d4e9IW66029678</code></td>\n<td>deviceId 写死</td>\n</tr>\n<tr>\n<td><code>&amp;role=1</code></td>\n<td>写死</td>\n</tr>\n<tr>\n<td><code>&amp;version=6.1.6</code></td>\n<td>写死</td>\n</tr>\n<tr>\n<td><code>&amp;sversion=1</code></td>\n<td>写死</td>\n</tr>\n<tr>\n<td><code>&amp;client=android</code></td>\n<td>写死</td>\n</tr>\n<tr>\n<td><code>&amp;device=Nexus 5X</code></td>\n<td>写死</td>\n</tr>\n<tr>\n<td><code>&amp;appname=yuedan</code></td>\n<td>写死</td>\n</tr>\n<tr>\n<td><code>&amp;market=xiaomi</code></td>\n<td>写死</td>\n</tr>\n<tr>\n<td><code>&amp;os_version=27</code></td>\n<td>写死</td>\n</tr>\n<tr>\n<td><code>&amp;new_work=27</code></td>\n<td>写死</td>\n</tr>\n<tr>\n<td><code>&amp;lang=cn</code></td>\n<td>写死</td>\n</tr>\n<tr>\n<td><code>&amp;ydmd=tmBmKE!VuK&gt;H&gt;E!_^K&gt;H&gt;</code></td>\n<td>母鸡，写死</td>\n</tr>\n<tr>\n<td><code>&amp;and_class_name=Activity_UserInfo_V2</code></td>\n<td>写死</td>\n</tr>\n<tr>\n<td><code>&amp;user_id=53745578</code></td>\n<td>用户 id 写死</td>\n</tr>\n<tr>\n<td><code>&amp;position=2</code></td>\n<td>写死</td>\n</tr>\n<tr>\n<td><code>&amp;ydtoken=6f9e3deb3afa8e2ccd4f015ca06fcef9</code></td>\n<td></td>\n</tr>\n<tr>\n<td><code>HTTP/1.1</code></td>\n<td>http 协议</td>\n</tr>\n</tbody>\n</table>\n<p>经过分析，tdid 是不变化的，也有可能是登陆时候生成的 (没有分析), 接下来搜索  <code>ydtoken</code></p>\n<p><img data-src=\"/images/legacy/20210423140255.png\" alt=\"文章插图\" /></p>\n<p>进过分析这里最为可疑，然后点进去看一下</p>\n<p><img data-src=\"/images/legacy/20210423140918.png\" alt=\"文章插图\" /></p>\n<p>可以看到这里是 MD5 加密，但是还是需要开启 objection 看一下.</p>\n<p><img data-src=\"/images/legacy/20210423141809.png\" alt=\"文章插图\" /></p>\n<p>但是在网页端使用 MD5 加密将原本的字符串加密之后结果并不一样，怀疑加盐了或者是自写的 MD5 加密，（但是一般不会是自写算法）. 我第一次在找盐的时候想错了。简单方法可以直接 hook 这个 md5 算法这样就会知道了</p>\n<blockquote>\n<p>接着分析响应加密</p>\n</blockquote>\n<p>具体怎么找到的我也忘记了，只记得先找到了这个 decrypt 函数</p>\n<p><img data-src=\"/images/legacy/20210423155651.png\" alt=\"文章插图\" /></p>\n<p>然后写 frida 脚本测试一下是可以调用成功的，但是在把算法抠出来写入却始终报错，然后再试了试 hook  <code>convert</code>  .</p>\n<p><img data-src=\"/images/legacy/20210423160545.png\" alt=\"文章插图\" /></p>\n<p>将这里的  <code>sohoKeyMap</code>  和  <code>devKeyMap</code>  重写，这样解密算法就完成了</p>\n<p>至于如何做成接口调用这不是有手就行？</p>\n<blockquote>\n<p>使用 springboot (不得不说 java 的代码是真的繁琐)</p>\n</blockquote>\n<h4 id=\"tips\"><a class=\"anchor\" href=\"#tips\">#</a> tips</h4>\n<ol>\n<li>\n<p>脱壳</p>\n<p>我使用的是 yang 神的脱壳工具 <span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL2xhc3RpbmcteWFuZy9mcmlkYV9kdW1w\">https://github.com/lasting-yang/frida_dump</span></p>\n</li>\n<li>\n<p>合并 dex</p>\n<p>合并 dex 的方法有多种方法，我使用的是</p>\n<blockquote>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL1NpbXAxZXIvQW5kcm9pZFNlYy9ibG9iL21hc3Rlci9kZXgyYXBrLnB5\">https://github.com/Simp1er/AndroidSec/blob/master/dex2apk.py</span></p>\n</blockquote>\n</li>\n</ol>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> os</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">import</span> zipfile</pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">import</span> argparse</pre></td></tr><tr><td data-num=\"4\"></td><td><pre></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">rename_class</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>    files <span class=\"token operator\">=</span> os<span class=\"token punctuation\">.</span>listdir<span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>    dex_index <span class=\"token operator\">=</span> <span class=\"token number\">0</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>    <span class=\"token keyword\">if</span> path<span class=\"token punctuation\">.</span>endswith<span class=\"token punctuation\">(</span><span class=\"token string\">'/'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>        path <span class=\"token operator\">=</span> path<span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>files<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>        <span class=\"token keyword\">if</span> files<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>endswith<span class=\"token punctuation\">(</span><span class=\"token string\">'.dex'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>            old_name <span class=\"token operator\">=</span> path <span class=\"token operator\">+</span> <span class=\"token string\">'/'</span> <span class=\"token operator\">+</span> files<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>            <span class=\"token keyword\">if</span> dex_index <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>                new_name <span class=\"token operator\">=</span> path <span class=\"token operator\">+</span> <span class=\"token string\">'/'</span> <span class=\"token operator\">+</span> <span class=\"token string\">'classes.dex'</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>            <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>                new_name <span class=\"token operator\">=</span> path <span class=\"token operator\">+</span> <span class=\"token string\">'/'</span> <span class=\"token operator\">+</span> <span class=\"token string\">'classes%d.dex'</span> <span class=\"token operator\">%</span> dex_index</pre></td></tr><tr><td data-num=\"18\"></td><td><pre>            dex_index <span class=\"token operator\">+=</span> <span class=\"token number\">1</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>            <span class=\"token keyword\">if</span> os<span class=\"token punctuation\">.</span>path<span class=\"token punctuation\">.</span>exists<span class=\"token punctuation\">(</span>new_name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>                <span class=\"token keyword\">continue</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>            os<span class=\"token punctuation\">.</span>rename<span class=\"token punctuation\">(</span>old_name<span class=\"token punctuation\">,</span> new_name<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'[*] 重命名完毕'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre></pre></td></tr><tr><td data-num=\"24\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">extract_META_INF_from_apk</span><span class=\"token punctuation\">(</span>apk_path<span class=\"token punctuation\">,</span> target_path<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre>    r <span class=\"token operator\">=</span> zipfile<span class=\"token punctuation\">.</span>is_zipfile<span class=\"token punctuation\">(</span>apk_path<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre>    <span class=\"token keyword\">if</span> r<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre>        fz <span class=\"token operator\">=</span> zipfile<span class=\"token punctuation\">.</span>ZipFile<span class=\"token punctuation\">(</span>apk_path<span class=\"token punctuation\">,</span> <span class=\"token string\">'r'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre>        <span class=\"token keyword\">for</span> <span class=\"token builtin\">file</span> <span class=\"token keyword\">in</span> fz<span class=\"token punctuation\">.</span>namelist<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre>            <span class=\"token keyword\">if</span> <span class=\"token builtin\">file</span><span class=\"token punctuation\">.</span>startswith<span class=\"token punctuation\">(</span><span class=\"token string\">'META-INF'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre>                fz<span class=\"token punctuation\">.</span>extract<span class=\"token punctuation\">(</span><span class=\"token builtin\">file</span><span class=\"token punctuation\">,</span> target_path<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre>    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre>        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'[-] %s 不是一个APK文件'</span> <span class=\"token operator\">%</span> apk_path<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre></pre></td></tr><tr><td data-num=\"34\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">zip_dir</span><span class=\"token punctuation\">(</span>dirname<span class=\"token punctuation\">,</span> zipfilename<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre>    filelist <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre>    <span class=\"token keyword\">if</span> os<span class=\"token punctuation\">.</span>path<span class=\"token punctuation\">.</span>isfile<span class=\"token punctuation\">(</span>dirname<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre>        <span class=\"token keyword\">if</span> dirname<span class=\"token punctuation\">.</span>endswith<span class=\"token punctuation\">(</span><span class=\"token string\">'.dex'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"38\"></td><td><pre>            filelist<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>dirname<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"39\"></td><td><pre>    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre>        <span class=\"token keyword\">for</span> root<span class=\"token punctuation\">,</span> dirs<span class=\"token punctuation\">,</span> files <span class=\"token keyword\">in</span> os<span class=\"token punctuation\">.</span>walk<span class=\"token punctuation\">(</span>dirname<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"41\"></td><td><pre>            <span class=\"token keyword\">for</span> <span class=\"token builtin\">dir</span> <span class=\"token keyword\">in</span> dirs<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"42\"></td><td><pre>                <span class=\"token comment\"># if dir == 'META-INF':</span></pre></td></tr><tr><td data-num=\"43\"></td><td><pre>                <span class=\"token comment\"># print('dir:', os.path.join(root, dir))</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre>                filelist<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>os<span class=\"token punctuation\">.</span>path<span class=\"token punctuation\">.</span>join<span class=\"token punctuation\">(</span>root<span class=\"token punctuation\">,</span> <span class=\"token builtin\">dir</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"45\"></td><td><pre>            <span class=\"token keyword\">for</span> name <span class=\"token keyword\">in</span> files<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"46\"></td><td><pre>                <span class=\"token comment\"># print('file:', os.path.join(root, name))</span></pre></td></tr><tr><td data-num=\"47\"></td><td><pre></pre></td></tr><tr><td data-num=\"48\"></td><td><pre>                filelist<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>os<span class=\"token punctuation\">.</span>path<span class=\"token punctuation\">.</span>join<span class=\"token punctuation\">(</span>root<span class=\"token punctuation\">,</span> name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"49\"></td><td><pre></pre></td></tr><tr><td data-num=\"50\"></td><td><pre>    z <span class=\"token operator\">=</span> zipfile<span class=\"token punctuation\">.</span>ZipFile<span class=\"token punctuation\">(</span>zipfilename<span class=\"token punctuation\">,</span> <span class=\"token string\">'w'</span><span class=\"token punctuation\">,</span> zipfile<span class=\"token punctuation\">.</span>ZIP_DEFLATED<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"51\"></td><td><pre>    <span class=\"token keyword\">for</span> tar <span class=\"token keyword\">in</span> filelist<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"52\"></td><td><pre>        arcname <span class=\"token operator\">=</span> tar<span class=\"token punctuation\">[</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>dirname<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"53\"></td><td><pre></pre></td></tr><tr><td data-num=\"54\"></td><td><pre>        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'META-INF'</span> <span class=\"token keyword\">in</span> arcname <span class=\"token keyword\">or</span> arcname<span class=\"token punctuation\">.</span>endswith<span class=\"token punctuation\">(</span><span class=\"token string\">'.dex'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">and</span> <span class=\"token string\">'.DS_Store'</span> <span class=\"token keyword\">not</span> <span class=\"token keyword\">in</span> arcname<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"55\"></td><td><pre>            <span class=\"token comment\"># print(tar + \" -->rar: \" + arcname)</span></pre></td></tr><tr><td data-num=\"56\"></td><td><pre>            z<span class=\"token punctuation\">.</span>write<span class=\"token punctuation\">(</span>tar<span class=\"token punctuation\">,</span> arcname<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"57\"></td><td><pre>    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'[*] APK打包成功，你可以拖入APK进行分析啦！'</span>  <span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"58\"></td><td><pre>    z<span class=\"token punctuation\">.</span>close<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"59\"></td><td><pre></pre></td></tr><tr><td data-num=\"60\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">parse_args</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"61\"></td><td><pre>    parser <span class=\"token operator\">=</span> argparse<span class=\"token punctuation\">.</span>ArgumentParser<span class=\"token punctuation\">(</span>description<span class=\"token operator\">=</span><span class=\"token string\">'repackage dumped dex to apk for jeb/jadx analysis.'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"62\"></td><td><pre>    parser<span class=\"token punctuation\">.</span>add_argument<span class=\"token punctuation\">(</span><span class=\"token string\">'-a'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'--apk_path'</span><span class=\"token punctuation\">,</span> required<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">type</span><span class=\"token operator\">=</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"63\"></td><td><pre>                        <span class=\"token builtin\">help</span><span class=\"token operator\">=</span><span class=\"token string\">'apk for extracting META-INF'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"64\"></td><td><pre>    parser<span class=\"token punctuation\">.</span>add_argument<span class=\"token punctuation\">(</span><span class=\"token string\">'-i'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'--dex_path'</span><span class=\"token punctuation\">,</span> required<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">type</span><span class=\"token operator\">=</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"65\"></td><td><pre>                        <span class=\"token builtin\">help</span><span class=\"token operator\">=</span><span class=\"token string\">'path of dumped dex'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"66\"></td><td><pre>    parser<span class=\"token punctuation\">.</span>add_argument<span class=\"token punctuation\">(</span><span class=\"token string\">'-o'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'--output'</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">type</span><span class=\"token operator\">=</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">,</span> default<span class=\"token operator\">=</span><span class=\"token string\">\"repacked.apk\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"67\"></td><td><pre>                        <span class=\"token builtin\">help</span><span class=\"token operator\">=</span><span class=\"token string\">'apk path after zip'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"68\"></td><td><pre>    args <span class=\"token operator\">=</span> parser<span class=\"token punctuation\">.</span>parse_args<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"69\"></td><td><pre>    <span class=\"token comment\">#print(args.apk_path)</span></pre></td></tr><tr><td data-num=\"70\"></td><td><pre>    <span class=\"token keyword\">return</span> args</pre></td></tr><tr><td data-num=\"71\"></td><td><pre></pre></td></tr><tr><td data-num=\"72\"></td><td><pre><span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"73\"></td><td><pre>    args <span class=\"token operator\">=</span> parse_args<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"74\"></td><td><pre>    rename_class<span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">.</span>dex_path<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"75\"></td><td><pre>    extract_META_INF_from_apk<span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">.</span>apk_path<span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">.</span>dex_path<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"76\"></td><td><pre>    <span class=\"token comment\"># zip_file(args.dex_path)</span></pre></td></tr><tr><td data-num=\"77\"></td><td><pre>    zip_dir<span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">.</span>dex_path<span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">.</span>output<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><p>​ 但是有时候我们也许不要合并，使用  <code>ls -Sr</code>  将 dex 按照大小排列，1.2.0 版本的 jadx 可以使用  <code>add files</code>  将 dex 添加到项目中但是我添加了 6 个之后就崩了，但是不影响分析.</p>\n",
            "tags": [
                "逆向学习",
                "逆向",
                "安卓",
                "Frida",
                "实战"
            ]
        },
        {
            "id": "https://winston950213.github.io/2021/03/26/frida-rpc-%E5%AD%A6%E4%B9%A0/",
            "url": "https://winston950213.github.io/2021/03/26/frida-rpc-%E5%AD%A6%E4%B9%A0/",
            "title": "frida rpc 学习",
            "date_published": "2021-03-25T23:55:06.000Z",
            "content_html": "<p>Frida RPC 学习记录</p>\n<p><span id=\"more\"></span></p>\n<h2 id=\"rpc-开发环境搭建\"><a class=\"anchor\" href=\"#rpc-开发环境搭建\">#</a> RPC 开发环境搭建</h2>\n<blockquote>\n<p>抄代码的地方 ===&gt; <span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL2ZyaWRhL2ZyaWRhLXB5dGhvbg==\">https://github.com/frida/frida-python</span></p>\n</blockquote>\n<p>由于我们使用的是 frida-rpc,RPC 环境其实就是 frida 环境，只是多了一个内网穿透的搭建，这里使用的是 NPS, 具体可以详见<a href=\"#%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F\">内网穿透</a></p>\n<h2 id=\"java-层主动调用\"><a class=\"anchor\" href=\"#java-层主动调用\">#</a> Java 层主动调用</h2>\n<blockquote>\n<p>先写 hook</p>\n<p>再写主动调用</p>\n</blockquote>\n<p>在拿到一个 apk 时，首先要找一下 MainActivity,  <code>grep -ril &quot;MainActivty&quot; *</code>  尤其是脱壳之后的 dex, 但是这里我们的 apk 比较简单，用 jadx 静态分析一下就可以.</p>\n<blockquote>\n<p>objection 试试</p>\n</blockquote>\n<ol>\n<li>\n<p>搜索<br />\n <code>android hooking search classes MainActivity</code></p>\n</li>\n<li>\n<p>hook 打参数及调用栈</p>\n<p><code>android hooking watch class com.example.demoso1.MainActivity --dump-args --dump-backtrace --dump-return</code></p>\n</li>\n<li>\n<p>写 frida 脚本</p>\n</li>\n</ol>\n<figure class=\"highlight javascript\"><figcaption data-lang=\"javascript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">hook</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>   Java<span class=\"token punctuation\">.</span><span class=\"token function\">perform</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>       <span class=\"token keyword\">var</span> MainActivity <span class=\"token operator\">=</span> Java<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"com.example.demoso1.MainActivity\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>       MainActivity<span class=\"token punctuation\">.</span>method01<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">implementation</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">str</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>           <span class=\"token keyword\">var</span> s1 <span class=\"token operator\">=</span> <span class=\"token string\">\"123123\"</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>           <span class=\"token keyword\">var</span> result <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">method01</span><span class=\"token punctuation\">(</span>s1<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>           console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"str ===> \"</span><span class=\"token punctuation\">,</span> str<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>           console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"s1 ===> \"</span><span class=\"token punctuation\">,</span> s1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>           console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"result ===> \"</span><span class=\"token punctuation\">,</span> result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>           <span class=\"token keyword\">return</span> result</pre></td></tr><tr><td data-num=\"11\"></td><td><pre>       <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>   <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure><ol start=\"4\">\n<li>写主动调用脚本</li>\n</ol>\n<figure class=\"highlight javascript\"><figcaption data-lang=\"javascript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">fridamethod01</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">plaintext</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>    <span class=\"token keyword\">var</span> result<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    Java<span class=\"token punctuation\">.</span><span class=\"token function\">perform</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>        <span class=\"token keyword\">var</span> MainActivity <span class=\"token operator\">=</span> Java<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"com.example.demoso1.MainActivity\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>        <span class=\"token keyword\">var</span> JavaString <span class=\"token operator\">=</span> Java<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"java.lang.String\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>        result <span class=\"token operator\">=</span> MainActivity<span class=\"token punctuation\">.</span><span class=\"token function\">method01</span><span class=\"token punctuation\">(</span>JavaString<span class=\"token punctuation\">.</span>$<span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span>plaintext<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    <span class=\"token keyword\">return</span> result<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">fridamethod02</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ciphertext</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>    <span class=\"token keyword\">var</span> result<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>    Java<span class=\"token punctuation\">.</span><span class=\"token function\">perform</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>        <span class=\"token keyword\">var</span> JavaString <span class=\"token operator\">=</span> Java<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"java.lang.String\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>        Java<span class=\"token punctuation\">.</span><span class=\"token function\">choose</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"com.example.demoso1.MainActivity\"</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>            <span class=\"token function-variable function\">onMatch</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">instanca</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>                result <span class=\"token operator\">=</span> instanca<span class=\"token punctuation\">.</span><span class=\"token function\">method02</span><span class=\"token punctuation\">(</span>JavaString<span class=\"token punctuation\">.</span>$<span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span>ciphertext<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>            <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">,</span><span class=\"token function\">onComplete</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre>    <span class=\"token keyword\">return</span> result<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure><ol start=\"5\">\n<li>制作 RPC</li>\n</ol>\n<figure class=\"highlight javascript\"><figcaption data-lang=\"javascript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>rpc<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>    <span class=\"token literal-property property\">fridamethod01</span><span class=\"token operator\">:</span>fridamethod01<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    <span class=\"token literal-property property\">fridamethod02</span><span class=\"token operator\">:</span>fridamethod02<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure><ol start=\"6\">\n<li>\n<p>暴露接口到公网</p>\n<p>详见<a href=\"#%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F\">内网穿透</a></p>\n</li>\n<li>\n<p>优化</p>\n<blockquote>\n<p>由于  <code>fridamethod02</code>  方法中需要使用到  <code>Java.choose()</code>  , 这个操作非常耗时，我们为了节省时间将这部分代码抽出，但是<strong>这种操作非常危险，万一获取不到 handle 会造成严重后果</strong>，由于 MainActivity 一定存在就这样干了，但是其他类也许可以也许不可以.</p>\n</blockquote>\n</li>\n</ol>\n<figure class=\"highlight javascript\"><figcaption data-lang=\"javascript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">var</span> MainActivityHandle<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>Java<span class=\"token punctuation\">.</span><span class=\"token function\">perform</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    <span class=\"token comment\">// var JavaString = Java.use(\"java.lang.String\");</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token comment\">// result = MainActivity.method02(JavaString.$new(ciphertext));</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>    Java<span class=\"token punctuation\">.</span><span class=\"token function\">choose</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"com.example.demoso1.MainActivity\"</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>        <span class=\"token function-variable function\">onMatch</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">instanca</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>            MainActivityHandle <span class=\"token operator\">=</span> instanca<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>            <span class=\"token comment\">// result = instanca.method02(JavaString.$new(ciphertext));</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">,</span><span class=\"token function\">onComplete</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre><span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h2 id=\"so-层主动调用\"><a class=\"anchor\" href=\"#so-层主动调用\">#</a> So 层主动调用</h2>\n<blockquote>\n<p>普通 hook</p>\n<p>replace hook</p>\n<p>env, jclass,jobject,jsring 构造</p>\n<p>启动 rpc 服务并测试<br />\n部署到公网</p>\n</blockquote>\n<ol>\n<li>普通 hook</li>\n</ol>\n<figure class=\"highlight javascript\"><figcaption data-lang=\"javascript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">hook_method</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">addr</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>    Interceptor<span class=\"token punctuation\">.</span><span class=\"token function\">attach</span><span class=\"token punctuation\">(</span>addr<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>        <span class=\"token function-variable function\">onEnter</span><span class=\"token operator\">:</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">args</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>            console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"args[0] ===> \"</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>            console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"args[1] ===> \"</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>            console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"args[2] ===> \"</span><span class=\"token punctuation\">,</span> Java<span class=\"token punctuation\">.</span>vm<span class=\"token punctuation\">.</span><span class=\"token function\">getEnv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getStringUtfChars</span><span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">readCString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">,</span><span class=\"token function-variable function\">onLeave</span><span class=\"token operator\">:</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">retvel</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>            console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"retvel is ===> \"</span><span class=\"token punctuation\">,</span>Java<span class=\"token punctuation\">.</span>vm<span class=\"token punctuation\">.</span><span class=\"token function\">getEnv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getStringUtfChars</span><span class=\"token punctuation\">(</span>retvel<span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">readCString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure><ol start=\"2\">\n<li>replace hook</li>\n</ol>\n<figure class=\"highlight javascript\"><figcaption data-lang=\"javascript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">replacehook</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">addr</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>    <span class=\"token keyword\">var</span> addrfunc <span class=\"token operator\">=</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">NativeFunction</span><span class=\"token punctuation\">(</span>addr<span class=\"token punctuation\">,</span> <span class=\"token string\">\"pointer\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"pointer\"</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"pointer\"</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"pointer\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    Interceptor<span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span>addr<span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">NativeCallback</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">arg1<span class=\"token punctuation\">,</span> arg2<span class=\"token punctuation\">,</span> arg3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"args[2] ===> \"</span><span class=\"token punctuation\">,</span> Java<span class=\"token punctuation\">.</span>vm<span class=\"token punctuation\">.</span><span class=\"token function\">getEnv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getStringUtfChars</span><span class=\"token punctuation\">(</span>arg3<span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">readCString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>        <span class=\"token keyword\">var</span> result <span class=\"token operator\">=</span> <span class=\"token function\">addrfunc</span><span class=\"token punctuation\">(</span>arg1<span class=\"token punctuation\">,</span> arg2<span class=\"token punctuation\">,</span> arg3<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"retvel is ===> \"</span><span class=\"token punctuation\">,</span>Java<span class=\"token punctuation\">.</span>vm<span class=\"token punctuation\">.</span><span class=\"token function\">getEnv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getStringUtfChars</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">readCString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>        <span class=\"token keyword\">return</span> result<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"pointer\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"pointer\"</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"pointer\"</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"pointer\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure><ol start=\"3\">\n<li>\n<p>env, jclass,jobject,jsring 构造</p>\n<blockquote>\n<p>由于肉丝姐在上课时的案例中没有用到  <code>jobject</code>  和  <code>jclass</code>  , 所以只要传个指针过去就行，  <code>jstring</code>  也是个指针，在实际情况中不建议这么做，构造代码初次骨头大佬</p>\n</blockquote>\n</li>\n</ol>\n<figure class=\"highlight javascript\"><figcaption data-lang=\"javascript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">var</span> javaClass <span class=\"token operator\">=</span> Java<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"com.example.demoso1.MainActivity\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">var</span> <span class=\"token constant\">JCLASS</span> <span class=\"token operator\">=</span> javaClass<span class=\"token punctuation\">.</span><span class=\"token function\">$getClassHandle</span><span class=\"token punctuation\">(</span>Java<span class=\"token punctuation\">.</span>vm<span class=\"token punctuation\">.</span><span class=\"token function\">tryGetEnv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">var</span> <span class=\"token constant\">JOBJECT</span> <span class=\"token operator\">=</span> javaClass<span class=\"token punctuation\">.</span><span class=\"token function\">$getClassHandle</span><span class=\"token punctuation\">(</span>Java<span class=\"token punctuation\">.</span>vm<span class=\"token punctuation\">.</span><span class=\"token function\">tryGetEnv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr></table></figure><ol start=\"4\">\n<li>启动 rpc 服务并测试</li>\n</ol>\n<figure class=\"highlight javascript\"><figcaption data-lang=\"javascript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">invokemethod01</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">text</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"ENV is ===> \"</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">ENV</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    <span class=\"token comment\">// console.log(\"method01 is ===> \", method01addr);</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token keyword\">var</span> method01 <span class=\"token operator\">=</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">NativeFunction</span><span class=\"token punctuation\">(</span>method01addr<span class=\"token punctuation\">,</span> <span class=\"token string\">\"pointer\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"pointer\"</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"pointer\"</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"pointer\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>    <span class=\"token keyword\">var</span> NewStringUTF <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">NativeFunction</span><span class=\"token punctuation\">(</span>addrNewStringUTF<span class=\"token punctuation\">,</span><span class=\"token string\">'pointer'</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token string\">'pointer'</span><span class=\"token punctuation\">,</span><span class=\"token string\">'pointer'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>    <span class=\"token keyword\">var</span> result<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>    <span class=\"token comment\">// var result = method01(env, jclass, jstring);</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>    Java<span class=\"token punctuation\">.</span><span class=\"token function\">perform</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>        <span class=\"token keyword\">var</span> javaClass <span class=\"token operator\">=</span> Java<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"com.example.demoso1.MainActivity\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>        <span class=\"token comment\">// var JSTRING =Java.vm.getEnv().newStringUtf(Java.vm.getEnv(), Memory.allocUtf8String(\"123123123123\"))</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>        <span class=\"token keyword\">var</span> <span class=\"token constant\">JSTRING</span> <span class=\"token operator\">=</span> <span class=\"token function\">NewStringUTF</span><span class=\"token punctuation\">(</span>Java<span class=\"token punctuation\">.</span>vm<span class=\"token punctuation\">.</span><span class=\"token function\">getEnv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>Memory<span class=\"token punctuation\">.</span><span class=\"token function\">allocUtf8String</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>        <span class=\"token keyword\">var</span> <span class=\"token constant\">JCLASS</span> <span class=\"token operator\">=</span> javaClass<span class=\"token punctuation\">.</span><span class=\"token function\">$getClassHandle</span><span class=\"token punctuation\">(</span>Java<span class=\"token punctuation\">.</span>vm<span class=\"token punctuation\">.</span><span class=\"token function\">tryGetEnv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>        <span class=\"token comment\">// var result = method01(env, jclass, jstring);</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>        result <span class=\"token operator\">=</span> <span class=\"token function\">method01</span><span class=\"token punctuation\">(</span>Java<span class=\"token punctuation\">.</span>vm<span class=\"token punctuation\">.</span><span class=\"token function\">getEnv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">JCLASS</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">JSTRING</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>        <span class=\"token comment\">// console.log(\"result is ===> \", result)</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>        <span class=\"token comment\">// console.log(\"readCString result is ===> \", Java.vm.getEnv().getStringUtfChars(result, null).readCString())</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>        <span class=\"token comment\">// console.log(\"Memory.readCString result is ===> \", Memory.readCString(Java.vm.getEnv().getStringUtfChars(result, null)))</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>        result <span class=\"token operator\">=</span> Java<span class=\"token punctuation\">.</span>vm<span class=\"token punctuation\">.</span><span class=\"token function\">getEnv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getStringUtfChars</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">readCString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>    <span class=\"token keyword\">return</span> result</pre></td></tr><tr><td data-num=\"22\"></td><td><pre></pre></td></tr><tr><td data-num=\"23\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">invokemethod02</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">textenc</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre>    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"ENV is ===> \"</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">ENV</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre>    <span class=\"token comment\">// console.log(\"method02 is ===> \", method02addr);</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre>    <span class=\"token keyword\">var</span> method02 <span class=\"token operator\">=</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">NativeFunction</span><span class=\"token punctuation\">(</span>method02addr<span class=\"token punctuation\">,</span> <span class=\"token string\">\"pointer\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"pointer\"</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"pointer\"</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"pointer\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre>    <span class=\"token keyword\">var</span> NewStringUTF <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">NativeFunction</span><span class=\"token punctuation\">(</span>addrNewStringUTF<span class=\"token punctuation\">,</span><span class=\"token string\">'pointer'</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token string\">'pointer'</span><span class=\"token punctuation\">,</span><span class=\"token string\">'pointer'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre>    <span class=\"token keyword\">var</span> result<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre>    <span class=\"token comment\">// var result = method02(env, jobject, jstring);</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre>    Java<span class=\"token punctuation\">.</span><span class=\"token function\">perform</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre>        <span class=\"token comment\">// var JSTRING =Java.vm.getEnv().newStringUtf(Java.vm.getEnv(), Memory.allocUtf8String(\"123123123123\"))</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre>        <span class=\"token keyword\">var</span> javaClass <span class=\"token operator\">=</span> Java<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"com.example.demoso1.MainActivity\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre>        <span class=\"token keyword\">var</span> <span class=\"token constant\">JSTRING</span> <span class=\"token operator\">=</span> <span class=\"token function\">NewStringUTF</span><span class=\"token punctuation\">(</span>Java<span class=\"token punctuation\">.</span>vm<span class=\"token punctuation\">.</span><span class=\"token function\">getEnv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>Memory<span class=\"token punctuation\">.</span><span class=\"token function\">allocUtf8String</span><span class=\"token punctuation\">(</span>textenc<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre>        <span class=\"token keyword\">var</span> <span class=\"token constant\">JOBJECT</span> <span class=\"token operator\">=</span> javaClass<span class=\"token punctuation\">.</span><span class=\"token function\">$getClassHandle</span><span class=\"token punctuation\">(</span>Java<span class=\"token punctuation\">.</span>vm<span class=\"token punctuation\">.</span><span class=\"token function\">tryGetEnv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre>        <span class=\"token comment\">// var result = method02(env, jobject, jstring);</span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre>        result <span class=\"token operator\">=</span> <span class=\"token function\">method02</span><span class=\"token punctuation\">(</span>Java<span class=\"token punctuation\">.</span>vm<span class=\"token punctuation\">.</span><span class=\"token function\">getEnv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">JOBJECT</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">JSTRING</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"38\"></td><td><pre>        <span class=\"token comment\">// console.log(\"result is ===> \", result)</span></pre></td></tr><tr><td data-num=\"39\"></td><td><pre>        <span class=\"token comment\">// console.log(\"readCString result is ===> \", Java.vm.getEnv().getStringUtfChars(result, null).readCString())</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre>        <span class=\"token comment\">// console.log(\"Memory.readCString result is ===> \", Memory.readCString(Java.vm.getEnv().getStringUtfChars(result, null)))</span></pre></td></tr><tr><td data-num=\"41\"></td><td><pre>        result <span class=\"token operator\">=</span> Java<span class=\"token punctuation\">.</span>vm<span class=\"token punctuation\">.</span><span class=\"token function\">getEnv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getStringUtfChars</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">readCString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"42\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"43\"></td><td><pre>    <span class=\"token keyword\">return</span>  result<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"45\"></td><td><pre></pre></td></tr><tr><td data-num=\"46\"></td><td><pre><span class=\"token comment\">// RPC invoke SO step 4:</span></pre></td></tr><tr><td data-num=\"47\"></td><td><pre><span class=\"token comment\">// make exports</span></pre></td></tr><tr><td data-num=\"48\"></td><td><pre></pre></td></tr><tr><td data-num=\"49\"></td><td><pre>rpc<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"50\"></td><td><pre>    <span class=\"token literal-property property\">invoke1</span><span class=\"token operator\">:</span>invokemethod01<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"51\"></td><td><pre>    <span class=\"token literal-property property\">invoke2</span><span class=\"token operator\">:</span>invokemethod02<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"52\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure><blockquote>\n<p>测试详见<a href=\"#%E6%B5%8B%E8%AF%95\">测试</a></p>\n</blockquote>\n<ol start=\"5\">\n<li>\n<p>暴露到公网</p>\n<p>详见<a href=\"#%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F\">内网穿透</a></p>\n</li>\n</ol>\n<h2 id=\"测试\"><a class=\"anchor\" href=\"#测试\">#</a> 测试</h2>\n<blockquote>\n<p>curl/postman</p>\n<p>sige</p>\n</blockquote>\n<h3 id=\"连通性测试\"><a class=\"anchor\" href=\"#连通性测试\">#</a> 连通性测试</h3>\n<h4 id=\"curl\"><a class=\"anchor\" href=\"#curl\">#</a> curl</h4>\n<blockquote>\n<p>在开启服务之后简单测试接口是否通，可以用 curl, 更多操作可以参考:<span class=\"exturl\" data-url=\"aHR0cHM6Ly9jdXJsLnNlL2RvY3MvbWFucGFnZS5odG1s\">https://curl.se/docs/manpage.html</span></p>\n</blockquote>\n<p>笔者只会一条命令还是刚学会:</p>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">curl</span> <span class=\"token parameter variable\">-X</span> POST <span class=\"token parameter variable\">-H</span> <span class=\"token string\">\"Content-Type: application/json\"</span>     <span class=\"token parameter variable\">-d</span> <span class=\"token string\">'&#123;\"data\": \"zrail\"&#125;'</span>  http://127.0.0.1:5000/encrypt</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token function\">curl</span> <span class=\"token parameter variable\">-X</span> POST <span class=\"token parameter variable\">-H</span> <span class=\"token string\">\"Content-Type: application/json\"</span>     <span class=\"token parameter variable\">-d</span> <span class=\"token string\">'&#123;\"data\": \"4a61203f8a1b640818230269bd1059ea\"&#125;'</span>  http://127.0.0.1:5000/decrypt</pre></td></tr></table></figure><h4 id=\"postman\"><a class=\"anchor\" href=\"#postman\">#</a> postman</h4>\n<blockquote>\n<p>由于开发在虚拟机，postman 测试需要 :</p>\n</blockquote>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>app<span class=\"token punctuation\">.</span>run<span class=\"token punctuation\">(</span>host<span class=\"token operator\">=</span><span class=\"token string\">\"0.0.0.0\"</span><span class=\"token punctuation\">,</span> port<span class=\"token operator\">=</span><span class=\"token number\">50000</span><span class=\"token punctuation\">,</span> threaded<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">,</span> debug<span class=\"token operator\">=</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><blockquote>\n<p>至于传参使用  <code>formdata</code>  还是  <code>raw</code>  , 这就要看服务端怎么写了</p>\n</blockquote>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> json</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">from</span> flask <span class=\"token keyword\">import</span> Flask<span class=\"token punctuation\">,</span> request</pre></td></tr><tr><td data-num=\"3\"></td><td><pre></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>app <span class=\"token operator\">=</span> Flask<span class=\"token punctuation\">(</span>__name__<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token decorator annotation punctuation\">@app<span class=\"token punctuation\">.</span>route</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/encrypt'</span><span class=\"token punctuation\">,</span> methods<span class=\"token operator\">=</span><span class=\"token punctuation\">[</span><span class=\"token string\">'POST'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token comment\">#url 加密</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">encrypt_class</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>    data <span class=\"token operator\">=</span> request<span class=\"token punctuation\">.</span>get_data<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    json_data <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span>loads<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    postdata <span class=\"token operator\">=</span> json_data<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">\"data\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>    <span class=\"token comment\"># print(\"data ===> \",postdata)</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>    res <span class=\"token operator\">=</span> script<span class=\"token punctuation\">.</span>exports<span class=\"token punctuation\">.</span>invoke1<span class=\"token punctuation\">(</span>postdata<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>    <span class=\"token comment\"># print(\"res ===> \", res)</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>    <span class=\"token keyword\">return</span> res</pre></td></tr><tr><td data-num=\"15\"></td><td><pre></pre></td></tr><tr><td data-num=\"16\"></td><td><pre><span class=\"token decorator annotation punctuation\">@app<span class=\"token punctuation\">.</span>route</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/decrypt'</span><span class=\"token punctuation\">,</span> methods<span class=\"token operator\">=</span><span class=\"token punctuation\">[</span><span class=\"token string\">'POST'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token comment\">#data 解密</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">decrypt_class</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>    data <span class=\"token operator\">=</span> request<span class=\"token punctuation\">.</span>get_data<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>    json_data <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span>loads<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>    postdata <span class=\"token operator\">=</span> json_data<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">\"data\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>    res <span class=\"token operator\">=</span> script<span class=\"token punctuation\">.</span>exports<span class=\"token punctuation\">.</span>invoke2<span class=\"token punctuation\">(</span>postdata<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>    <span class=\"token keyword\">return</span> res</pre></td></tr><tr><td data-num=\"23\"></td><td><pre></pre></td></tr><tr><td data-num=\"24\"></td><td><pre><span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre>    <span class=\"token comment\"># app.run(host=\"0.0.0.0\", port=50000, threaded=True, debug=False)</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre>    app<span class=\"token punctuation\">.</span>run<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"压力测试\"><a class=\"anchor\" href=\"#压力测试\">#</a> 压力测试</h3>\n<h4 id=\"siege\"><a class=\"anchor\" href=\"#siege\">#</a> siege</h4>\n<blockquote>\n<p>其他系统可能需要编译，但是 kali 自带，直接安装</p>\n</blockquote>\n<blockquote>\n<p>具体操作参考: <span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuY25ibG9ncy5jb20vY2hlbnhpYW9tZW5nL3AvMTMxMzA1MjYuaHRtbA==\">https://www.cnblogs.com/chenxiaomeng/p/13130526.html</span></p>\n</blockquote>\n<blockquote>\n<p>siege 默认只支持 255 个并发数，可以自己自定义，修改 /root/.siege/siege.conf 下的 limit 数值。</p>\n</blockquote>\n<p>命令:</p>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>siege <span class=\"token parameter variable\">-c200</span> <span class=\"token parameter variable\">-r10</span> <span class=\"token string\">\"http://127.0.0.1:5000/decrypt POST &lt;./textenc.json\"</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>siege <span class=\"token parameter variable\">-c200</span> <span class=\"token parameter variable\">-r10</span> <span class=\"token string\">\"http://127.0.0.1:5000/decrypt POST &lt;./text.json\"</span></pre></td></tr></table></figure><figure class=\"highlight json\"><figcaption data-lang=\"JSON\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre># text.json</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>        <span class=\"token property\">\"data\"</span><span class=\"token operator\">:</span><span class=\"token string\">\"123123123123123123\"</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure><figure class=\"highlight json\"><figcaption data-lang=\"JSON\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre># textenc.json</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>        <span class=\"token property\">\"data\"</span><span class=\"token operator\">:</span><span class=\"token string\">\"53c6a31a21192365943a4f672fc97c7d\"</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure><blockquote>\n<p>据说 <strong>Jmeter</strong> 也挺好用，没试过</p>\n</blockquote>\n<h2 id=\"内网穿透\"><a class=\"anchor\" href=\"#内网穿透\">#</a> 内网穿透</h2>\n<blockquote>\n<p>将接口暴露至公网需要用到内网穿透工具，这里使用 NPS.github 地址:<span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL2VoYW5nLWlvL25wcw==\">https://github.com/ehang-io/nps</span></p>\n</blockquote>\n<h4 id=\"tips\"><a class=\"anchor\" href=\"#tips\">#</a> Tips</h4>\n<blockquote>\n<p>安装比较简单，文档也够详细，有手就行 (😿我手呢？😿). 这里记录几个坑点</p>\n</blockquote>\n<ol>\n<li>端口一定要开放，我就是一开始端口开少了.</li>\n<li>服务器开完端口之后需要等一会儿，这个时间长短不确定.</li>\n</ol>\n<h3 id=\"主动调用内网穿透的两种方式\"><a class=\"anchor\" href=\"#主动调用内网穿透的两种方式\">#</a> 主动调用，内网穿透的两种方式</h3>\n<h4 id=\"将-http-server-暴露至公网\"><a class=\"anchor\" href=\"#将-http-server-暴露至公网\">#</a> 将 http server 暴露至公网</h4>\n<p><img data-src=\"/images/legacy/20210324175443.png\" alt=\"文章插图\" /></p>\n<blockquote>\n<p>如果是此种方式，NPC 就是 linux 或者 windows 的版本</p>\n</blockquote>\n<h4 id=\"将-frida-server-暴露至公网\"><a class=\"anchor\" href=\"#将-frida-server-暴露至公网\">#</a> 将 frida server 暴露至公网</h4>\n<p><img data-src=\"/images/legacy/20210324180537.png\" alt=\"文章插图\" /></p>\n<blockquote>\n<p>此种方式 NPC 为 arm64 (手机). 模拟器应该是 x86 (没试过)</p>\n</blockquote>\n<h4 id=\"tips-2\"><a class=\"anchor\" href=\"#tips-2\">#</a> Tips</h4>\n<ol>\n<li>暴露 frida server 比暴露 http server 快，但是也没快多少</li>\n<li>感觉手机和网络是瓶颈，选什么框架并无关系</li>\n</ol>\n<p><strong>Todo</strong></p>\n<ul class=\"task-list\">\n<li class=\"task-list-item\"><input type=\"checkbox\" id=\"cbx_0\" disabled=\"true\" /><label for=\"cbx_0\"> 脱离 apk. 将 so 注入到设置</label></li>\n</ul>\n",
            "tags": [
                "逆向学习",
                "逆向",
                "安卓",
                "Frida"
            ]
        },
        {
            "id": "https://winston950213.github.io/2021/03/23/%E9%80%86%E5%90%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/",
            "url": "https://winston950213.github.io/2021/03/23/%E9%80%86%E5%90%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/",
            "title": "逆向环境搭建",
            "date_published": "2021-03-22T23:55:29.000Z",
            "content_html": "<p>基于 kali linux 2019 的逆向环境搭建</p>\n<p><span id=\"more\"></span></p>\n<blockquote>\n<p>本文基于 kali 2021.1, 种子地址:<span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cub2ZmZW5zaXZlLXNlY3VyaXR5LmNvbS9rYWxpLWxpbnV4LXZtLXZtd2FyZS12aXJ0dWFsYm94LWltYWdlLWRvd25sb2FkLw==\">https://www.offensive-security.com/kali-linux-vm-vmware-virtualbox-image-download/</span></p>\n</blockquote>\n<h2 id=\"基本配置\"><a class=\"anchor\" href=\"#基本配置\">#</a> 基本配置</h2>\n<h3 id=\"修改用户及密码\"><a class=\"anchor\" href=\"#修改用户及密码\">#</a> 修改用户及密码</h3>\n<blockquote>\n<p>kali 开机默认账号  <code>kali</code>  , 密码  <code>kali</code>  , 一般在 root 用户下工作 (切勿用于生产环境)</p>\n</blockquote>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">sudo</span> <span class=\"token function\">passwd</span> root</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>New password:toor</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>Retype new password:toor</pre></td></tr></table></figure><h3 id=\"同步时区\"><a class=\"anchor\" href=\"#同步时区\">#</a> 同步时区</h3>\n<blockquote>\n<p>新版本可能会自动修改时区，如为自动修改则使用以下方法:</p>\n</blockquote>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>dpkg-reconfigure tzdata</pre></td></tr></table></figure><p>然后选择  <code>Asia→Shanghai</code></p>\n<h3 id=\"安装中文字体\"><a class=\"anchor\" href=\"#安装中文字体\">#</a> 安装中文字体</h3>\n<blockquote>\n<p>有些网页中文显示为乱码，许安装中文字体。新版本可能已经安装，如未自动安装则使用以下方法:</p>\n</blockquote>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">apt</span> <span class=\"token function\">install</span> xfonts-intl-chinese</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token function\">apt</span> <span class=\"token function\">install</span> ttf-wqy-microhei</pre></td></tr></table></figure><h3 id=\"安装中文输入法\"><a class=\"anchor\" href=\"#安装中文输入法\">#</a> 安装中文输入法</h3>\n<blockquote>\n<p>一般不建议安装</p>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzMzNjQxL2FydGljbGUvZGV0YWlscy84OTMyNTU3Ng==\">https://blog.csdn.net/qq_42333641/article/details/89325576</span></p>\n</blockquote>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">apt-get</span> update</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token function\">apt-get</span> <span class=\"token function\">install</span> ibus ibus-pinyin</pre></td></tr></table></figure><blockquote>\n<p>配置如文中图</p>\n</blockquote>\n<p><img data-src=\"/images/legacy/20210316011939.png\" alt=\"文章插图\" /></p>\n<h3 id=\"修改电源设置\"><a class=\"anchor\" href=\"#修改电源设置\">#</a> 修改电源设置</h3>\n<blockquote>\n<p>更改电源设置，防止息屏</p>\n</blockquote>\n<p><img data-src=\"/images/legacy/20210316013039.png\" alt=\"文章插图\" /></p>\n<p><img data-src=\"/images/legacy/20210316013253.png\" alt=\"文章插图\" /></p>\n<h3 id=\"切换到-bash\"><a class=\"anchor\" href=\"#切换到-bash\">#</a> 切换到 bash</h3>\n<blockquote>\n<p>kali 2021.1 默认使用 zsh, 在某些时候会出现问题，所以切换到 bash</p>\n</blockquote>\n<p><code>zsh</code>  切换到  <code>bash</code></p>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>chsh <span class=\"token parameter variable\">-s</span> /bin/bash</pre></td></tr></table></figure><p><code>bash</code>  切换到  <code>zsh</code></p>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>chsh <span class=\"token parameter variable\">-s</span> /bin/zsh</pre></td></tr></table></figure><blockquote>\n<p>为防止重启终端不彻底直接  <code>reboot</code>  或者重启虚拟机使其生效</p>\n</blockquote>\n<blockquote>\n<p>检查当前使用的 shell</p>\n</blockquote>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token builtin class-name\">echo</span> <span class=\"token environment constant\">$SHELL</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token builtin class-name\">echo</span> <span class=\"token variable\">$0</span></pre></td></tr></table></figure><p>两个任选其一</p>\n<h3 id=\"增大历史缓存\"><a class=\"anchor\" href=\"#增大历史缓存\">#</a> 增大历史缓存</h3>\n<blockquote>\n<p>有时候 app 数据太多，防止丢失</p>\n</blockquote>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">nano</span> ~/.bashrc</pre></td></tr></table></figure><p><img data-src=\"/images/legacy/20210316014401.png\" alt=\"文章插图\" /></p>\n<p>在其后面增加三个 0,  <code>Ctrl</code>  +  <code>x</code>  +  <code>Y</code>  +  <code>Enter</code>  保存退出.</p>\n<p><code>source ~/.bashrc</code>  , 如果出现乱码，不要慌，  <code>reooot</code></p>\n<h2 id=\"工具安装\"><a class=\"anchor\" href=\"#工具安装\">#</a> 工具安装</h2>\n<h3 id=\"htop-jnettop-tree\"><a class=\"anchor\" href=\"#htop-jnettop-tree\">#</a> htop , jnettop, tree</h3>\n<p>更新源</p>\n<p><code>apt update</code></p>\n<p>安装</p>\n<p><code>apt install htop jnettop tree</code></p>\n<h3 id=\"安装-android-studio\"><a class=\"anchor\" href=\"#安装-android-studio\">#</a> 安装 Android Studio</h3>\n<blockquote>\n<p>建议在真机复制链接到虚拟机使用  <code>wget</code>   下载</p>\n</blockquote>\n<h4 id=\"下载\"><a class=\"anchor\" href=\"#下载\">#</a> 下载</h4>\n<p><code>wget //redirector.gvt1.com/edgedl/android/studio/ide-zips/4.1.2.0/android-studio-ide-201.7042882-linux.tar.gz</code></p>\n<h4 id=\"解压\"><a class=\"anchor\" href=\"#解压\">#</a> 解压</h4>\n<p>使用  <code>tar zxvf FileName.tar.gz</code>  解压</p>\n<h4 id=\"配置-adb\"><a class=\"anchor\" href=\"#配置-adb\">#</a> 配置 adb</h4>\n<blockquote>\n<p>如果默认安装 Android Studio 的话，adb 位置为  <code>PATH=/root/Android/Sdk/platform-tools</code></p>\n</blockquote>\n<ol>\n<li>执行在  <code>nano ~/.bashrc</code>  在 bashrc 中增加  <code>export PATH=/root/Android/Sdk/platform-tools:$PATH</code></li>\n<li>source 刷新</li>\n<li>输入 adb 不出现  <code>command not found</code>  则成功</li>\n</ol>\n<h4 id=\"启动\"><a class=\"anchor\" href=\"#启动\">#</a> 启动</h4>\n<ol>\n<li>进入 /root/android-studio/bin</li>\n<li><code>./studio.sh</code></li>\n</ol>\n<h4 id=\"初始化第一个-android-项目\"><a class=\"anchor\" href=\"#初始化第一个-android-项目\">#</a> 初始化第一个 Android 项目</h4>\n<blockquote>\n<p>empty app 相信大家都会</p>\n<p>静静等待初始化完成</p>\n</blockquote>\n<p>问题:</p>\n<blockquote>\n<p>在初始化 NDK 环境的时候会出现一个玄学问题</p>\n</blockquote>\n<p><img data-src=\"/images/legacy/20210316041950.jpg\" alt=\"文章插图\" /></p>\n<p>介绍几种解决方法:</p>\n<ul>\n<li>\n<p>大佬们的:</p>\n<ol>\n<li>\n<p>重新下载 SDK:</p>\n<p>由于没有领会到意思，我重新解压也未解决</p>\n</li>\n<li>\n<p>删除原来下载的 NDK 文件夹，开代理重新下载</p>\n<blockquote>\n<p>开代理下载的 NDK 和不开代理下载的 NDK 不同，此法为解决版本冲突</p>\n</blockquote>\n<p>我试验了此法，未解决</p>\n</li>\n<li>\n<p>手动下载 NDK</p>\n<blockquote>\n<p>在<span class=\"exturl\" data-url=\"aHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5nb29nbGUuY24vbmRrL2Rvd25sb2Fkcz9obD16aF9jbg==\"> https://developer.android.google.cn/ndk/downloads?hl=zh_cn</span> 下载 NDK, 手动配置</p>\n</blockquote>\n<p>未实验</p>\n</li>\n</ol>\n</li>\n<li>\n<p>我瞎猫碰着死耗子的做法</p>\n<blockquote>\n<p>瞎几把搜索，找到<span class=\"exturl\" data-url=\"aHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vc3R1ZGlvL3Byb2plY3RzL2luc3RhbGwtbmRrP2hsPXpoLWNu\"> https://developer.android.com/studio/projects/install-ndk?hl=zh-cn</span>, 于是我试着看看自己的 Android Studio</p>\n</blockquote>\n<p>安装 <strong>CMake</strong>, 就成功了</p>\n<p><img data-src=\"/images/legacy/20210323233719.png\" alt=\"文章插图\" /></p>\n</li>\n</ul>\n<blockquote>\n<p>由于 NDK 已经安装过，就不需要再安装，只安装 CMake, 此时也不需要特定版本 [毕竟不是专业开发者]</p>\n</blockquote>\n<h3 id=\"科学配置\"><a class=\"anchor\" href=\"#科学配置\">#</a> 科学配置</h3>\n<h4 id=\"命令行科学\"><a class=\"anchor\" href=\"#命令行科学\">#</a> 命令行科学</h4>\n<h5 id=\"proxychains\"><a class=\"anchor\" href=\"#proxychains\">#</a> proxychains</h5>\n<ul>\n<li>\n<p>配置</p>\n<p><code>nano /etc/proxychains4.conf</code></p>\n<ul>\n<li>注释掉 proxy-dns</li>\n<li>注释掉 socks4</li>\n<li>增加自己配置 (主机 ip + 科学端口)</li>\n</ul>\n<p><img data-src=\"/images/legacy/20210316021834.png\" alt=\"文章插图\" /></p>\n</li>\n</ul>\n<p><img data-src=\"/images/legacy/20210316021917.png\" alt=\"文章插图\" /></p>\n<blockquote>\n<p><strong>打开主机 VPN  <code>Allow LAN</code>  即 允许局域网连接</strong></p>\n</blockquote>\n<ul>\n<li>\n<p>验证是否成功</p>\n<p><code>proxychains curl ip.sb</code></p>\n</li>\n</ul>\n<blockquote>\n<p>输出不是自己 ip 即成功</p>\n</blockquote>\n<h4 id=\"redsocks\"><a class=\"anchor\" href=\"#redsocks\">#</a> redsocks</h4>\n<blockquote>\n<p>kali linux 自带，其他系统可能需要编译安装</p>\n<p>遗留问题：浏览器访问 google 有问题，但是其他正常</p>\n</blockquote>\n<ol>\n<li>修改配置文件<br />\n<img data-src=\"/images/legacy/20210316045229.png\" alt=\"文章插图\" /></li>\n</ol>\n<blockquote>\n<p>前面的 log 开关可改可不改<br />\n local_ip 与 local_port 可改可不改</p>\n</blockquote>\n<ol start=\"2\">\n<li><span class=\"exturl\" data-url=\"aHR0cDovL3huLS1pcHRhYmxlcy0wbjNtbTI3by5zaA==\">修改 iptables.sh</span></li>\n</ol>\n<p><img data-src=\"/images/legacy/20210316045602.png\" alt=\"文章插图\" /></p>\n<blockquote>\n<p>框中为你的主机地址</p>\n</blockquote>\n<ol start=\"3\">\n<li>启动</li>\n</ol>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>redsocks</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token comment\"># 使用 `iptables.sh` 进行流量转发</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token function\">sh</span> iptables.sh</pre></td></tr></table></figure><ol start=\"4\">\n<li>\n<p>验证</p>\n<ul>\n<li><code>ss -lntp|more</code>  查看监听端口</li>\n<li><code>ps aux | grep 进程名</code>  查看进程是否启动</li>\n<li><code>curl ip.sb</code></li>\n</ul>\n</li>\n<li>\n<p>其他操作系统参照</p>\n<blockquote>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pkeTBfMjAwNC9hcnRpY2xlL2RldGFpbHMvNDg0NzQ3MjE=\">https://blog.csdn.net/zdy0_2004/article/details/48474721</span></p>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuY25ibG9ncy5jb20vc2hhb2hlZi9wLzQ0Nzc4NjIuaHRtbA==\">https://www.cnblogs.com/shaohef/p/4477862.html</span></p>\n<blockquote>\n<p>笔者未实验</p>\n</blockquote>\n</blockquote>\n</li>\n</ol>\n<h3 id=\"安装-jadx\"><a class=\"anchor\" href=\"#安装-jadx\">#</a> 安装 jadx</h3>\n<ul>\n<li>在 github-releases 直接下载最新版 <span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL3NreWxvdC9qYWR4L3JlbGVhc2VzKCVFOCVCRiU4NyVFNyVBOCU4QiVFNSU4RiVBRiVFOCU4MyVCRCVFOSU5QyU4MCVFOCVBNiU4MSVFNyVBNyU5MSVFNSVBRCVBNik=\">https://github.com/skylot/jadx/releases (过程可能需要科学)</span></li>\n<li><code>proxychains wgethttps://github.com/skylot/jadx/releases/download/v1.2.0/jadx-1.2.0.zip</code></li>\n<li><code>7z x jadx-1.2.0.zip -ojadx1.2.0</code>  解压即可使用 [-o 指定解压后的文件夹名]</li>\n</ul>\n<h3 id=\"安装-pyenv\"><a class=\"anchor\" href=\"#安装-pyenv\">#</a> 安装 pyenv</h3>\n<blockquote>\n<p>安装尽量参照官方 README, 一般不会出现问题</p>\n<p>以下实验均在 kali linux bash 下运行</p>\n<p>官方地址 ==&gt; <span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL3B5ZW52L3B5ZW52\">https://github.com/pyenv/pyenv</span></p>\n</blockquote>\n<ol>\n<li>下载</li>\n</ol>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">git</span> clone https://github.com/pyenv/pyenv.git ~/.pyenv</pre></td></tr></table></figure><ol start=\"2\">\n<li>写入环境变量</li>\n</ol>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token builtin class-name\">echo</span> <span class=\"token string\">'export PYENV_ROOT=\"$HOME/.pyenv\"'</span> <span class=\"token operator\">>></span> ~/.bashrc</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token builtin class-name\">echo</span> <span class=\"token string\">'export PATH=\"$PYENV_ROOT/bin:$PATH\"'</span> <span class=\"token operator\">>></span> ~/.bashrc</pre></td></tr></table></figure><ol start=\"3\">\n<li>初始化</li>\n</ol>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token builtin class-name\">echo</span> <span class=\"token parameter variable\">-e</span> <span class=\"token string\">'if command -v pyenv 1>/dev/null 2>&amp;1; then\\n  eval \"$(pyenv init -)\"\\nfi'</span> <span class=\"token operator\">>></span> ~/.bashrc'</pre></td></tr></table></figure><ol start=\"4\">\n<li>刷新</li>\n</ol>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token builtin class-name\">exec</span> <span class=\"token string\">\"<span class=\"token environment constant\">$SHELL</span>\"</span></pre></td></tr></table></figure><ol start=\"5\">\n<li>安装编译依赖</li>\n</ol>\n<figure class=\"highlight text\"><figcaption data-lang=\"text\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>sudo apt-get update; sudo apt-get install --no-install-recommends make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev</pre></td></tr></table></figure><blockquote>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL3B5ZW52L3B5ZW52L3dpa2kjc3VnZ2VzdGVkLWJ1aWxkLWVudmlyb25tZW50\">https://github.com/pyenv/pyenv/wiki#suggested-build-environment</span></p>\n</blockquote>\n<ol start=\"6\">\n<li>\n<p>常用命令</p>\n<ul>\n<li>pyenv --version # 查看版本</li>\n<li>pyrnv versions # 查看已经安装的 Python 版本</li>\n<li>pyenv local 3.8.0 # 局部切换到 3.8.0</li>\n<li>pyenv global system # 全局切换到 system, 即系统版本</li>\n<li>pyenv --help # 查看帮助</li>\n</ul>\n</li>\n</ol>\n<h3 id=\"安装-miniconda\"><a class=\"anchor\" href=\"#安装-miniconda\">#</a> 安装 Miniconda</h3>\n<ul>\n<li>下载安装脚本: proxychains wget <span class=\"exturl\" data-url=\"aHR0cHM6Ly9yZXBvLmFuYWNvbmRhLmNvbS9taW5pY29uZGEvTWluaWNvbmRhMy1sYXRlc3QtTGludXgteDg2XzY0LnNo\">https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh</span></li>\n<li>给安装脚本可执行权限: chmod +x Miniconda3-latest-Linux-x86_64.sh</li>\n<li>运行安装脚本: sh Miniconda3-latest-Linux-x86_64.sh</li>\n<li>安装过程脚本会自动修改 /.bashrc 文件，在脚本运行完毕最好检查一下 /.bashrc 文件并 source ~/.bashrc 刷新一下</li>\n<li>安装 python3.8.0 环境:proxychains conda create -n py380 python=3.8.0</li>\n<li>切换到 python3.8.0: conda activate py380</li>\n<li>安装 frida 12.8.0 全家桶:</li>\n</ul>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>proxychains pip <span class=\"token function\">install</span> <span class=\"token assign-left variable\">frida</span><span class=\"token operator\">==</span><span class=\"token number\">12.8</span>.0</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>proxychains pip <span class=\"token function\">install</span> frida-tools<span class=\"token operator\">==</span><span class=\"token number\">5.3</span>.0</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>proxychains pip <span class=\"token function\">install</span> <span class=\"token assign-left variable\">objection</span><span class=\"token operator\">==</span><span class=\"token number\">1.8</span>.4</pre></td></tr></table></figure><ul>\n<li>初始化环境就在 python 3.8.0 下:\n<ul>\n<li>将 conda activate py380 写入～/.bashrc</li>\n<li>或将 alias mfrida=&quot;conda activate py380&quot; 写入～/.bashrc</li>\n<li>手动切换也不是不行🙃</li>\n</ul>\n</li>\n</ul>\n<blockquote>\n<p>环境隔离 Miniconda 和 pyenv 二选一 (建议选择 conda)</p>\n</blockquote>\n<h3 id=\"安装-010editer\"><a class=\"anchor\" href=\"#安装-010editer\">#</a> 安装 010editer</h3>\n<h4 id=\"安装\"><a class=\"anchor\" href=\"#安装\">#</a> 安装</h4>\n<ul>\n<li>官网下载 ==&gt;<span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuc3dlZXRzY2FwZS5jb20vMDEwZWRpdG9yLw==\">https://www.sweetscape.com/010editor/</span></li>\n<li>傻瓜式安装</li>\n</ul>\n<h4 id=\"破解\"><a class=\"anchor\" href=\"#破解\">#</a> 破解</h4>\n<blockquote>\n<p>破解可耻，请支持正版</p>\n<p><strong>无限试用法</strong></p>\n</blockquote>\n<p>root 用户下删除  <code>/root/.local/share/SweetScape/010 Editor</code>  和  <code>/root/.config/SweetScape</code></p>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">rm</span> <span class=\"token parameter variable\">-rf</span> /root/.config/SweetScape</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token function\">rm</span> <span class=\"token parameter variable\">-rf</span> /root/.local/share/SweetScape/010 Editor</pre></td></tr></table></figure><p>又来三十天</p>\n<blockquote>\n<p>分析文章 ==&gt; <span class=\"exturl\" data-url=\"aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2s3YXJtL2FydGljbGUvZGV0YWlscy8xMDg5MTQwMjQ=\">https://blog.csdn.net/k7arm/article/details/108914024</span></p>\n</blockquote>\n<h3 id=\"安装-vscode\"><a class=\"anchor\" href=\"#安装-vscode\">#</a> 安装 Vscode</h3>\n<ul>\n<li>官网下载 vscode  <code>proxychains wget https://vscode.cdn.azure.cn/stable/e5a624b788d92b8d34d1392e4c4d9789406efe8f/code_1.51.1-1605051630_amd64.deb</code></li>\n<li>dpkg -i &quot;刚才下载的 vscode&quot;</li>\n</ul>\n<h3 id=\"安装-jeb\"><a class=\"anchor\" href=\"#安装-jeb\">#</a> 安装 jeb</h3>\n<blockquote>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9iYnMucGVkaXkuY29tL3RocmVhZC0yNTk4OTUtMS5odG0=\">https://bbs.pediy.com/thread-259895-1.htm</span></p>\n</blockquote>\n<blockquote>\n<p>破解可耻，请支持正版</p>\n</blockquote>\n<h4 id=\"下载-2\"><a class=\"anchor\" href=\"#下载-2\">#</a> 下载</h4>\n<p>​ <span class=\"exturl\" data-url=\"aHR0cHM6Ly9tZWdhLm56L2ZpbGUvT0VKd1dhN0ojYW1vQUVhMEdHbldwV1hhUFl2R0JDM0U1RmpjaUdZUlhacFlpVVRGREU4SQ==\">https://mega.nz/file/OEJwWa7J#amoAEa0GGnWpWXaPYvGBC3E5FjciGYRXZpYiUTFDE8I</span><br />\n​ or<br />\n​ <span class=\"exturl\" data-url=\"aHR0cHM6Ly9taXIuY3IvMDlVSENBVEQ=\">https://mir.cr/09UHCATD</span></p>\n<h4 id=\"安装-2\"><a class=\"anchor\" href=\"#安装-2\">#</a> 安装</h4>\n<p>​ 解压运行  <code>./jeb_linux.sh</code></p>\n<h4 id=\"运行\"><a class=\"anchor\" href=\"#运行\">#</a> 运行</h4>\n<p>​ 输入密码  <code>ilbtcdnwiuypbzeo</code>  --&gt;  <code>Accept</code>  --&gt;  <code>manual</code>  激活 (用户名自己定义)---&gt; 拷贝  <code>License Data</code>  ---&gt; 使用 <strong>Python2</strong> 执行  <code>jebKeygen.py</code>  ---&gt; 粘贴  <code>License Data</code>  ---&gt; 拷贝 key---&gt; 粘贴到 jeb---&gt; 完成</p>\n<h3 id=\"安装-scrcpy\"><a class=\"anchor\" href=\"#安装-scrcpy\">#</a> 安装 scrcpy</h3>\n<blockquote>\n<p>在 kali 中使用无线投屏，结合 WiFiadb</p>\n</blockquote>\n<p><code>apt search scrcpy</code></p>\n<p><code>apt install scrcpy</code></p>\n<ol>\n<li>使用 adb connect 连接手机</li>\n<li>scrcpy 启动</li>\n</ol>\n<h3 id=\"安装-tmux\"><a class=\"anchor\" href=\"#安装-tmux\">#</a> 安装 tmux</h3>\n<blockquote>\n<p>遇事不决，翻译提示</p>\n<p>第一次启动出现一个让你执行  <code>touch ~/.hushlogin</code>  的提示，执行就完了</p>\n</blockquote>\n<h4 id=\"安装-3\"><a class=\"anchor\" href=\"#安装-3\">#</a> 安装</h4>\n<p><code>apt install tmux</code></p>\n<h4 id=\"运行-2\"><a class=\"anchor\" href=\"#运行-2\">#</a> 运行</h4>\n<p><code>tmux</code></p>\n<blockquote>\n<p>tmux 默认  <code>Ctrl</code>  +  <code>B</code>  为命令前缀</p>\n</blockquote>\n<p>更多操作命令</p>\n<blockquote>\n<p>可以参考阮一峰大佬的文章 ==&gt;<span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cucnVhbnlpZmVuZy5jb20vYmxvZy8yMDE5LzEwL3RtdXguaHRtbA==\">https://www.ruanyifeng.com/blog/2019/10/tmux.html</span></p>\n</blockquote>\n<h2 id=\"踩坑及备忘\"><a class=\"anchor\" href=\"#踩坑及备忘\">#</a> 踩坑及备忘</h2>\n<h3 id=\"vm\"><a class=\"anchor\" href=\"#vm\">#</a> VM</h3>\n<ul>\n<li>\n<p>vm 版本不要选择 15.0, 不要问为什么，问就是有坑，<s>16.0 没有试过</s> 16 目前没发现什么大问题，目前选择 15.5 也是可以的</p>\n</li>\n<li>\n<p>vm 虚拟网络问题</p>\n<p><img data-src=\"/images/legacy/20210316141907.png\" alt=\"文章插图\" /><br />\n<img data-src=\"/images/legacy/20210316141934.png\" alt=\"文章插图\" /><br />\n<img data-src=\"/images/legacy/20210316142000.png\" alt=\"文章插图\" /></p>\n</li>\n<li>\n<p>如果出现了实在无法解决的问题，且此时你不想重新解压一份虚拟机文件可以试试</p>\n<p><img data-src=\"/images/legacy/20210316142015.png\" alt=\"文章插图\" /></p>\n</li>\n<li>\n<p>如果还有无法解决的问题，重新解压虚拟机，重新配置🙃</p>\n</li>\n</ul>\n",
            "tags": [
                "逆向学习",
                "逆向",
                "安卓"
            ]
        }
    ]
}