Skip to content

Commit

Permalink
使用 Frida 定位 JNI 方法内存地址
Browse files Browse the repository at this point in the history
  • Loading branch information
CYRUS-STUDIO committed Oct 29, 2024
1 parent 87f56c7 commit d79e335
Show file tree
Hide file tree
Showing 9 changed files with 80 additions and 92 deletions.
13 changes: 5 additions & 8 deletions content/posts/frida脚本,自动化寻址JNI方法.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
+++
title = 'frida脚本,自动化寻址JNI方法'
date = 2024-10-29T16:59:40.349565+08:00
date = 2024-10-29T18:39:06.871634+08:00
draft = false
+++

Expand Down Expand Up @@ -217,13 +217,10 @@ if __name__ == "__main__":
methodName-> public static native java.lang.Object lte.NCall.IL(java.lang.Object[])
Func.offset== libGameVMP.so 0xDFA8
Func.getArtMethod->native_addr: 0X747DB9AFA8
[+] 地址 0x747db9afa8 所在模块信息:
- - 模块名称: libGameVMP.so
- - 基址: 0x747db8d000
- - 大小: 462848 bytes
[+] 地址 0x747db9afa8 所在模块信息
- 模块名称: libGameVMP.so
- 基址: 0x747db8d000
- 大小: 462848 bytes
```

具体原理可以参考这篇文章【[使用 Frida 定位 JNI 方法内存地址](https://cyrus-studio.github.io/blog/posts/%E4%BD%BF%E7%94%A8-frida-%E5%AE%9A%E4%BD%8D-jni-%E6%96%B9%E6%B3%95%E5%86%85%E5%AD%98%E5%9C%B0%E5%9D%80/)
Expand Down
39 changes: 18 additions & 21 deletions content/posts/使用 Frida 定位 JNI 方法内存地址.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
+++
title = '使用 Frida 定位 JNI 方法内存地址'
date = 2024-10-29T16:59:40.434242+08:00
date = 2024-10-29T18:42:24.390313+08:00
draft = false
+++

Expand Down Expand Up @@ -180,7 +180,7 @@ function printModuleInfo(address) {
const module = Process.findModuleByAddress(targetAddress);
if (module !== null) {
console.log("[+] 地址 " + targetAddress + " 所在模块信息");
console.log("[+] 地址 " + targetAddress + " 所在模块信息");
console.log(" - 模块名称: " + module.name);
console.log(" - 基址: " + module.base);
console.log(" - 大小: " + module.size + " bytes");
Expand Down Expand Up @@ -213,97 +213,94 @@ function printModuleInfo(address) {
methodName-> public static native byte lte.NCall.IB(java.lang.Object[])
Func.offset== libGameVMP.so 0xDFA8
Func.getArtMethod->native_addr: 0X747DB9AFA8
[+] 地址 0x747db9afa8 所在模块信息
[+] 地址 0x747db9afa8 所在模块信息
- 模块名称: libGameVMP.so
- 基址: 0x747db8d000
- 大小: 462848 bytes
methodName-> public static native char lte.NCall.IC(java.lang.Object[])
Func.offset== libGameVMP.so 0xDFA8
Func.getArtMethod->native_addr: 0X747DB9AFA8
[+] 地址 0x747db9afa8 所在模块信息
[+] 地址 0x747db9afa8 所在模块信息
- 模块名称: libGameVMP.so
- 基址: 0x747db8d000
- 大小: 462848 bytes
methodName-> public static native double lte.NCall.ID(java.lang.Object[])
Func.offset== libGameVMP.so 0xE028
Func.getArtMethod->native_addr: 0X747DB9B028
[+] 地址 0x747db9b028 所在模块信息
[+] 地址 0x747db9b028 所在模块信息
- 模块名称: libGameVMP.so
- 基址: 0x747db8d000
- 大小: 462848 bytes
methodName-> public static native float lte.NCall.IF(java.lang.Object[])
Func.offset== libGameVMP.so 0xDFE8
Func.getArtMethod->native_addr: 0X747DB9AFE8
[+] 地址 0x747db9afe8 所在模块信息
[+] 地址 0x747db9afe8 所在模块信息
- 模块名称: libGameVMP.so
- 基址: 0x747db8d000
- 大小: 462848 bytes
methodName-> public static native int lte.NCall.II(java.lang.Object[])
Func.offset== libGameVMP.so 0xDFA8
Func.getArtMethod->native_addr: 0X747DB9AFA8
[+] 地址 0x747db9afa8 所在模块信息
[+] 地址 0x747db9afa8 所在模块信息
- 模块名称: libGameVMP.so
- 基址: 0x747db8d000
- 大小: 462848 bytes
methodName-> public static native long lte.NCall.IJ(java.lang.Object[])
Func.offset== libGameVMP.so 0xDFA8
Func.getArtMethod->native_addr: 0X747DB9AFA8
[+] 地址 0x747db9afa8 所在模块信息
[+] 地址 0x747db9afa8 所在模块信息
- 模块名称: libGameVMP.so
- 基址: 0x747db8d000
- 大小: 462848 bytes
methodName-> public static native java.lang.Object lte.NCall.IL(java.lang.Object[])
Func.offset== libGameVMP.so 0xDFA8
Func.getArtMethod->native_addr: 0X747DB9AFA8
[+] 地址 0x747db9afa8 所在模块信息
[+] 地址 0x747db9afa8 所在模块信息
- 模块名称: libGameVMP.so
- 基址: 0x747db8d000
- 大小: 462848 bytes
methodName-> public static native short lte.NCall.IS(java.lang.Object[])
Func.offset== libGameVMP.so 0xDFA8
Func.getArtMethod->native_addr: 0X747DB9AFA8
[+] 地址 0x747db9afa8 所在模块信息
[+] 地址 0x747db9afa8 所在模块信息
- 模块名称: libGameVMP.so
- 基址: 0x747db8d000
- 大小: 462848 bytes
methodName-> public static native void lte.NCall.IV(java.lang.Object[])
Func.offset== libGameVMP.so 0xDFA8
Func.getArtMethod->native_addr: 0X747DB9AFA8
[+] 地址 0x747db9afa8 所在模块信息
[+] 地址 0x747db9afa8 所在模块信息
- 模块名称: libGameVMP.so
- 基址: 0x747db8d000
- 大小: 462848 bytes
methodName-> public static native boolean lte.NCall.IZ(java.lang.Object[])
Func.offset== libGameVMP.so 0xDFA8
Func.getArtMethod->native_addr: 0X747DB9AFA8
[+] 地址 0x747db9afa8 所在模块信息
[+] 地址 0x747db9afa8 所在模块信息
- 模块名称: libGameVMP.so
- 基址: 0x747db8d000
- 大小: 462848 bytes
methodName-> public static native int lte.NCall.dI(int)
Func.offset== libGameVMP.so 0xB93C
Func.getArtMethod->native_addr: 0X747DB9893C
[+] 地址 0x747db9893c 所在模块信息
[+] 地址 0x747db9893c 所在模块信息
- 模块名称: libGameVMP.so
- 基址: 0x747db8d000
- 大小: 462848 bytes
methodName-> public static native long lte.NCall.dL(long)
Func.offset== libGameVMP.so 0xBAD0
Func.getArtMethod->native_addr: 0X747DB98AD0
[+] 地址 0x747db98ad0 所在模块信息
[+] 地址 0x747db98ad0 所在模块信息
- 模块名称: libGameVMP.so
- 基址: 0x747db8d000
- 大小: 462848 bytes
methodName-> public static native java.lang.String lte.NCall.dS(java.lang.String)
Func.offset== libGameVMP.so 0xBAEC
Func.getArtMethod->native_addr: 0X747DB98AEC
[+] 地址 0x747db98aec 所在模块信息:
- - 模块名称: libGameVMP.so
- - 基址: 0x747db8d000
- - 大小: 462848 bytes
[+] 地址 0x747db98aec 所在模块信息
- 模块名称: libGameVMP.so
- 基址: 0x747db8d000
- 大小: 462848 bytes
```

