动态调试看到了c函数里面的参数 怎么样看到里面执行了什么呢

遇到个加密的方法返回了一个串,我想知道这个串是怎么加密的,后来陆续找到了这个方法
但是在IDA中看了半天 看不懂他是怎么加密的或者说进一步分析不会了
id __cdecl -[CFT_F374133 CFT_F456523:](CFT_F374133 *self, SEL a2, bool a3)
{
BOOL v3; // w8
bool v4; // zf
void **v5; // x8
struct objc_object *v6; // x19
__int128 v8; // [xsp+8h] [xbp-48h]
__int64 v9; // [xsp+18h] [xbp-38h]
void *v10[2]; // [xsp+20h] [xbp-30h]
__int64 v11; // [xsp+30h] [xbp-20h]

v10[1] = 0LL;
v11 = 0LL;
v10[0] = 0LL;
if ( -CFT_F374133 getSafeKeyboard )
{
sub_1221E8();
if ( SHIBYTE(v11) & 0x80000000 )
{
*(_BYTE *)v10[0] = 0;
v10[1] = 0LL;
}
else
{
LOBYTE(v10[0]) = 0;
HIBYTE(v11) = 0;
}
std::__1::basic_string<char,std::__1::char_traits,std::__1::allocator>::reserve();
v11 = v9;
*(_OWORD *)v10 = v8;
v3 = v9 < 0;
}
else
{
v3 = 0;
}
v4 = v3 == 0;
v5 = v10;
if ( !v4 )
v5 = (void **)v10[0];
v6 = (struct objc_object *)objc_msgSend(&OBJC_CLASS___NSString, “stringWithFormat:”, CFSTR("%s"), v5);
if ( SHIBYTE(v11) & 0x80000000 )
operator delete(v10[0]);
return v6;
}
返回了
= 31353532373231323937D78AA39E365C9FDB535BB83220E0AB671B0DCE783AF6B4D9A02F79AD1FDB4767F7E845481C0C7AC2329DE4A72330425304C24E518C64A69E42320B09C896E3C568C9A7E1EE07A7AAD867ED8C29C91C1984CFE316CCEE1732D8C744FD7C08DD3339D6122DE4F1613035EDE12E7F2404AF713E74D4A67140C4C246AB1D56E8EAABE0EA9984ECA9A0797D8B0B2E408AC65C03E5189F
前面一段31353532373231是不变的 我看这个方法中有个setSalt方法 参数是时间戳,开头应该是时间戳加密出来的

有新进展了
std::__1::basic_string<char,std::__1::char_traits,std::__1::allocator>::reserve();
这是c的汇编
我打印了这个断点,打印register read
x0 = 0x000000016fd86930
x1 = 0x0000000000000000
x2 = 0x00000001278b73d0
x3 = 0x0000000000000011
x4 = 0x000000000000003c
x5 = 0x0000000000000014
然后p $x1 (unsigned long) $7 = 6171420976
这真的是他的输出么 我想应该是个string

po (char*)$r2
这样打印即可
如果是IDA 就 po (char*)$x2即可

我打印出来是
$x16
“\xfffffffag\xffffffbb\xffffffa9\xfffffff8_\x01\xffffffa9\xfffffff6W\x02\xffffffa9\xfffffff4O\x03\xffffffa9\xfffffffd{\x04\xffffffa9\xfffffffd\x03\x01\xffffff91\xffffffffC”

po (char )$x17*
“\x0e\x04\r\x01\x02\x0f\v\b\x03\n\x06\f\x05\t”
不知道他们是怎么加密成了最后的串 这个执行过程有办法看到么

__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7reserveEm ; std::__1::basic_string<char,std::__1::char_traits,std::__1::allocator>::reserve(ulong)
__text:000000000011D6EC LDR X8, [SP,#0x50+var_38]
__text:000000000011D6F0 STR X8, [SP,#0x30]
__text:000000000011D6F4 LDUR Q0, [SP,#0x50+var_48]
__text:000000000011D6F8 STR Q0, [SP,#0x50+var_30]
__text:000000000011D6FC LDRSB W8, [SP,#0x50+anonymous_0+7]
__text:000000000011D700 CMP W8, #0
__text:000000000011D704 CSET W8, LT
就是这个汇编代码加密的应该 但是不知道怎么加密的

槽点很多。。。。。。

f5本身在这里就偏的离谱,其次
这是个c++ 字符串,你为什么会作为整数打印.

这是c++ 标准库里的方法,建议看一下 http://www.cplusplus.com/reference/string/string/reserve/

这又是个什么操作

感谢张大看了我的问题,我现在不晓得这做的是什么
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7reserveEm ; std::__1::basic_string<char,std::__1::char_traits,std::__1::allocator>::reserve(ulong)
看了下那个 c++ 标准库,我一脸懵哇,比如我想知道这个方法里面的这一块到底做了什么 有什么办法能拼凑出来过程嘛

让字符串容器预留空间

老哥,你怕不是想用 char* 来 打印 std::string 吧……

我应该用string来打印!

po (string*)$r2 这样行么

string * 是什么鬼……我觉得吧,你怕是完全不会 cpp 吧。
不过讲真我也完全不知道怎么用 lldb 打印就是了。
std::string 实现应该是一个结构体,里面有一个变量是字符串长度,一个指针指向字符串首地址。所以我猜可以通过类似于 这个帖子 的方法,然后看一下 std::string 在 LLVM 中的实现规范来打印吧……

感谢 我好好看看

Nah,要先看一下他是stdc++还是libc++,然后用LLVM IR来看内部结构。最后po里面的string

哇,这就涉及到我的知识盲区了。