首页
社区
课程
招聘
Frida HOOK SO 这种类型的值如何输出std::string *message
发表于: 2021-9-29 18:47 22653

Frida HOOK SO 这种类型的值如何输出std::string *message

2021-9-29 18:47
22653

想要看下 输入值,std::string *message
这个message 一直不能输出
Memory.readCString 输出就是方法
hexdump 输出看不懂的东西,看着不像加密的


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (10)
雪    币: 54
活跃值: (745)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
std::string 本质上是一个结构体,不同stl版本实现不一样。需要根据实际情况读取。下面是我常遇到的
struct std::string
{
  char buffer[0x10];        // 如果字符串小于0x10就会存放这里
  int end;                                //结束的位置
  int start;                        //字符串开始的位置
};

struct std::string                        
{
  char *pData;
  int tmp[3];
  int size;
  int capacity;
};

struct std::string
{
    char *pData;
}
2021-10-8 09:02
2
雪    币: 3298
活跃值: (8405)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
楼上正解 对着结构体前四个地址找就完了 大概率data地址就在 前四个地址中  一眼就能看出来 有时候
2021-10-8 18:18
0
雪    币: 134
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4

去分析std::string 里面的char*的偏移地址。

一般来说操作std::string 的时候编译后的代码是去操作char*的地址,你这样去找:去在反汇编里面去寻找这个std::string 的操作,就能大概找到char*的偏移地址。


比如某个地方在对std::string 读值,那么编译后的汇编一眼就能看到真正的char*偏移。

最后于 2021-10-8 21:34 被mb_hgrbqfun编辑 ,原因:
2021-10-8 21:32
0
雪    币: 1350
活跃值: (4330)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
5f1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0M7q4)9J5k6i4N6W2K9i4S2A6L8W2)9J5k6i4q4I4i4K6u0W2j5$3!0E0i4K6u0r3M7#2)9K6c8W2)9#2k6W2)9#2k6X3u0A6P5W2)9K6c8p5#2*7g2e0q4a6c8r3E0%4e0g2c8k6y4p5!0m8i4K6y4p5i4K6y4p5i4K6t1$3j5h3#2H3i4K6y4n7L8h3W2V1i4K6y4p5x3U0t1@1y4K6b7^5x3K6R3H3x3#2)9J5y4X3q4E0M7q4)9K6b7X3W2V1P5q4)9K6c8o6q4Q4x3U0k6S2L8i4m8Q4x3@1u0K6L8W2)9K6c8o6m8V1y4$3x3^5x3h3c8X3z5h3j5J5x3U0V1^5j5K6V1^5j5K6j5^5y4e0q4V1y4e0c8U0k6r3j5K6k6o6M7I4i4K6t1$3j5h3#2H3i4K6y4n7j5$3S2C8M7$3#2Q4x3@1c8X3j5K6q4W2x3K6p5@1j5$3y4T1y4U0W2T1z5o6g2S2j5K6j5J5k6e0l9#2z5o6N6S2k6X3q4W2y4o6t1I4j5e0t1J5x3U0W2U0y4U0m8S2z5e0N6W2k6o6M7H3x3e0V1@1x3o6f1^5j5K6t1&6k6o6c8S2j5h3x3H3x3U0k6V1j5X3q4T1x3$3y4X3y4e0m8T1j5K6W2T1i4K6t1$3j5h3#2H3i4K6y4n7N6r3!0C8k6h3&6Q4x3@1b7J5x3o6x3@1x3U0j5&6y4o6R3J5i4K6t1$3j5h3#2H3i4K6y4n7L8r3q4F1k6#2)9K6c8s2A6Z5i4K6g2X3b7@1&6Q4x3U0y4J5k6l9`.`.
可以看下这个
2021-10-9 11:00
1
雪    币: 4
活跃值: (197)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
较长字符串和较短字符串内存分布是不一样的,要进行一下判断,下面是从某位大佬那里学来的:
function readStdString(str){
    const isTiny = (str.readU8() & 1) == 0;
    if(isTiny){
        return str.add(1).readUtf8String();
    }
    return str.add(2*Process.pointerSize).readPointer().readUtf8String();
}
2021-10-9 18:03
2
雪    币: 156
活跃值: (1352)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Memory.readCString是针对c风格字符串 std::string准确来说是cpp的一个类 定义在标准模版库中 需要根据类的结构再做进一步解析 不能简单地read
2021-10-10 17:12
0
雪    币: 0
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
chmlqw std::string 本质上是一个结构体,不同stl版本实现不一样。需要根据实际情况读取。下面是我常遇到的 struct std::string { char buffer[0x10]; ...
大佬说的太有帮助了,我用readStdString这个函数可以打印指针_print(std::string *str), 用复分析结构的方法打印了引用_print(std::string &str)
2022-2-18 14:46
0
雪    币: 74
活跃值: (418)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
你可以找app内的c_str()函数,然后把你的对象作为this指针参数去调用,得到的就是正常的char*了
2022-2-18 16:05
0
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
2023-12-5 17:10
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
liuxucau 较长字符串和较短字符串内存分布是不一样的,要进行一下判断,下面是从某位大佬那里学来的: function readStdString(str){ const isTiny = (str.r ...
太强了大佬
2024-10-27 01:43
0
游客
登录 | 注册 方可回帖
返回