比如,native 方法 lte.NCall.IL 在 libGameVMP.so 中偏移量为 0xDFA8。
Expand Down
8 changes: 4 additions & 4 deletions public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ <h1>CYRUS STUDIO</h1>
<ul class="posts-list">

<li class="posts-list-item">
<a class="posts-list-item-title" href="https://cyrus-studio.github.io/blog/posts/frida%E8%84%9A%E6%9C%AC%E8%87%AA%E5%8A%A8%E5%8C%96%E5%AF%BB%E5%9D%80jni%E6%96%B9%E6%B3%95/">frida脚本,自动化寻址JNI方法</a>
<a class="posts-list-item-title" href="https://cyrus-studio.github.io/blog/posts/%E4%BD%BF%E7%94%A8-frida-%E5%AE%9A%E4%BD%8D-jni-%E6%96%B9%E6%B3%95%E5%86%85%E5%AD%98%E5%9C%B0%E5%9D%80/">使用 Frida 定位 JNI 方法内存地址</a>
<span class="posts-list-item-description">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-calendar">
<title>calendar</title>
Expand All @@ -67,12 +67,12 @@ <h1>CYRUS STUDIO</h1>
<title>clock</title>
<circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline>
</svg>
3 min read
5 min read
</span>
</li>

<li class="posts-list-item">
<a class="posts-list-item-title" href="https://cyrus-studio.github.io/blog/posts/%E4%BD%BF%E7%94%A8-frida-%E5%AE%9A%E4%BD%8D-jni-%E6%96%B9%E6%B3%95%E5%86%85%E5%AD%98%E5%9C%B0%E5%9D%80/">使用 Frida 定位 JNI 方法内存地址</a>
<a class="posts-list-item-title" href="https://cyrus-studio.github.io/blog/posts/frida%E8%84%9A%E6%9C%AC%E8%87%AA%E5%8A%A8%E5%8C%96%E5%AF%BB%E5%9D%80jni%E6%96%B9%E6%B3%95/">frida脚本,自动化寻址JNI方法</a>
<span class="posts-list-item-description">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-calendar">
<title>calendar</title>
Expand All @@ -84,7 +84,7 @@ <h1>CYRUS STUDIO</h1>
<title>clock</title>
<circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline>
</svg>
5 min read
3 min read
</span>
</li>

