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

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

2021-9-29 18:47
21687

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


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

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 54
活跃值: (705)
能力值: ( 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
雪    币: 2884
活跃值: (7838)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
楼上正解 对着结构体前四个地址找就完了 大概率data地址就在 前四个地址中  一眼就能看出来 有时候
2021-10-8 18:18
0
雪    币: 227
能力值: ( 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
雪    币: 1365
活跃值: (3579)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
https://mp.weixin.qq.com/s?__biz=MzU1ODkwMTY4OA==&mid=2247483803&idx=1&sn=0d7c81df9f2298c98c6851d54cdf3d71&chksm=fc1e314ccb69b85ac62e0587afae421a2229c60a97ed70194058c29d4aac026dbab3cf50bc9b&token=2034269482&lang=zh_CN#rd
可以看下这个
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
雪    币: 116
活跃值: (1012)
能力值: ( 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
活跃值: (248)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
你可以找app内的c_str()函数,然后把你的对象作为this指针参数去调用,得到的就是正常的char*了
2022-2-18 16:05
0
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10

stack overflow上面有一段,就是楼上说的:
https://stackoverflow.com/questions/68243063/read-value-from-frida-hooked-native-method-basic-string-parameter


相关知识:
https://joellaity.com/2020/01/31/string.html

在clang编译的情况下,std::string是短字符串还是长字符串模式由整个字符串3个指针大小的数据的第一个字节的最低端比特位判断(实现保证std::string内部已分配内存的长度永远是偶数)

最后于 2023-12-5 20:37 被TsXor编辑 ,原因:
2023-12-5 17:10
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
liuxucau 较长字符串和较短字符串内存分布是不一样的,要进行一下判断,下面是从某位大佬那里学来的: function readStdString(str){ const isTiny = (str.r ...
太强了大佬
2024-10-27 01:43
0
游客
登录 | 注册 方可回帖
返回
//