返回列表 发新帖

基于frida dump global-metadata.dat的三种方式

[复制链接]

4

主题

388

帖子

1395

积分

高中生

Rank: 4

金币
904
好评
8
贡献
0
发表于 2021-2-6 14:59:00 | 显示全部楼层 | 阅读模式
本帖最后由 天边之云 于 2021-2-6 15:49 编辑

第一种:内存暴力搜索global-metadata.dat的前四个字节:AF 1B B1 FA.
  1. [hide]function scandat() {
  2.         console.log(" scan start...");
  3.         Process.enumerateRanges('r--').forEach(function (range) {
  4.            // if (range.size<56798444) return;
  5.             try {
  6.                 Memory.scan(range.base,range.size,"AF 1B B1 FA",{
  7.                     onMatch:function (address, size) {
  8.                         //9828196
  9.                         var DefinitionsOffset = parseInt(address, 16) + 0x108;
  10.                                                 var DefinitionsOffset_size = Memory.readInt(ptr(DefinitionsOffset));
  11.                                                 var DefinitionsCount = parseInt(address, 16) + 0x10C;
  12.                                                 var DefinitionsCount_size = Memory.readInt(ptr(DefinitionsCount));
  13.                                                 //根据两个偏移得出global-metadata大小
  14.                                                 var global_metadata_size = DefinitionsOffset_size + DefinitionsCount_size
  15.                                                         console.log("大小:", global_metadata_size);
  16.                                                 var path = "/data/data/" + get_self_process_name() + "/global-metadata.dat";
  17.                                                 var file = new File(path, "wb");
  18.                                                 file.write(Memory.readByteArray(address, global_metadata_size));
  19.                                                 file.flush();
  20.                                                 file.close();
  21.                                                 console.log('导出完毕:path:',path);
  22.                     },
  23.                     onError:function (reason) {
  24.                         console.error("scan error :" + reason);
  25.                     },
  26.                     onComplete:function () {
  27.                         //console.log("scan onComplete")
  28.                     }
  29.                 })
  30.             }catch (e) {
  31.                 console.error(e)
  32.             }
  33.         })
  34.     }[/hide]
复制代码
此法参考:灯_等灯等灯。嗯。。。几乎没区别。


第二种:基于/proc/self/maps 过滤global-metadata.dat 保存
  1. [hide]function getLibraryMap() {
  2.         const SoName = "global-metadata.dat";
  3.         var fopen = new NativeFunction(Module.findExportByName(null,"fopen"),'pointer',['pointer','pointer']);
  4.         var fgets = new NativeFunction(Module.findExportByName(null,"fgets"),'pointer', ['pointer', 'int', 'pointer']);
  5.         var fwrite = new NativeFunction(Module.findExportByName(null,"fwrite"),'int',['pointer','int','int','pointer']);
  6.         var fclose = new NativeFunction(Module.findExportByName(null,"fclose"),'int', ['pointer']);
  7.         var line = Memory.alloc(512);
  8.         var fp = fopen(Memory.allocUtf8String("/proc/self/maps"),Memory.allocUtf8String("rt"));
  9.         if (fp){
  10.             while (fgets(line,512,fp)){
  11.                 if (line.readUtf8String().includes(SoName)){
  12.                     console.log(line.readUtf8String());
  13.                     var str = line.readUtf8String();
  14.                     var strs = str.split("-");
  15.                     var startaddr ="0x"+ strs[0];
  16.                     var endaddr ="0x"+ strs[1];
  17.                     var size = ptr(endaddr).sub(ptr(startaddr)).toInt32();
  18.                     var process_name = get_self_process_name();
  19.                     var mode_ptr = Memory.allocUtf8String("wb+");
  20.                     try {
  21.                         var path = "/sdcard/" + SoName + "_" + startaddr;
  22.                         var path_ptr = Memory.allocUtf8String(path)
  23.                         var fp2 = fopen(path_ptr,mode_ptr);
  24.                         Memory.protect(ptr(startaddr),size,'rwx');
  25.                         fwrite(ptr(startaddr),size,1,fp2)
  26.                         fclose(fp2);
  27.                         console.log('dump_so_path:', path);
  28.                     }catch (e) {
  29.                         console.error(e);
  30.                         var path = process_name + SoName + "_" + startaddr;
  31.                         var path_ptr = Memory.allocUtf8String(path)
  32.                         var fp2 = fopen(path_ptr,mode_ptr);
  33.                         Memory.protect(ptr(startaddr),size.toInt32(),'rwx');
  34.                         fwrite(ptr(startaddr),size.toInt32(),1,fp2)
  35.                         fclose(fp2);
  36.                         console.log('dump_so_path:', path);
  37.                     }
  38.                     break;
  39.                 }
  40.             }
  41.         }
  42.         fclose(fp);
  43.     }[/hide]