Expand Down
18 changes: 9 additions & 9 deletions public/index.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,22 @@
<description>Recent content on CYRUS STUDIO</description>
<generator>Hugo</generator>
<language>zh-cn</language>
<lastBuildDate>Tue, 29 Oct 2024 16:59:40 +0800</lastBuildDate>
<lastBuildDate>Tue, 29 Oct 2024 18:42:24 +0800</lastBuildDate>
<atom:link href="https://cyrus-studio.github.io/blog/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>frida脚本,自动化寻址JNI方法</title>
<link>https://cyrus-studio.github.io/blog/posts/frida%E8%84%9A%E6%9C%AC%E8%87%AA%E5%8A%A8%E5%8C%96%E5%AF%BB%E5%9D%80jni%E6%96%B9%E6%B3%95/</link>
<pubDate>Tue, 29 Oct 2024 16:59:40 +0800</pubDate>
<guid>https://cyrus-studio.github.io/blog/posts/frida%E8%84%9A%E6%9C%AC%E8%87%AA%E5%8A%A8%E5%8C%96%E5%AF%BB%E5%9D%80jni%E6%96%B9%E6%B3%95/</guid>
<description>版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/&#xA;1. 通过 ArtMethod 结构体找到 jni 方法在内存中的地址,并把寻址方法通过 rpc.exports 暴露给 Python 脚本调用&#xA;jni_addr.js&#xA;let entry_point_from_jni_offset = -1;&#xD;/**&#xD;* 找到 entry_point_from_jni_ 在 ArtMethod 结构体中的偏移量(根据 Android 版本不同可能会变化)&#xD;*&#xD;* @returns {number} 返回 entry_point_from_jni_ 的偏移量,若未找到返回 -1&#xD;*/&#xD;function get_jni_offset() {&#xD;// 如果偏移量已经计算过(不为 -1),直接返回已保存的偏移量&#xD;if (entry_point_from_jni_offset !== -1) {&#xD;return entry_point_from_jni_offset;&#xD;}&#xD;// 获取 getUidForName JNI 方法的内存地址,该方法位于 &amp;#34;libandroid_runtime.so&amp;#34; 中&#xD;let native_addr = Module.findExportByName(&amp;#34;libandroid_runtime.so&amp;#34;, &amp;#34;_Z32android_os_Process_getUidForNameP7_JNIEnvP8_jobjectP8_jstring&amp;#34;);&#xD;// console.log(&amp;#34;native_addr:&amp;#34;,native_addr);&#xD;// 目标类名 &amp;#34;android.os.Process&amp;#34;&#xD;let className = &amp;#34;android.os.Process&amp;#34;;&#xD;// 使用 Java.</description>
</item>
<item>
<title>使用 Frida 定位 JNI 方法内存地址</title>
<link>https://cyrus-studio.github.io/blog/posts/%E4%BD%BF%E7%94%A8-frida-%E5%AE%9A%E4%BD%8D-jni-%E6%96%B9%E6%B3%95%E5%86%85%E5%AD%98%E5%9C%B0%E5%9D%80/</link>
<pubDate>Tue, 29 Oct 2024 16:59:40 +0800</pubDate>
<pubDate>Tue, 29 Oct 2024 18:42:24 +0800</pubDate>
<guid>https://cyrus-studio.github.io/blog/posts/%E4%BD%BF%E7%94%A8-frida-%E5%AE%9A%E4%BD%8D-jni-%E6%96%B9%E6%B3%95%E5%86%85%E5%AD%98%E5%9C%B0%E5%9D%80/</guid>
<description>版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/&#xA;java 调用 native 方法流程 ArtMethod 是 Android Runtime (ART) 中一个非常重要的数据结构,它在 Android 系统中用于表示每个 Java 方法。&#xA;entry_point_from_jni_ 是 ArtMethod 结构体的一个字段,专门用于存储一个 Java 方法的 JNI(Java Native Interface)入口点。&#xA;当 Java 代码调用一个 native 方法时,ART 会通过entry_point_from_jni_ 字段找到对应的 JNI 函数入口,然后切换到 C/C++ 层执行该方法。&#xA;确定 entry_point_from_jni 的偏移量_ 先通过查找 ART 中 ArtMethod 结构体中 entry_point_from_jni_ 的偏移量,最终确定 JNI 函数的地址。&#xA;let entry_point_from_jni_offset = -1;&#xD;/**&#xD;* 找到 entry_point_from_jni_ 在 ArtMethod 结构体中的偏移量(根据 Android 版本不同可能会变化)&#xD;*&#xD;* @returns {number} 返回 entry_point_from_jni_ 的偏移量,若未找到返回 -1&#xD;*/&#xD;function get_jni_offset() {&#xD;// 如果偏移量已经计算过(不为 -1),直接返回已保存的偏移量&#xD;if (entry_point_from_jni_offset !</description>
</item>
<item>
<title>frida脚本,自动化寻址JNI方法</title>
<link>https://cyrus-studio.github.io/blog/posts/frida%E8%84%9A%E6%9C%AC%E8%87%AA%E5%8A%A8%E5%8C%96%E5%AF%BB%E5%9D%80jni%E6%96%B9%E6%B3%95/</link>
<pubDate>Tue, 29 Oct 2024 18:39:06 +0800</pubDate>
<guid>https://cyrus-studio.github.io/blog/posts/frida%E8%84%9A%E6%9C%AC%E8%87%AA%E5%8A%A8%E5%8C%96%E5%AF%BB%E5%9D%80jni%E6%96%B9%E6%B3%95/</guid>
<description>版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/&#xA;1. 通过 ArtMethod 结构体找到 jni 方法在内存中的地址,并把寻址方法通过 rpc.exports 暴露给 Python 脚本调用&#xA;jni_addr.js&#xA;let entry_point_from_jni_offset = -1;&#xD;/**&#xD;* 找到 entry_point_from_jni_ 在 ArtMethod 结构体中的偏移量(根据 Android 版本不同可能会变化)&#xD;*&#xD;* @returns {number} 返回 entry_point_from_jni_ 的偏移量,若未找到返回 -1&#xD;*/&#xD;function get_jni_offset() {&#xD;// 如果偏移量已经计算过(不为 -1),直接返回已保存的偏移量&#xD;if (entry_point_from_jni_offset !== -1) {&#xD;return entry_point_from_jni_offset;&#xD;}&#xD;// 获取 getUidForName JNI 方法的内存地址,该方法位于 &amp;#34;libandroid_runtime.so&amp;#34; 中&#xD;let native_addr = Module.findExportByName(&amp;#34;libandroid_runtime.so&amp;#34;, &amp;#34;_Z32android_os_Process_getUidForNameP7_JNIEnvP8_jobjectP8_jstring&amp;#34;);&#xD;// console.log(&amp;#34;native_addr:&amp;#34;,native_addr);&#xD;// 目标类名 &amp;#34;android.os.Process&amp;#34;&#xD;let className = &amp;#34;android.os.Process&amp;#34;;&#xD;// 使用 Java.</description>
</item>
<item>
<title>Windows下创建FTP服务器,实现文件共享</title>
<link>https://cyrus-studio.github.io/blog/posts/windows%E4%B8%8B%E5%88%9B%E5%BB%BAftp%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%9E%E7%8E%B0%E6%96%87%E4%BB%B6%E5%85%B1%E4%BA%AB/</link>
Expand Down
15 changes: 6 additions & 9 deletions public/posts/frida脚本自动化寻址jni方法/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@
<meta property="og:locale" content="zh_cn">
<meta property="og:type" content="article">
<meta property="article:section" content="posts">
<meta property="article:published_time" content="2024-10-29T16:59:40+08:00">
<meta property="article:modified_time" content="2024-10-29T16:59:40+08:00">
<meta property="article:published_time" content="2024-10-29T18:39:06+08:00">
<meta property="article:modified_time" content="2024-10-29T18:39:06+08:00">


