首页
社区
课程
招聘
[求助]gdb 调试IOS程序碰到的问题
发表于: 2015-1-6 10:00 8224

[求助]gdb 调试IOS程序碰到的问题

2015-1-6 10:00
8224
使用gdb 调试QQV5.3.ipa时,发现堆栈信息与IDA分析的结果不对。

gdb的相关信息
(gdb) info sh
The DYLD shared library state has not yet been initialized.
                                          Requested State Current State
Num Basename                Type Address         Reason | | Source     
  | |                          | |                    | | | |         
  1 QQ                         - 0x4000            exec Y Y /private/var/mobile/Applications/A66DF95C-9C14-48A6-8BF3-EF68DA00C2F9/QQ.app/QQ (offset 0x0)

Breakpoint 1, 0x01e0513c in SecurityAccountServer::AddressBookItem::AddressBookItem ()
1: x/10i $pc
0x1e0513c:  f0 b5                         push  {r4, r5, r6, r7, lr}
0x1e0513e:  03 af                         add   r7, sp, #12
0x1e05140:  2d e9 00 05                   stmdb sp!, {r8, r10}
0x1e05144:  81 b0                         sub   sp, #4
0x1e05146:  04 46                         mov   r4, r0
0x1e05148:  4a f6 92 20                   movw  r0, #43666      ; 0xaa92
0x1e0514c:  c0 f2 a6 00                   movt  r0, #166        ; 0xa6
0x1e05150:  98 46                         mov   r8, r3
0x1e05152:  78 44                         add   r0, pc
0x1e05154:  92 46                         mov   r10, r2
(gdb) x/s $r1
0x22fcc18:  "loadDiscussMemberList:"
(gdb) info st
#0  0x01e0513c in SecurityAccountServer::AddressBookItem::AddressBookItem ()
#1  0x01e02f1e in SecurityAccountServer::AddressBookItem::AddressBookItem ()
#2  0x01e00338 in SecurityAccountServer::AddressBookItem::AddressBookItem ()
#3  0x01e0044e in SecurityAccountServer::AddressBookItem::AddressBookItem ()
#4  0x01e395a8 in SecurityAccountServer::AddressBookItem::AddressBookItem ()
#5  0x00512040 in _t_::_p_::__internal_new_creator<ucache::multibusid::url::ReqUsrInfo> ()
#6  0x003e4c10 in KQQ::ProfFriendInfoRes::ProfFriendInfoRes ()
#7  0x007aedfa in VIP::VipUserInfo::readFrom<taf::BufferReader> ()
#8  0x007aea66 in VIP::VipUserInfo::readFrom<taf::BufferReader> ()
#9  0x0093380e in std::vector<AvatarInfo::DestQQHeadInfo, std::allocator<AvatarInfo::DestQQHeadInfo> >::~vector ()
#10 0x357cf1fa in -[NSObject performSelector:withObject:] ()

IDA分析的结果

__text:01E0513C
__text:01E0513C ; =============== S U B R O U T I N E =======================================
__text:01E0513C
__text:01E0513C ; DiscussGroupStorage - (id)loadDiscussMemberList:(int64_t)
__text:01E0513C ; Attributes: bp-based frame
__text:01E0513C
__text:01E0513C ; id __cdecl -[DiscussGroupStorage loadDiscussMemberList:](struct DiscussGroupStorage *self, SEL, int64_t)
__text:01E0513C __DiscussGroupStorage_loadDiscussMemberList__
__text:01E0513C                                         ; DATA XREF: __objc_const:02825BE0o
__text:01E0513C
__text:01E0513C var_18          = -0x18
__text:01E0513C
__text:01E0513C                 PUSH            {R4-R7,LR}
__text:01E0513E                 ADD             R7, SP, #0xC
__text:01E05140                 PUSH.W          {R8,R10}
__text:01E05144                 SUB             SP, SP, #4
__text:01E05146                 MOV             R4, R0
__text:01E05148                 MOV             R0, #(selRef_getDiscussMemberListPathEnc_ - 0x1E05156)

从$r1的选择子来看,应该是要与IDA分析结果保持一致。

