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

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

2021-9-29 18:47
20188

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


[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 54
活跃值: (620)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chmlqw 2021-10-8 09:02
2
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;
}
雪    币: 2651
活跃值: (7174)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
至尊小仙侠 2021-10-8 18:18
3
0
楼上正解 对着结构体前四个地址找就完了 大概率data地址就在 前四个地址中  一眼就能看出来 有时候
雪    币: 213
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_hgrbqfun 2021-10-8 21:32
4
0

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

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


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

最后于 2021-10-8 21:34 被mb_hgrbqfun编辑 ,原因:
雪    币: 1394
活跃值: (3084)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
lanoche 2021-10-9 11:00
5
1
https://mp.weixin.qq.com/s?__biz=MzU1ODkwMTY4OA==&mid=2247483803&idx=1&sn=0d7c81df9f2298c98c6851d54cdf3d71&chksm=fc1e314ccb69b85ac62e0587afae421a2229c60a97ed70194058c29d4aac026dbab3cf50bc9b&token=2034269482&lang=zh_CN#rd
可以看下这个
雪    币: 4
活跃值: (197)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
liuxucau 2021-10-9 18:03
6
2
较长字符串和较短字符串内存分布是不一样的,要进行一下判断,下面是从某位大佬那里学来的:
function readStdString(str){
    const isTiny = (str.readU8() & 1) == 0;
    if(isTiny){
        return str.add(1).readUtf8String();
    }
    return str.add(2*Process.pointerSize).readPointer().readUtf8String();
}
雪    币: 62
活跃值: (572)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2021-10-10 17:12
7
0
Memory.readCString是针对c风格字符串 std::string准确来说是cpp的一个类 定义在标准模版库中 需要根据类的结构再做进一步解析 不能简单地read
雪    币: 0
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bulecheng 2022-2-18 14:46
8
0
chmlqw std::string 本质上是一个结构体,不同stl版本实现不一样。需要根据实际情况读取。下面是我常遇到的 struct std::string { char buffer[0x10]; ...
大佬说的太有帮助了,我用readStdString这个函数可以打印指针_print(std::string *str), 用复分析结构的方法打印了引用_print(std::string &str)
雪    币: 74
活跃值: (213)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
alazif 2022-2-18 16:05
9
0
你可以找app内的c_str()函数,然后把你的对象作为this指针参数去调用,得到的就是正常的char*了
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
TsXor 2023-12-5 17:10
10
0

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编辑 ,原因:
游客
登录 | 注册 方可回帖
返回