锦州市广厦电脑维修|上门维修电脑|上门做系统|0416-3905144热诚服务,锦州广厦维修电脑,公司IT外包服务
topFlag1 设为首页
topFlag3 收藏本站
 
maojin003 首 页 公司介绍 服务项目 服务报价 维修流程 IT外包服务 服务器维护 技术文章 常见故障
锦州市广厦电脑维修|上门维修电脑|上门做系统|0416-3905144热诚服务技术文章
【练手】阿里crackme的新解法-frida

作者: watchdoge  日期:2017-05-16 19:53:31   来源: 本站整理

 
 


最近在看FrIDA,又看坛子里PJ头狼的帖子http://www.52pojie.cn/thread-559205-1-1.html,

于是顺手用frida来试试,对于这题frida有个很大的优势,就是不会触发反调试,这样就节省了很多功夫。
先简单介绍下frida,frida是一款代码插桩工具,它可以向windows,macOS,Linux,iOS,Android等平

台的原生应用中注射自定义的JavaScript代码片段,它的主要作用有:

  • Access process memory
  • Overwrite functions while the application is running
  • Call functions from imported classes
  • Find object instances on the heap and use them
  • Hook, trace and intercept functions etc.

0x01 简单地绕过验证
如果只是想绕过验证的话,那么非常简单,通常思路是反编译成smali文件然后编辑这里的代码,

然后重新打包签名,不过这里我们用frida也很容易实现,用下面的代码在java层hook住这个securityCheck函数,直接重新编写其逻辑:

[JavaScript] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
send("Running Script");
Java.perform(function(){
    MainActivity = Java.use("com.yaotong.crackme.MainActivity");
    MainActivity.securityCheck.implementation = function(v){
        send("securityCheck hooked");
        return true;
    }
});


0x02 获取密码
我们的主要目的当然还是获取到正确的密码,这个程序的具体情况不细说了,

感兴趣的可以自己分析或者看头狼的那篇帖子,其验证逻辑如下:
 
最核心的就是将我们的输入与off_628c所指向的值做比较,而我们在这里用frida来获取程序运行时该处的值,frida提供了劫持native函数以及操作内存的一系列方法,首先我们需要通过导出函数表获取securityCheck这个函数的地址

[JavaScript] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
9
var securityCheck = undefined;
    exports = Module.enumerateExportsSync("libcrackme.so");
    for(i=0; i<exports.length; i++){
        if(exports[i].name == "Java_com_yaotong_crackme_MainActivity_securityCheck"){
            securityCheck = exports[i].address;
            send("securityCheck is at " + securityCheck);
            break;
        }
    }

然后就是读取off_628C的值了,在ida的exports里可以看到该函数的偏移为0x11A8,因此可以通过函数当前地址减0x11A8再加0x628C,然后用Memory.readPointer获取该处所指向的地址,最后用Memory.readUtf8String读取最终的结果,所有的代码如下:
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env python
# coding=utf-8
from __future__ import print_function
import frida,sys
 
native_hook_code = """
Java.perform(function(){
    send("Running Script");
 
    var securityCheck = undefined;
    exports = Module.enumerateExportsSync("libcrackme.so");
    for(i=0; i<exports.length; i++){
        if(exports[i].name == "Java_com_yaotong_crackme_MainActivity_securityCheck"){
            securityCheck = exports[i].address;
            send("securityCheck is at " + securityCheck);
            break;
        }
    }
 
    Interceptor.attach(securityCheck,{
        onEnter: function(args){
            send("key is: " + Memory.readUtf8String(Memory.readPointer(securityCheck.sub(0x11a8).add(0x628c))));
        }
    });
});
"""
 
check_hook_code = """
    send("Running Script");
Java.perform(function(){
    MainActivity = Java.use("com.yaotong.crackme.MainActivity");
    MainActivity.securityCheck.implementation = function(v){
        send("securityCheck hooked");
        return true;
    }
});
"""
 
def on_message(message, data):
    if message['type'] == 'send':
        print(" {0}".format(message['payload']))
    else:
        print(message)
 
process = frida.get_device_manager().enumerate_devices()[-1].attach("com.yaotong.crackme")
script = process.create_script(native_hook_code)
script.on('message', on_message)
script.load()
sys.stdin.read()

结果如图:
 

 



热门文章
  • 机械革命S1 PRO-02 开机不显示 黑...
  • 联想ThinkPad NM-C641上电掉电点不...
  • 三星一体激光打印机SCX-4521F维修...
  • 通过串口命令查看EMMC擦写次数和判...
  • IIS 8 开启 GZIP压缩来减少网络请求...
  • 索尼kd-49x7500e背光一半暗且闪烁 ...
  • 楼宇对讲门禁读卡异常维修,读卡芯...
  • 新款海信电视机始终停留在开机界面...
  • 常见打印机清零步骤
  • 安装驱动时提示不包含数字签名的解...
  • 共享打印机需要密码的解决方法
  • 图解Windows 7系统快速共享打印机的...
  • 锦州广厦电脑上门维修

    报修电话:13840665804  QQ:174984393 (联系人:毛先生)   
    E-Mail:174984393@qq.com
    维修中心地址:锦州广厦电脑城
    ICP备案/许可证号:辽ICP备2023002984号-1
    上门服务区域: 辽宁锦州市区
    主要业务: 修电脑,电脑修理,电脑维护,上门维修电脑,黑屏蓝屏死机故障排除,无线上网设置,IT服务外包,局域网组建,ADSL共享上网,路由器设置,数据恢复,密码破解,光盘刻录制作等服务

    技术支持:微软等