</head>
Expand Down Expand Up @@ -284,13 +284,10 @@ <h1 class ="post-title">frida脚本,自动化寻址JNI方法</h1>
<pre tabindex="0"><code>methodName-&gt; public static native java.lang.Object lte.NCall.IL(java.lang.Object[])
Func.offset== libGameVMP.so 0xDFA8
Func.getArtMethod-&gt;native_addr: 0X747DB9AFA8
[+] 地址 0x747db9afa8 所在模块信息:

- - 模块名称: libGameVMP.so

- - 基址: 0x747db8d000

- - 大小: 462848 bytes
[+] 地址 0x747db9afa8 所在模块信息
- 模块名称: libGameVMP.so
- 基址: 0x747db8d000
- 大小: 462848 bytes
</code></pre><p>具体原理可以参考这篇文章【<a href="https://cyrus-studio.github.io/blog/posts/%E4%BD%BF%E7%94%A8-frida-%E5%AE%9A%E4%BD%8D-jni-%E6%96%B9%E6%B3%95%E5%86%85%E5%AD%98%E5%9C%B0%E5%9D%80/">使用 Frida 定位 JNI 方法内存地址</a></p>

</div>
Expand Down
8 changes: 4 additions & 4 deletions public/posts/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ <h1>Posts</h1>
<ul class="posts-list">

