请教一下大家是如何处理反汇编时遇到的cfstring的?

需求:

本人最近在逆向一款很小的软件,经过这几天在论坛上的学习发现大家一般在找方法的时候最常用的就是根据字符串来判断位置。

操作步骤:

刚好我需要修改的功能在运行的时候软件标题会变成类似”运行中“这类的字样,因此我想通过这个字符串来找到方法的位置。但是事与愿违,hopper解析出来的字符串中并没有这个字符串,我本以为该字符串在作者加密的字符串中,进过我不懈努力,反算出作者加密的字符串,然而并无所获。
最终本人使用lldb动态调试该软件,通过每个函数都打断点的笨办法,终于找到了”运行中“字符串出现的位置,伪代码如下:

    if ((var_996 & 0x1) == 0x0) {
            var_9B0 = [NSString stringWithFormat:cfstring_____Hr_g_N_e_c_];
            rax = [var_9B0 retain];
            rcx = *var_968;
            *var_968 = rax;
            [rcx release];
    }

由此可见作者是使用了[NSString stringWithFormat:cfstring_____Hr_g_N_e_c_]来生成的字符串,那么问题就来了,请问如何才能知道cfstring_____Hr_g_N_e_c_的真身就是“运行中”呢,如果有了这种方法,那我岂不是很快就能找到那个关键函数,瞬间达成目标,岂不是美滋滋!

没看懂。

大概就是我想要寻找某一个字符串,但是Hopper直接反汇编的String里面找不到这个字符串,最后找到了这个字符串的出处是作者用了stringWithFormat:,所以想问问大家有没有什么好的方便的方法找到这个字符串……
伪代码:

if ((var_996 & 0x1) == 0x0) {
    var_9B0 = [NSString stringWithFormat:cfstring_____Hr_g_N_e_c_];
    rax = [var_9B0 retain];
    rcx = *var_968;
    *var_968 = rax;
    [rcx release];
}

反汇编

                     loc_10003083a:
000000010003083a         mov        rsi, qword [rbp+var_830]                    ; argument "value" for method imp___stubs__objc_storeStrong, CODE XREF=sub_1000305f0+431, sub_1000305f0+499
0000000100030841         mov        qword [rbp+var_810], 0x0
000000010003084c         lea        rdi, qword [rbp+var_810]                    ; argument "addr" for method imp___stubs__objc_storeStrong
0000000100030853         call       imp___stubs__objc_storeStrong
0000000100030858         mov        rdi, qword [rbp+var_810]                    ; argument "instance" for method _objc_msgSend
000000010003085f         mov        rsi, qword [0x100052358]                    ; @selector(hasPrefix:), argument "selector" for method _objc_msgSend
0000000100030866         lea        rdx, qword [cfstring_8_0]                   ; @"8.0"
000000010003086d         mov        rax, qword [_objc_msgSend_10004a090]
0000000100030874         call       rax                                         ; _objc_msgSend
0000000100030876         mov        byte [rbp+var_995], al
000000010003087c         jmp        loc_100030881

汇编不知道找的对不对,反正伪代码应该是对的

果然找错了,发出来发现后面居然有注释,那应该是这个没注释的

00000001000309ce         mov        rdi, qword [objc_cls_ref_NSString]
00000001000309d5         mov        rcx, qword [rbp+var_830]
00000001000309dc         mov        rsi, qword [0x100052288]                    ; @selector(stringWithFormat:)
00000001000309e3         lea        rdx, qword [cfstring_____Hr_g_N_e_c_]
00000001000309ea         mov        rax, qword [_objc_msgSend_10004a090]
00000001000309f1         xor        r8d, r8d
00000001000309f4         mov        r9b, r8b
00000001000309f7         mov        qword [rbp+var_9A8], rax
00000001000309fe         mov        al, r9b
0000000100030a01         mov        r10, qword [rbp+var_9A8]
0000000100030a08         call       r10
0000000100030a0b         mov        qword [rbp+var_9B0], rax
0000000100030a12         jmp        loc_100030a17

不太明白你在干嘛,既然知道伪代码中哪个是你要的字符串,那还有啥问题。。。。

我是通过lldb每个函数都打断点,然后肉眼观察UI的变化才知道哪个函数是改了字符串,然后再去看代码才找到是哪个伪代码的_(:_」∠)_我认为不应该这样复杂,应该有简易方法的……所以来问问

可以在改了之前watch s ex (字符串改了之后的所在的地址),断点触发再看看地址里是不是改变后的字符串。(我随便一说哈)

还有这种操作,我先百度一下_(:」∠)

这个怎么找到字符串的地址呢_(:_」∠)_虽说知道怎么用了

对了,我没有记错的话在堆区的oc字符串内存地址是不变的啊,变得只是nsstring的指针吧……难道说是watchc字符串的地址,讲真这个老夫完全不会啊。。

讲道理就找最终字符串存在的地址下wa就可以了呀,(至于你怎么在值改变之前找到存的地址我就不管了,反正是可以拿到的)

很好,我大概懂了,可以我甚至不知道怎么拿到值改变之前的内存地址……
p/po到我崩溃都没有找到方法_(:」∠)

在汇编里面算地址

如果是函数的话可以找到偏移前的地址和ASLR算出偏移后的来打断点……但字符串我照着这个方法来根本不行啊_(:」∠)
而且我总感觉这个字符串的地址应该是不变的,值也不会变。应该是watch那个对象的属性的地址才符合逻辑啊,看这个属性指向的字符串地址有没有变啊……

那当然要你实际情况自己分析啊。。。。

结果我还是靠不断打断点找到要改的地方了_(:」∠)