【安卓逆向】Frida对堆栈,重载,静态方法hook

编写测试APP

1,APP下载链接

https://github.com/heiyu-sec/r0lian/tree/master/demo13

2,编写TestThread中的内容,APP编译安装,就会持续执行打印

【安卓逆向】Frida对堆栈,重载,静态方法hook

3,编译执行成功,日志持续打印出来了

【安卓逆向】Frida对堆栈,重载,静态方法hook

4,APP点击能正常唤起

【安卓逆向】Frida对堆栈,重载,静态方法hook

Frida

1,安装frida,并确认客户端的frida版本

【安卓逆向】Frida对堆栈,重载,静态方法hook

2,选择同版本的firda服务端下载

https://github.com/frida/frida/releases?page=4

【安卓逆向】Frida对堆栈,重载,静态方法hook

3,启动frida server

【安卓逆向】Frida对堆栈,重载,静态方法hook

  1. adb push frida-server /data/local/tmp/

  2. adb shell

  3. su

  4. cd /data/local/tmp/

  5. chmod 777 frida-server

  6. ./frida-server

4,转发android TCP端口到本地

  1. adb forward tcp:27042 tcp:27042

  2. adb forward tcp:27043 tcp:27043

5,确认是否成功,能打印出如下进程,就说明frida的服务启动成功了

  1. frida-ps -R

【安卓逆向】Frida对堆栈,重载,静态方法hook

Frida脚本编写

简单方法直接hook

1,APP代码如下,相对简单,一个类下面只有一个单独的方法add()

【安卓逆向】Frida对堆栈,重载,静态方法hook

2,编写脚本,获取入参并打印

  1. function main(){

  2. Java.perform(function(){

  3. var TestThreadClass = Java.use("com.dta.demo13.TestThread")

  4. TestThreadClass.add.implementation = function(arg1,arg2){

  5. console.log("the first arg is ==>"+arg1)

  6. console.log("the second arg is ==>"+arg2)

  7. var result = this.add(arg1,arg2)

  8. console.log("the result is ==>"+result)

  9. return result;

  10. }

  11. })

  12. }

【安卓逆向】Frida对堆栈,重载,静态方法hook

打印调用栈

  1. function main(){

  2. Java.perform(function(){

  3. var TestThreadClass = Java.use("com.dta.demo13.TestThread")

  4. TestThreadClass.add.implementation = function(arg1,arg2){

  5. printStack()

  6. arg1=2;

  7. arg2=5;

  8. console.log("the first arg is ==>"+arg1)

  9. console.log("the second arg is ==>"+arg2)

  10. var result = this.add(arg1,arg2)

  11. console.log("the result is ==>"+result)

  12. return result;

  13. }

  14. })

  15. function printStack(){

  16. var ExceptionClass = Java.use("java.lang.Exception")

  17. var LogClass = Java.use("android.util.Log")

  18. console.log("----------------STACK--------------------")

  19. console.log(LogClass.getStackTraceString(ExceptionClass.$new()))

  20. console.log("----------------------------------------")

  21. }

  22. }

  23. setImmediate(main)

【安卓逆向】Frida对堆栈,重载,静态方法hook

hook重载方法

1,修改下APP,写个有重载的add()

【安卓逆向】Frida对堆栈,重载,静态方法hook

2,直接执行会报错,会让你选择overload哪一个方法

【安卓逆向】Frida对堆栈,重载,静态方法hook

3,修改脚本,用hook string的add()为例

  1. function main(){

  2. Java.perform(function(){

  3. var TestThreadClass = Java.use("com.dta.demo13.TestThread")

  4. TestThreadClass.add.overload('java.lang.String', 'java.lang.String').implementation = function(arg1,arg2){

  5. printStack()

  6. console.log("the first arg is ==>"+arg1)

  7. console.log("the second arg is ==>"+arg2)

  8. var result = this.add(arg1,arg2)

  9. console.log("the result is ==>"+result)

  10. return result;

  11. }

  12. })

  13. function printStack(){

  14. var ExceptionClass = Java.use("java.lang.Exception")

  15. var LogClass = Java.use("android.util.Log")

  16. console.log("----------------STACK--------------------")

  17. console.log(LogClass.getStackTraceString(ExceptionClass.$new()))

  18. console.log("----------------------------------------")

  19. }

  20. }

  21. setImmediate(main)

【安卓逆向】Frida对堆栈,重载,静态方法hook

参数构造主动调用

  1. function main(){

  2. Java.perform(function(){

  3. /*

  4. //overload

  5. var TestThreadClass = Java.use("com.dta.demo13.TestThread")

  6. TestThreadClass.add.overload('java.lang.String', 'java.lang.String').implementation = function(arg1,arg2){

  7. printStack()

  8. console.log("the first arg is ==>"+arg1)

  9. console.log("the second arg is ==>"+arg2)

  10. var result = this.add(arg1,arg2)

  11. console.log("the result is ==>"+result)

  12. return result;

  13. }

  14. */

  15. //param edit

  16. Java.choose("com.dta.demo13.TestThread",{

  17. onMatch:function(instanse){

  18. // var result= instanse.add("10","11");

  19. var result= instanse.add(1,3);

  20. console.log("the result is ==>"+result)

  21. },

  22. onComplete:function(){

  23. }

  24. })

  25. })

  26. function printStack(){

  27. var ExceptionClass = Java.use("java.lang.Exception")

  28. var LogClass = Java.use("android.util.Log")

  29. console.log("----------------STACK--------------------")

  30. console.log(LogClass.getStackTraceString(ExceptionClass.$new()))

  31. console.log("----------------------------------------")

  32. }

  33. }

  34. setImmediate(main)

【安卓逆向】Frida对堆栈,重载,静态方法hook

动静态处理

  1. function main(){

  2. Java.perform(function(){

  3. /*

  4. //overload

  5. var TestThreadClass = Java.use("com.dta.demo13.TestThread")

  6. TestThreadClass.add.overload('java.lang.String', 'java.lang.String').implementation = function(arg1,arg2){

  7. printStack()

  8. console.log("the first arg is ==>"+arg1)

  9. console.log("the second arg is ==>"+arg2)

  10. var result = this.add(arg1,arg2)

  11. console.log("the result is ==>"+result)

  12. return result;

  13. }

  14. */

  15. /*

  16. //param edit

  17. Java.choose("com.dta.demo13.TestThread",{

  18. onMatch:function(instanse){

  19. // var result= instanse.add("10","11");

  20. var result= instanse.add(1,3);

  21. console.log("the result is ==>"+result)

  22. },

  23. onComplete:function(){

  24. }

  25. })

  26. */

  27. //static dynamic

  28. var result = Java.use("com.dta.demo13.TestThread").static_add("123","456")

  29. console.log("the result is ==>"+ result)

  30. })

  31. function printStack(){

  32. var ExceptionClass = Java.use("java.lang.Exception")

  33. var LogClass = Java.use("android.util.Log")

  34. console.log("----------------STACK--------------------")

  35. console.log(LogClass.getStackTraceString(ExceptionClass.$new()))

  36. console.log("----------------------------------------")

  37. }

  38. }

  39. setImmediate(main)

【安卓逆向】Frida对堆栈,重载,静态方法hook

原文始发于微信公众号(车联网攻防日记):【安卓逆向】Frida对堆栈,重载,静态方法hook

版权声明:admin 发表于 2024年2月17日 下午5:48。
转载请注明:【安卓逆向】Frida对堆栈,重载,静态方法hook | CTF导航

相关文章