<li class="posts-list-item">
<a class="posts-list-item-title" href="https://cyrus-studio.github.io/blog/posts/frida%E8%84%9A%E6%9C%AC%E8%87%AA%E5%8A%A8%E5%8C%96%E5%AF%BB%E5%9D%80jni%E6%96%B9%E6%B3%95/">frida脚本,自动化寻址JNI方法</a>
<a class="posts-list-item-title" href="https://cyrus-studio.github.io/blog/posts/%E4%BD%BF%E7%94%A8-frida-%E5%AE%9A%E4%BD%8D-jni-%E6%96%B9%E6%B3%95%E5%86%85%E5%AD%98%E5%9C%B0%E5%9D%80/">使用 Frida 定位 JNI 方法内存地址</a>
<span class="posts-list-item-description">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-calendar">
<title>calendar</title>
Expand All @@ -67,12 +67,12 @@ <h1>Posts</h1>
<title>clock</title>
<circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline>
</svg>
3 min read
5 min read
</span>
</li>

<li class="posts-list-item">
<a class="posts-list-item-title" href="https://cyrus-studio.github.io/blog/posts/%E4%BD%BF%E7%94%A8-frida-%E5%AE%9A%E4%BD%8D-jni-%E6%96%B9%E6%B3%95%E5%86%85%E5%AD%98%E5%9C%B0%E5%9D%80/">使用 Frida 定位 JNI 方法内存地址</a>
<a class="posts-list-item-title" href="https://cyrus-studio.github.io/blog/posts/frida%E8%84%9A%E6%9C%AC%E8%87%AA%E5%8A%A8%E5%8C%96%E5%AF%BB%E5%9D%80jni%E6%96%B9%E6%B3%95/">frida脚本,自动化寻址JNI方法</a>
<span class="posts-list-item-description">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-calendar">
<title>calendar</title>
Expand All @@ -84,7 +84,7 @@ <h1>Posts</h1>
<title>clock</title>
<circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline>
</svg>
5 min read
3 min read
</span>
</li>

Expand Down
Loading

0 comments on commit d79e335

Please sign in to comment.