问题2:
__text:01E0513C                 PUSH            {R4-R7,LR}
__text:01E0513E                 ADD             R7, SP, #0xC
__text:01E05140                 PUSH.W          {R8,R10}
__text:01E05144                 SUB             SP, SP, #4
__text:01E05146                 MOV             R4, R0
__text:01E05148                 MOV             R0, #(selRef_getDiscussMemberListPathEnc_ - 0x1E05156)
__text:01E05150                 MOV             R8, R3
__text:01E05152                 ADD             R0, PC ; selRef_getDiscussMemberListPathEnc_
__text:01E05154                 MOV             R10, R2
__text:01E05156                 LDR             R1, [R0] ; "getDiscussMemberListPathEnc:"
__text:01E05158                 MOV             R0, R4
__text:01E0515A                 BLX             _objc_msgSend
__text:01E0515E                 MOV             R6, R0

在 break *(0x01E0515E)断下时,po $r0 提示不是对象。
但根据IDA分析的结果应该是NString对象

请教大牛,是怎么回事哈,有办法解决吗

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

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 212
活跃值: (126)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
(gdb) info sh
The DYLD shared library state has not yet been initialized.
                                          Requested State Current State
Num Basename                Type Address         Reason | | Source     
  | |                          | |                    | | | |         
  1 QQ                         - 0x4000            exec Y Y /private/var/mobile/Applications/A66DF95C-9C14-48A6-8BF3-EF68DA00C2F9/QQ.app/QQ (offset 0x0)
基址不可能是0X4000.不知道你在那里复制的。
2015-1-8 08:53
0
雪    币: 212
活跃值: (126)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
i mach-region 0    显示基址 例如是0XDA000
在GDB定义下面二个宏
define bbvm
  set $__bbvm=$arg0-(0x4000)
  end
  define bb
  b *($__bbvm+$arg0)
  end
然后运行 bbvm 0XDA000
然后再 bb 0x01E0515E 就可以到正确的断了
2015-1-8 08:56
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
仍然一样

0x35ea2004 in mach_msg_trap ()
(gdb) i mach-region 0
Region from 0x4000 to 0x24bc000 (r-x, max r-x; copy, private, not-reserved)
(gdb) define bbvm
Type commands for definition of "bbvm".
End with a line saying just "end".
>set $__bbvm=$arg0-(0x4000)
>end
(gdb) define bb
Type commands for definition of "bb".
End with a line saying just "end".
>b *($__bbvm+$arg0)
>end
(gdb) bbvm 0X4000
(gdb) bb 0x01E0266C
Breakpoint 1 at 0x1e0266c
(gdb) c
Continuing.

Breakpoint 1, 0x01e0266c in SecurityAccountServer::AddressBookItem::AddressBookItem ()
(gdb) x/s $r1
0x22fcc18:  "loadDiscussMemberList:"
(gdb)
2015-1-8 17:03
0
雪    币: 8
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你好啊,愚昧的问一句啊,你这样不等于什么都没干
2015-1-16 10:24
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
是呀,调试的结果就是这样。
应该是前面一个,如果用后面一个值,断不到的。
2015-1-16 11:18
0
雪    币: 212
活跃值: (126)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
基址是4000,就是什么都不干。如果不是4000,这样就可以断下基址+IDA静态代码,内存真正的地址了。
2015-1-19 14:49
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
gdb) info sh
The DYLD shared library state has not yet been initialized.
                                          Requested State Current State
Num Basename                Type Address         Reason | | Source     
  | |                          | |                    | | | |         
  1 QQ                         - 0x4000            exec Y Y /private/var/mobile/Applications/A66DF95C-9C14-48A6-8BF3-EF68DA00C2F9/QQ.app/QQ (offset 0x0)

通过这命令,得到的模块基地址是0x0.

(gdb) i mach-region 0
Region from 0x4000 to 0x24bc000 (r-x, max r-x; copy, private, not-reserved)

这个是通过你的方法gdb调试的结果,对应的值应该就是0x4000吧?
2015-1-19 16:21
0
雪    币: 212
活跃值: (126)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
你可以显示一下你断下的地址反汇编指令和静态的对比,看有没有断错地方。qq怎么会有固定基址的,不怎么可能
2015-1-19 22:41
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
是固定基地址的,你可以从爱思助手下一个。
我是从助手下的,应该动态变化基地址的标志已经被拿掉了。

从$r1这个选择子参数是与IDA分析一致的,汇编,二进制也对的上。
就是符号显示的不对,还有无法通过 po $r0 这样的命令来查看对象 值,
增加了分析的难度 。
2015-1-20 16:32
0
游客
登录 | 注册 方可回帖
返回
//