亲们新年快乐~
这几天和朋友用微信的摇色子功能玩真心话大冒险,输惨了,于是有了下文,分析了筛子点数产生的过程,和如何控制筛子点数.
环境:
越狱的IOS5.01,
微信4.5
一个无线路由连接电脑和手机设备
工具:
IDA(静态分析用),
GDB(调试和修改数据用),
SSH Secure Shell Client(连接手机使用),
SSH Secure File Transfer Client(在手机上获取Bin文件使用)
下面进入正题:
获取微信的可执行文件:
首先在手机上打开微信
然后用SSH Secure Shell Client 连接手机
然后用ps aux | grep App 命令查看当前进程,如下图所示,第一行就是了应用BIN文件存放的路径为
/var/mobile/Applications/3DF52C73-138B-42FC-9DC9-D3E1020AD6D0/MicroMessenger.app/MicroMessenger
图-1
然后打开SSH Secure File Transfer Client 在上述路径中获取微信的BIN文件MicroMessenger
然后第一步就完事了….
静态简单分析MicroMessenger:
首先将MicroMessenger拖进神器IDA ,等5分钟左右IDA分析出了6000+函数心中一阵窃喜,微信没加壳.
然后以看到色子就想到了随机数发生器,所以在IDA中查找发现了4处可疑的函数
_rand,_random,_srand,_srandom
然后静态分析告一段落
动态调试 MicroMessenger
首先电脑通过SSH Secure Shell Client 连接手机
然后根据图-1所示的进程ID:3035 附加进程 命令为 gdb –pid 3035
下断刚才发现的敏感函数
b *0x00A1EDE4 (_random)
b *0x00A1EDD4 (_rand)
b *0x00A1EFE4 (_srand)
b *0x00A1EFE4 (_srandom)
处理完成后断点信息如图-2所示:
图-2
然后找个好基友摇一下筛子~
然后发现应用被中断于断点
Breakpoint 2, 0x00a1ede4 in dyld_stub_random () 处,调用栈信息如下:
图-3
在图-3中发现有23层调用,由于对ios开发没有接触过也不清楚哪里是重点,这里换一种方法来定位关键函数:
在_random附近几层的调用下断点
b *0x00178f40
b *0x000762ce
完成断点操作后随意再发个系统表情
微信再次中断位置为:
Breakpoint 7, 0x000762ce in std::vector<unsigned long, std::allocator<unsigned long> >::_M_insert_aux ()
调用栈如图-4所示
图-4
对比两次调用栈发现发色子的调用栈#2层以后和发普通表情的调用情况一样
现在可以猜测下图-3中的第一层
#1 0x00178f40 in std::vector<zxing::qrcode::ECB*, std::allocator<zxing::qrcode::ECB*> >::_M_insert_aux ()
就是决定色子点数的关键函数:
关键函数动态调试:
在gdb中单步跟一下发现果然找对了注释信息已经添加如下
blx 0xa1ede4 <dyld_stub_random> [COLOR="Red"];调用随机数发生器[/COLOR]
cmp r4, #1 [COLOR="red"];摇色子的情况每次r4都是2也就是下面的跳转回实现[/COLOR]
bne.n 0x178f5e [COLOR="red"];这里跳转总是实现[/COLOR]
movw r1, #21846 ; 0x5556
movt r1, #21845 ; 0x5555
smmul r1, r0, r1
add.w r1, r1, r1, lsr #31
add.w r1, r1, r1, lsl #1
subs r0, r0, r1
adds r4, r0, #1
b.n 0x178f78
[COLOR="red"]0x178f5e:[/COLOR]
movw r4, #43691 ; 0xaaab
movt r4, #10922 ; 0x2aaa [COLOR="red"];这里是一个固定值[/COLOR]0x2AAAAAAB
smmul r4, r0, r4 [COLOR="red"];r4=r0*r4,R0是随意发生器产生的值[/COLOR]
add.w r4, r4, r4, lsr #31
add.w r4, r4, r4, lsl #1 [COLOR="red"];r4 = r4*3[/COLOR]
sub.w r4, r0, r4, lsl #1 [COLOR="red"];r4 = r0-r4左移一位[/COLOR]
adds r4, #4 ;r4=r4+4
blx 0xa1ede4 <dyld_stub_random>
movw r0, #62204 ; 0xf2fc
movt r0, #179 ; 0xb3
movw r2, #55878 ; 0xda46
movt r2, #180 ; 0xb4
add r0, pc
add r2, pc
ldr r1, [r0, #0]
ldr r0, [r2, #0]
[COLOR="red"]0x00178f94:[/COLOR]
mov r2, r4 [COLOR="red"];到这里发现r4的值=筛子点数+3此处r4的值决定色子的最终点数[/COLOR]
blx 0xa1f384 <dyld_stub_objc_msgSend>
色子随机算法分析:
通过上面的gdb调试分析发现了摇色子的实现算法如下:
_random产生随机数 记rnum
rnum和常数0x2AAAAAAB做乘法取高32位记h32
h32*3左移一位记lh32
rnum-lh32 = 色子点数+3
色子作弊方法:
要是想修改色子点数直接下断点
b *0x00178f94
修改r4寄存器的值就可以了,比如想摇出6点如图-5 图-6所示r4=6如果不改投掷出色子的点数应该是3通过set $r4=9 命令修改寄存器的值以后色子的点数为6
图-5
图-6
至此色子作弊的过程就介绍完了~再次祝福亲们新年快乐~~~~
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课