本帖最后由 backtrace 于 2015-7-30 11:53 编辑
最近Mac App Store提示更新了新版的微信客户端,打开之后,却发现只有扫码登录这一种登录方式了
这对平时习惯用账号密码方式登录微信客户端的用户来说造成了很大困扰。
所以试着用Hopper载入了微信,看看能否通过修改的方式找回原来的账号密码登录方式
按照惯例,先在左侧搜索下有没有登录流程相关的处理过程,在搜索栏输入login
可以看到出现了很多搜索结果,但是无关的搜索结果太多,所以需要进一步定位。因为打开Mac版微信,直接展示出来的是二维码扫描界面,而二维码在编程中一般习惯写成qrcode,所以再继续搜索下qrcode
可以看到,比搜索login出来的结果少了很多,但依然有不少无关的搜索结果。这时可以利用hopper的fuzzy search功能取搜索结果的交集
勾选中图示中的地方
再看下搜索结果,无关的信息大量减少,主要注意下被红框圈中的地方
然后关闭fuzzy search,继续搜索 LoginViewController(搜索与登录视图有关),整理后得出以下几个视图
LoginViewController
USBLoginViewController QRCodeLoginViewController AutoAuthLoginViewController
既然默认加载的是QRCodeLoginViewController视图,那么直接选中-[QRCodeLoginViewController loadView] 函数,在函数起始处没有看到调用关系,直接在函数首尾处下两个断点
然后打开hopper调试器 Debug -> Open Debugger Panel...
点击运行后,程序在断点处停了下来
继续执行,跳到函数末尾处后进行单步调试
程序执行了到此处
按图示中的方式点击,跳到函数起始处
可以看到-[QRCodeLoginViewController loadView]是在 -[LoginWindowController showQRCodeView]函数中被调用的。进而可以推断,加载QRCodeView的逻辑是在LoginWindowController类中。
继续单步跟踪,一直执行到函数末尾,函数直接跳入了内存领空
一直点击step out,直到程序跳回程序领空中后,在此处停了下来。 0x00000001000025e6 mov rdi, qword [ss:rbp+var_30] 继续执行,程序直接运行跑飞了 说明关键的登录视图调用过程已经错过了。 继续调试,看看 -[LoginWindowController showQRCodeView]是在哪里被调用的。
在图中的地方下断点,然后再次在调试器中执行。在图中断点处停下后,查看下调用堆栈,就能直接跳转到调用的父函数
双击堆栈前的地址后,程序显示如图
(ps:其实在上一步中就能直接用查看调用堆栈的方式快速找到父函数,这里舍近求远主要是为了向不熟悉hopper的朋友演示下如何从内存领空跳回到程序领空)
点击下右上角的反编译功能,查看下源码
这里就是我们要找的关键点了。
在左侧搜索 LoginWindowController show,看看有哪些登录界面的显示函数
从字面意思上可以推断 -[LoginWindowController showPasswordLoginView] 就是要找的普通账号密码登录方式的调用函数。
在hopper中搜索下@selector(showPasswordLoginView),可以发现 showPasswordLoginView的引用在 0x100a82618 @selector(showPasswordLoginView)
分析过程到此结束,下面开始修改程序验证下猜想是否正确。
综合前面的分析可以知道,在调用过程中,直接指定了扫二维码的登录方式,而普通的登录方式并未在代码中删除,所以可以通过修改图中的关键点的调用让账号密码的登录方式重新显示
确定了关键点,这就开工
//关键代码如下
mov rsi, qword [ds:0x100a7ce28] ;@selector(showQRCodeView) //此处对应的16进制代码为 488B35EDE88D00
mov rsi, qword [ds:0x100a82618] ;@selector(showPasswordLoginView)
需要将图中的汇编代码改为 mov rsi, qword [ds:0x100a82618],但是直接在此处编辑,得到的结果却是图中的错误结果
这个应该是hopper的一个bug,所以只能通过修改16进制的方式来修改程序逻辑。
通过计算可以得知
0x100a82618 - 0x100a7ce28 = x - 0x8DE8ED
x = 0x8E40DD
由于hopper对于图中的调用没办法直接修改成预期的结果,所以得通过hopper的Hex Editor来修改
将图中标注的地方修改成DD 40 8E
然后通过 File -> Produce New Executable... 来保存刚才修改的文件,现在再来运行一下微信
久违的账号密码登录方式又出现了{:1_912:}
再试下登录,可以正常登录
搞定收工
成品下载:http://www.52pojie.cn/thread-390100-1-1.html
|