java获取内存基址_安卓逆向|菜鸟的FRIDA学习笔记:内存读写
假设你的手机已经root,并已开启frida服务,电脑端已安装好Python,frida,IDA,GDA。
样本地址:
链接: https://pan.baidu.com/s/1y3kIXcBv25QqKjAVzq39CQ 提取码: wzqa
打开软件,界面是这样的:
随便输入"123456",提示"验证码校验失败",将APK拖入GDA,查找该字符串,定位到这里:
逻辑很简单,如果执行的是if语句,只校验成功,关键的也就是:
this.this$0.null_securityCheck
这个函数,跟进去发现是个native函数:
//Package com.yaotong.crackme.MainActivity;import java.lang.String;native public boolean MainActivity.null_securityCheck() //method@0016{}
将apk中的so拖入到ida,导出函数中发现了这个:
Java_com_yaotong_crackme_MainActivity_securityCheck 000011A8
双击跟进,并按F5,查看C伪码:
导入jni.h,将第一个形参设置为 _JNIEnv 类型,第二个形参设置为 jobject,第三个形参设置为 jstring 类型,对相关函数一波 force call 操作后,代码变成这样:
while循环很明显的就是 字符串的逐个比较,只需要找出 v6位置处的字符串即可,双击 off_628C 跟进:
发现一个"wojiushidaan"的字符串,输入试试,还是提示"验证码校验失败",说明这不是答案,真正的答案应该是动态加载的。如果用IDA调试,会发现它会有反调试,真正考察的也是过反调试。不过我们既然有frida,就不用管这个反调试了。
思路:
既然我们知道了静态时的偏移,那我们通过基址 + 偏移,就是动态时的内存地址,将其读取出来,看看该位置的字符串到底是啥。
function main(){ Java.perform(function() { console.log("Inside Java perform"); //读取基址并加上偏移,就是该字符串在内存中的地址 var soAddr = Module.findBaseAddress("libcrackme.so"); var passwordAddr = soAddr.add(0x628c); //菜鸡的我想要一步一步的观察内存中的值 console.log(hexdump(passwordAddr, { offset: 0, length: 64, header: true, ansi: true, })); })}setImmediate(main)
用frida Hook后的结果是这样的:
这。。。很明显不是答案啊。不过我们看前四个字节,会发现和内存地址很像(请原谅我还没有学习frida的相关api),因此我们还需要打印下 0xca733450 处的内存,看看是啥:
function main(){ Java.perform(function() { console.log("Inside Java perform"); //读取基址并加上偏移,就是该字符串在内存中的地址 var soAddr = Module.findBaseAddress("libcrackme.so"); var passwordAddr = soAddr.add(0x628c); //菜鸡的我想要一步一步的观察内存中的值 console.log(hexdump(passwordAddr, { offset: 0, length: 64, header: true, ansi: true, })); console.log(hexdump(new ptr(0xca733450) ,{ offset: 0, length: 64, header: true, ansi: true, })); })}setImmediate(main)
新增打印0xca733450内存处的代码后,frida自动运行,结果:
我们将这个 "aiyou,bucuoo"输入后(00是字符串的终止符),结果正确:
我们可以用frida自带的api进行内存的读写,直接帮我们把答案吐出来:
function main(){Java.perform(function(){console.log("Inside Java perform");//读取基址并加上偏移,就是该字符串在内存中的地址var soAddr = Module.findBaseAddress("libcrackme.so");var passwordAddr = soAddr.add(0x628c);var pwd = Memory.readUtf8String(Memory.readPointer(passwordAddr));console.log(pwd);})}setImmediate(main)
运行结果如下:
如果我们想要在输入"123456"也能成功呢?这时候我们可以修改内存里面的内容,将"aiyou,bucuoo"变成"123456",可以这么操作:
function main(){Java.perform(function(){console.log("Inside Java perform");//读取基址并加上偏移,就是该字符串在内存中的地址var soAddr = Module.findBaseAddress("libcrackme.so");var passwordAddr = soAddr.add(0x628c);Memory.writeUtf8String(Memory.readPointer(passwordAddr),"123456");var pwd = Memory.readUtf8String(Memory.readPointer(passwordAddr));console.log(pwd);})}setImmediate(main)
运行后,再此输入 "aiyou,bucuoo",会发现校验失败,如果输入"123456",则会提示成功。这样,我们就顺利的修改了答案。
学习内容:hexdump打印内存
new ptr 构造地址
Memory.readPointer 读取指针
Memory.readUtf8String 读取参数位置处的字符串(UTF8方式)
Memory.writeUtf8String 将第二个参数(字符串)写入第一个参数位置,修改内存。
java获取内存基址_安卓逆向|菜鸟的FRIDA学习笔记:内存读写相关推荐
- android获取apk名称_安卓逆向——APK安装流程
制丨文生 整理丨阿星 很多学习安卓逆向的朋友大多都会卡在安卓apk上,今天小生就来给大家讲解一下,安装apk的流程,希望能帮助到大家. 安装方式: ⑴系统程序安装 ⑵通过Android市场安装 ⑶手机 ...
- java反编译工具_安卓逆向之反编译工具的使用
SMALI/BAKSMALI是一个强大的apk文件编辑工具,用于Dalvik虚拟机(Google公司自己设计用于Android平台的虚拟机)来反编译和回编译classes.dex.其语法是一种宽松式的 ...
- 20145307陈俊达_安卓逆向分析_Xposed的hook技术研究
20145307陈俊达_安卓逆向分析_Xposed的hook技术研究 引言 其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌 ...
- Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年
Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 第 9 章 异常处理 9.1 异 ...
- 2 Oracle深度学习笔记 内存架构之UGA
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 2.Or ...
- 2.Oracle深度学习笔记——内存架构之UGA
2.Oracle深度学习笔记--内存架构之UGA 欢迎转载,转载请标明出处: http://blog.csdn.net/notbaron/article/details/50558136 UGA是回 ...
- native层 安卓_安卓逆向——拼xx协议java层分析
制丨阿星 整理丨阿星 老铁们大家好,今天小编给大家带来很实用的技巧叫拼xx协议java层分析,有啥不足的地方望大家指点指点! 首先抓包 反编译 这个时间段我们方法剖析一下 找到onclick 看他的 ...
- apk逆向思路_安卓逆向和手游辅助学习路线
一.安卓逆向基础(建议1周) 1. 学习安卓逆向第一步必须先把环境搭建好,这是你学习安卓逆向的开始,环境搭建好后表示正式迈入安卓逆向.在环境安装的工程中会遇到很多细节上的问题. 2. 第二步就是要了解 ...
- php从内存中获取源码_【PHP7源码分析】PHP内存管理
作者: 顺风车运营研发团队 李乐 第一章 从操作系统内存管理说起 程序是代码和数据的集合,进程是运行着的程序:操作系统需要为进程分配内存:进程运行完毕需要释放内存:内存管理就是内存的分配和释放: 1. ...
最新文章
- 第二期 AOSP 环境搭建、下载和编译 《手机就是开发板》遇到问题解决
- A Self-Attention Setentence Embedding 阅读笔记
- __name__=='__main__'的理解和使用
- JAVA中List的几个方法
- 第一行代码学习笔记第七章——探究内容提供器
- mysql中间件研究(Atlas,cobar,TDDL)
- 昨天又写到个结构体排序,用多种cmp
- FFMPEG结构体分析之AVStream
- python增量更新数据_Python标准库——加密
- python pathlib
- Java实验3 方法与数组
- [转] 面向对象编程介绍
- PL\SQL结构控制、异常
- 图片放大软件—ON1 Resize AI 2022兼容m1
- 计算机基础及应用期末,《计算机应用基础》期末复习综合练习题及答案
- C语言库函数查找工具MSDN
- World Wind入门
- 自学QT之qss教程
- Matlab绘图相关参数备忘录
- 【BSP视频教程】STM32H7视频教程第4期:从启动到运行过程全解析,电源域,复位,时钟,软硬件启动流程到堆栈,map和htm文件分析(2022-01-26)