复制代码

此法参考FateHack
第三种:反编译libil2cpp.so,在字符串窗口搜索 global-metadata.dat 获取global-metadata.dat加载的函数,根据偏移再去 dump。
  1. [hide]function starthook() {
  2.         var baseaddr = Module.findBaseAddress("libil2cpp.so");
  3.         console.log("baseaddr:",baseaddr);
  4.         Interceptor.attach(baseaddr.add(0x64EB74),{  // 加载后返回 global-metadata.dat 的首地址。
  5.             onEnter:function (args) {
  6.             },
  7.             onLeave:function (returnValue) {
  8.                 address = returnValue;  //
  9.                 var DefinitionsOffset = parseInt(address, 16) + 0x108;
  10.                 var DefinitionsOffset_size = Memory.readInt(ptr(DefinitionsOffset));
  11.                 var DefinitionsCount = parseInt(address, 16) + 0x10C;
  12.                 var DefinitionsCount_size = Memory.readInt(ptr(DefinitionsCount));
  13.                                                 //根据两个偏移得出global-metadata大小
  14.                 var global_metadata_size = DefinitionsOffset_size + DefinitionsCount_size
  15.                 console.log("大小:", global_metadata_size);
  16.                 var path = "/data/data/" + get_self_process_name() + "/global-metadata.dat";
  17.                 var file = new File(path, "wb");
  18.                 file.write(Memory.readByteArray(address, global_metadata_size));
  19.                 file.flush();
  20.                 file.close();
  21.                 console.log('导出完毕:path:',path);
  22.             }
  23.         })
  24.     }[/hide]
复制代码


最后,别问我怎么用?会了也不告诉你。。。








来自群组: 安卓逆向分析破解
已有2人评分好评 金币 理由
正己 + 1 + 1 大佬爱了爱了
快乐小牛 + 1 + 1 很给力!

查看全部评分 总评分:好评 +2  金币 +2 

混子!混子!!混子!!!
回复

使用道具 举报

19

主题

2359

帖子

9218

积分

硕士生

Rank: 6Rank: 6

金币
4512
好评
31
贡献
0

考神MT论坛帅哥MT论坛最佳新人

发表于 2021-2-6 15:21:31 来自手机  | 显示全部楼层
你应该先hide,再code
回复

使用道具 举报

4

主题

388

帖子

1395

积分

高中生

Rank: 4

金币
904
好评
8
贡献
0
发表于 2021-2-6 15:50:57 | 显示全部楼层
Away84 发表于 2021-2-6 15:21
你应该先hide,再code

算了 懒得改了
混子!混子!!混子!!!
回复

使用道具 举报

20

主题

656

帖子

2956

积分

大学生

Rank: 5Rank: 5

金币
1186
好评
2
贡献
0

考神

发表于 2021-2-6 16:13:07 | 显示全部楼层
你也是对游戏颇有研究?
我永远喜欢阿尔托莉雅
回复

使用道具 举报

4

主题

388

帖子

1395

积分

高中生

Rank: 4

金币
904
好评
8
贡献
0
发表于 2021-2-6 17:17:43 | 显示全部楼层
神楽七奈 发表于 2021-2-6 16:13
你也是对游戏颇有研究?

搞不好是搬砖的呢?
混子!混子!!混子!!!
回复

使用道具 举报

10

主题

1257

帖子

6892

积分

硕士生

Rank: 6Rank: 6

金币
584
好评
6
贡献
0

考神MT论坛帅哥MT论坛最佳新人

发表于 2021-2-6 18:43:58 来自手机  | 显示全部楼层
大佬牛   
回复

使用道具 举报

9

主题

783

帖子

3512

积分

大学生

Rank: 5Rank: 5

金币
1454
好评
8
贡献
0
发表于 2021-2-7 08:18:22 来自手机  | 显示全部楼层
这个有什么用?即使会了我也要问
回复

使用道具 举报

0

主题

2159

帖子

4447

积分

大学生

Rank: 5Rank: 5

金币
1566
好评
0
贡献
0
发表于 2021-2-8 00:21:51 | 显示全部楼层
谢谢分享
回复

使用道具 举报

56

主题

2135

帖子

6782

积分

硕士生

萌新

Rank: 6Rank: 6

金币
1156
好评
59
贡献
0

考神MT论坛帅哥MT论坛最佳新人MT论坛活跃会员

QQ
发表于 2021-2-15 18:58:44 | 显示全部楼层
吹爆天边之云大佬,666,爱了爱了
一切内容仅供交流学习
如有侵权请联系我删帖
转载请经过我同意谢谢
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表