假设你的手机已经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学习笔记:内存读写相关推荐

  1. android获取apk名称_安卓逆向——APK安装流程

    制丨文生 整理丨阿星 很多学习安卓逆向的朋友大多都会卡在安卓apk上,今天小生就来给大家讲解一下,安装apk的流程,希望能帮助到大家. 安装方式: ⑴系统程序安装 ⑵通过Android市场安装 ⑶手机 ...

  2. java反编译工具_安卓逆向之反编译工具的使用

    SMALI/BAKSMALI是一个强大的apk文件编辑工具,用于Dalvik虚拟机(Google公司自己设计用于Android平台的虚拟机)来反编译和回编译classes.dex.其语法是一种宽松式的 ...

  3. 20145307陈俊达_安卓逆向分析_Xposed的hook技术研究

    20145307陈俊达_安卓逆向分析_Xposed的hook技术研究 引言 其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌 ...

  4. Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年

    Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 第 9 章 异常处理 9.1 异 ...

  5. 2 Oracle深度学习笔记 内存架构之UGA

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 2.Or ...

  6. 2.Oracle深度学习笔记——内存架构之UGA

    2.Oracle深度学习笔记--内存架构之UGA 欢迎转载,转载请标明出处:  http://blog.csdn.net/notbaron/article/details/50558136 UGA是回 ...

  7. native层 安卓_安卓逆向——拼xx协议java层分析

    制丨阿星 整理丨阿星 老铁们大家好,今天小编给大家带来很实用的技巧叫拼xx协议java层分析,有啥不足的地方望大家指点指点! 首先抓包  反编译 这个时间段我们方法剖析一下 找到onclick 看他的 ...

  8. apk逆向思路_安卓逆向和手游辅助学习路线

    一.安卓逆向基础(建议1周) 1. 学习安卓逆向第一步必须先把环境搭建好,这是你学习安卓逆向的开始,环境搭建好后表示正式迈入安卓逆向.在环境安装的工程中会遇到很多细节上的问题. 2. 第二步就是要了解 ...

  9. php从内存中获取源码_【PHP7源码分析】PHP内存管理

    作者: 顺风车运营研发团队 李乐 第一章 从操作系统内存管理说起 程序是代码和数据的集合,进程是运行着的程序:操作系统需要为进程分配内存:进程运行完毕需要释放内存:内存管理就是内存的分配和释放: 1. ...

最新文章

  1. 第二期 AOSP 环境搭建、下载和编译 《手机就是开发板》遇到问题解决
  2. A Self-Attention Setentence Embedding 阅读笔记
  3. __name__=='__main__'的理解和使用
  4. JAVA中List的几个方法
  5. 第一行代码学习笔记第七章——探究内容提供器
  6. mysql中间件研究(Atlas,cobar,TDDL)
  7. 昨天又写到个结构体排序,用多种cmp
  8. FFMPEG结构体分析之AVStream
  9. python增量更新数据_Python标准库——加密
  10. python pathlib
  11. Java实验3 方法与数组
  12. [转] 面向对象编程介绍
  13. PL\SQL结构控制、异常
  14. 图片放大软件—ON1 Resize AI 2022兼容m1
  15. 计算机基础及应用期末,《计算机应用基础》期末复习综合练习题及答案
  16. C语言库函数查找工具MSDN
  17. World Wind入门
  18. 自学QT之qss教程
  19. Matlab绘图相关参数备忘录
  20. 【BSP视频教程】STM32H7视频教程第4期:从启动到运行过程全解析,电源域,复位,时钟,软硬件启动流程到堆栈,map和htm文件分析(2022-01-26)

热门文章

  1. Intellij IDEA 使用Spring-boot-devTools 没有生效 解决方法
  2. IDEA统一设置编码为utf-8编码及tomcat 乱码问题的解决
  3. python关于解决‘\u‘开头的字符串转中文的方法
  4. 如何在Bash中加入数组元素?
  5. 从HTML页面重定向
  6. 应用程序服务器和Web服务器之间有什么区别?
  7. 从Python调用外部命令
  8. 【55】让自己熟悉Boost
  9. 用node批量压缩html页面
  10. 如果想成为一名顶尖的前端,这份书单你一定要收藏!