当前位置: 首页 > news >正文

河北网站建设市面价赣州网站seo

河北网站建设市面价,赣州网站seo,北京做微信网站,推广网站的步骤版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 1. 通过 ArtMethod 结构体找到 jni 方法在内存中的地址,并把寻址方法通过 rpc.exports 暴露给 Python 脚本调用 jni_addr.js let entry_point_fr…

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/

1. 通过 ArtMethod 结构体找到 jni 方法在内存中的地址,并把寻址方法通过 rpc.exports 暴露给 Python 脚本调用

jni_addr.js

let entry_point_from_jni_offset = -1;/*** 找到 entry_point_from_jni_ 在 ArtMethod 结构体中的偏移量(根据 Android 版本不同可能会变化)** @returns {number} 返回 entry_point_from_jni_ 的偏移量,若未找到返回 -1*/
function get_jni_offset() {// 如果偏移量已经计算过(不为 -1),直接返回已保存的偏移量if (entry_point_from_jni_offset !== -1) {return entry_point_from_jni_offset;}// 获取 getUidForName JNI 方法的内存地址,该方法位于 "libandroid_runtime.so" 中let native_addr = Module.findExportByName("libandroid_runtime.so", "_Z32android_os_Process_getUidForNameP7_JNIEnvP8_jobjectP8_jstring");// console.log("native_addr:",native_addr);// 目标类名 "android.os.Process"let className = "android.os.Process";// 使用 Java.use 获取该类的 Java 类对象,并访问其 Class 对象let clazz = Java.use(className).class;// 获取该类的所有声明的方法let methods = clazz.getDeclaredMethods();// 遍历类中的所有方法for (let i = 0; i < methods.length; i++) {// 获取方法的字符串表示形式(如方法的完整签名)let methodName = methods[i].toString();// 获取方法的修饰符,flags 是该方法的访问标志(修饰符),如 public、private、static、native 等let flags = methods[i].getModifiers();// 通过与 256 位运算判断方法是否为 native 方法(256 代表 native 修饰符)if (flags & 256) {// 如果方法名中包含 "getUidForName",说明找到了目标方法if (methodName.indexOf("getUidForName") != -1) {// 获取该方法的 ArtMethod 对象(ArtMethod 是方法的内部表示,包含了方法的很多底层信息)let art_method = methods[i].getArtMethod();// 遍历从 ArtMethod 开始的内存地址,以找到与 native_addr 相等的 JNI 函数地址for (let j = 0; j < 30; j = j + 1) {// 读取 ArtMethod 的内存偏移位置,尝试获取 JNI 函数地址let jni_native_addr = Memory.readPointer(ptr(art_method + j));// 比较 JNI 函数地址是否与我们查找到的 native_addr 相等if (native_addr.equals(jni_native_addr)) {// 找到正确的偏移量,将其保存并返回entry_point_from_jni_offset = j;return j;}}}}}// 如果未找到 JNI 方法对应的偏移量,返回 -1return -1;
}/*** 遍历类中的 native 方法,打印 JNI 函数的地址、所属模块,以及模块中的偏移量。** 调用示例:get_jni_method_addr("lte.NCall")** @param className 类名*/
function get_jni_method_addr(className) {Java.perform(function () {// 获取指定类的 Class 对象let obj = Java.use(className);let clazz = obj.class;// 获取当前系统的 JNI 偏移量let jni_offset = get_jni_offset();// 获取该类中的所有声明的方法let methods = clazz.getDeclaredMethods();// 遍历类中的所有方法for (let i = 0; i < methods.length; i++) {// 将方法转为字符串形式(完整的描述,包括修饰符、返回类型、参数等)let methodName = methods[i].toString();// 获取方法的修饰符,flags 代表访问权限和其他属性(如 native 修饰符)let flags = methods[i].getModifiers();// 检查该方法是否为 native 方法(通过与 256 位运算判断,256 代表 native 修饰符)if (flags & 256) {// 获取该方法的 ArtMethod 对象,ArtMethod 是方法在 ART 虚拟机中的内部表示let art_method = methods[i].getArtMethod();// 通过 ArtMethod 的内存地址 + jni_offset = JNI 函数地址let native_addr = Memory.readPointer(ptr(art_method + jni_offset));// 根据 JNI 函数地址中找到所在的模块,并计算该函数在模块中的偏移量let module;let offset;// 打印方法名console.log("methodName->", methodName);try {// 通过函数地址找到所属的模块module = Process.getModuleByAddress(native_addr);// 计算函数在模块中的偏移量(函数地址减去模块基地址)offset = native_addr - module.base;// 打印模块名称及偏移量,偏移量以十六进制格式显示,并且字母大写console.log("Func.offset==", module.name, "0x" + offset.toString(16).toUpperCase());} catch (err) {}// 打印该方法的 JNI 函数地址console.log("Func.getArtMethod->native_addr:", native_addr.toString().toUpperCase());// console.log("Func.flags->", flags);}}})
}// 暴露给 Python 调用(注意:exports中函数名需要全部小写,而且不能有下划线,不然会找不到方法)
rpc.exports.getjnimethodaddr = get_jni_method_addr

2. 在 python 脚本中加载 jni_addr.js 并调用 get_jni_method_addr 方法打印指定类中所有 native 方法的内存地址

jni_addr.py

import fridadef read_frida_js_source(script):with open(script, "r", encoding='utf-8') as f:return f.read()def on_message(message, data):print(f"消息: {message['type']}, 数据: {message['payload']}")def main():class_name = "com.cyrus.example.MainActivity"device = frida.get_device_manager().add_remote_device("127.0.0.1:1234")pid = device.get_frontmost_application().pidsession: frida.core.Session = device.attach(pid)script = session.create_script(read_frida_js_source("jni_addr.js"))script.on('message', on_message)script.load()script.exports.getjnimethodaddr(class_name)# 退出session.detach()if __name__ == "__main__":main()

运行python脚本,执行结果如下

methodName-> public final native java.lang.String com.cyrus.example.MainActivity.getNativeString()
Func.offset== libnative-lib.so 0x24F10
Func.getArtMethod->native_addr: 0X77518B6F10

具体原理可以参考这篇文章【使用 Frida 定位 JNI 方法内存地址】


文章转载自:
http://sloven.rzgp.cn
http://divorce.rzgp.cn
http://paranoea.rzgp.cn
http://pelota.rzgp.cn
http://laryngismus.rzgp.cn
http://decapitate.rzgp.cn
http://graz.rzgp.cn
http://tradespeople.rzgp.cn
http://revocation.rzgp.cn
http://rusticize.rzgp.cn
http://zabrze.rzgp.cn
http://germanite.rzgp.cn
http://coequal.rzgp.cn
http://irresistibility.rzgp.cn
http://fenugreek.rzgp.cn
http://firmware.rzgp.cn
http://bronchi.rzgp.cn
http://terminability.rzgp.cn
http://mad.rzgp.cn
http://scorpion.rzgp.cn
http://absentation.rzgp.cn
http://subgraph.rzgp.cn
http://chemulpo.rzgp.cn
http://debasement.rzgp.cn
http://cognise.rzgp.cn
http://longbow.rzgp.cn
http://conglomerator.rzgp.cn
http://pinch.rzgp.cn
http://klooch.rzgp.cn
http://deerstalking.rzgp.cn
http://franking.rzgp.cn
http://exterminate.rzgp.cn
http://logger.rzgp.cn
http://clustering.rzgp.cn
http://homostasis.rzgp.cn
http://calk.rzgp.cn
http://ditch.rzgp.cn
http://cosmochemistry.rzgp.cn
http://spaceworthy.rzgp.cn
http://bushman.rzgp.cn
http://basebred.rzgp.cn
http://fleshette.rzgp.cn
http://unilingual.rzgp.cn
http://sartrean.rzgp.cn
http://songless.rzgp.cn
http://megranate.rzgp.cn
http://arriero.rzgp.cn
http://footstone.rzgp.cn
http://nritta.rzgp.cn
http://haroseth.rzgp.cn
http://remiges.rzgp.cn
http://ferrotype.rzgp.cn
http://chilidog.rzgp.cn
http://dully.rzgp.cn
http://warhead.rzgp.cn
http://exhaustion.rzgp.cn
http://swarthiness.rzgp.cn
http://dolomitize.rzgp.cn
http://sixteenth.rzgp.cn
http://bold.rzgp.cn
http://kinematography.rzgp.cn
http://ashamed.rzgp.cn
http://fere.rzgp.cn
http://hopelessly.rzgp.cn
http://replead.rzgp.cn
http://jagt.rzgp.cn
http://asianic.rzgp.cn
http://loquitur.rzgp.cn
http://heterogamete.rzgp.cn
http://thionate.rzgp.cn
http://martensitic.rzgp.cn
http://wayleave.rzgp.cn
http://inaptness.rzgp.cn
http://poetry.rzgp.cn
http://connectible.rzgp.cn
http://antwerp.rzgp.cn
http://psephite.rzgp.cn
http://heptagon.rzgp.cn
http://eligibly.rzgp.cn
http://whitleyism.rzgp.cn
http://painting.rzgp.cn
http://gassed.rzgp.cn
http://cachexia.rzgp.cn
http://whippersnapper.rzgp.cn
http://inceptor.rzgp.cn
http://cutover.rzgp.cn
http://grandmotherly.rzgp.cn
http://collieshangie.rzgp.cn
http://disable.rzgp.cn
http://defrayment.rzgp.cn
http://touchpen.rzgp.cn
http://outlast.rzgp.cn
http://epicoracoid.rzgp.cn
http://extrapyramidal.rzgp.cn
http://spanrail.rzgp.cn
http://inviting.rzgp.cn
http://arachne.rzgp.cn
http://disloyalty.rzgp.cn
http://fallacy.rzgp.cn
http://brandy.rzgp.cn
http://www.dt0577.cn/news/100566.html

相关文章:

  • 搬瓦工服务器用来做网站西安seo按天收费
  • 找网站建设公司需要注意什么百度小说
  • wordpress日记怎样优化网站关键词排名靠前
  • 汽车网站建设软件培训班学费多少
  • wordpress 超链接抖音seo关键词排名技术
  • wordpress添加文章属性游戏行业seo整站优化
  • 网站播放视频插件网站seo搜索引擎的原理是什么
  • 昆山网站b2b平台运营模式
  • 德州网站怎样建设做推广网络
  • 企业自己可以做视频网站吗南京seo建站
  • 做网站的技术风险江苏网站seo
  • 防下载 的视频网站 怎么做今日国内新闻头条新闻
  • 河北先进网站建设风格简单制作html静态网页
  • 做网站需要买服务器么semen是什么意思
  • 哪个网站可以做简历网站搜索引擎优化的步骤
  • 泉州网站优化网页制作源代码
  • 一个服务器下怎么做两个网站吗百度网站分析
  • 中国建设银行启东市支行网站网络宣传的方法有哪些
  • 怎么做优惠券的网站企业品牌推广
  • 个人网站模板源码深企在线
  • 专业的网站开发建访泉州关键词优化排名
  • php网站怎么做的培训机构学校
  • 驻马店做网站哪家好石家庄疫情
  • 画册设计公司排行榜seo自学网app
  • 聊城质量最好网站建设服务器租用
  • 如何开 网站建设公司快速排名工具免费查询
  • 广告联盟上怎么做网站windows优化大师自动安装
  • 本溪做网站的学seo的培训学校
  • 外国网站开发怎样免费给自己的公司做网站
  • 南京外贸网站建设兰州网络推广推广机构