何为逆向工程?
逆向工程,指的是通过分析一个程序或系统的功能、结构或行为,将它的技术实现或设计细节推导出来的过程。当我们对一个软件的功能很感兴趣,却又拿不到它的源代码时,往往可以通过逆向工程的方式对它进行分析。
推荐的书籍:
iOS逆向交流论坛:http://iosre.com/
开始尝试简单的微信抢红包
应用脱壳:
准备工作
- 一台已越狱的iPhone5s以上机器(已安装OpenSSH和Cycript,砸壳用)
- 砸壳工具dumpdecrypted.dylib
- PP助手(建议安装,非常方便)
接下来就是需要找到微信的Bundle路径了,可以把iPhone上的所有App都关掉,唯独保留微信,然后输入命令 ps -e
这样我们就找到了微信的可执行文件Wechat的具体路径了。接下来我们需要用Cycript找出微信的Documents的路径,输入命令cycript -p WeChat
拷贝dumpdecrypted.dylib到iPhone上,这里我们用到scp命令.
scp 源文件路径 目标文件路径 。具体如下(也可以使用PP助手):
开始砸壳
dumpdecrypted.dylib的具体用法是:DYLD_INSERT_LIBRARIES=/PathFrom/dumpdecrypted.dylib /PathTo
当前目录下会生成砸壳后的文件,即WeChat.decrypted。同样用scp命令把WeChat.decrypted文件拷贝到电脑上,接下来我们要正式的dump微信的可执行文件了。(这边原文写的不完善,不过后来用PP助手文件管理器直接就导出来了,非常方便)
电脑端可以通过otool命令再次验证是否砸壳成功:
> otool -l WeChat.app/WeChat | grep -B 2 crypt
cmd LC_ENCRYPTION_INFO
cmdsize 20
cryptoff 16384
cryptsize 40534016
cryptid 0
--
cmd LC_ENCRYPTION_INFO_64
cmdsize 24
cryptoff 16384
cryptsize 43663360
cryptid 0
otool可以输出app的load commands,然后通过查看cryptid这个标志位来判断app是否被加密。1代表加密了,0代表被解密了
编写Hook代码:
新建一个dylib工程,因为Xcode默认不支持生成dylib,所以我们需要下载iOSOpenDev,安装完成后(Xcode7环境会提示安装iOSOpenDev失败,请参考iOSOpenDev安装问题),重新打开Xcode,在新建项目的选项中即可看到iOSOpenDev选项了。
编写代码(就贴出了部分代码):
//红包参数
NSMutableDictionary *params = [@{} mutableCopy];
[params setObject:parameters[@"msgtype"]?:@"null" forKey:@"msgType"];
[params setObject:parameters[@"sendid"]?:@"null" forKey:@"sendId"];
[params setObject:parameters[@"channelid"]?:@"null" forKey:@"channelId"];
id getContactDisplayName = objc_msgSend(selfContact, @selector(getContactDisplayName));
id m_nsHeadImgUrl = objc_msgSend(selfContact, @selector(m_nsHeadImgUrl));
[params setObject:getContactDisplayName forKey:@"nickName"];
[params setObject:m_nsHeadImgUrl forKey:@"headImg"];
[params setObject:[NSString stringWithFormat:@"%@", nativeUrl]?:@"null" forKey:@"nativeUrl"];
[params setObject:m_nsFromUsr?:@"null" forKey:@"sessionUserName"];
if (kCloseRedEnvPlugin != HBPluginType) {
//自动抢红包
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:[docDir stringByAppendingPathComponent:HBPluginDelaySettingFile]];
if (dict){
HBPluginDelay = ((NSNumber *)dict[HBPluginDelayKey]).floatValue;
}
if (HBPluginDelay<0) {
HBPluginDelay=0;
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(HBPluginDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
((void (*)(id, SEL, NSMutableDictionary*))objc_msgSend)(logicMgr, @selector(OpenRedEnvelopesRequest:), params);
});
编写完代码,直接XCODE运行跑一遍,就可以生成你自己的dylib了。接下来要做的就是让微信来执行你的dylib。
重新打包微信App
准备工具:
- dylib注入神器:yololib
- 自动注入打包神器:iInjection.app
- 证书!没有证书什么都白搭。
有了以上3个,那就可以快速进行重新打包了。~!
Warning:打包之前记得删除微信APP包里的Watch文件夹以及Plugins文件夹里的东西~!
如图,这个工具支持的功能很全面。
Tips:如果需要定制个性版的微信(自定义微信图标,自定义微信APP显示名字,比如图标改成网易新闻的图标,名字改成网易新闻~你想用这个微信来干啥都不会有人怀疑啊)。可以在打包APP之前找两张120120 180180的png格式图片
名字改为AppIcon60x60@2x.png和AppIcon60x60@3x.png替换原app文件夹里的图片即可~改名则是通过上面的APP打包神器更改显示名字即可。
打包出来的ipa文件直接拖入PP助手就能快速安装了~
参考链接:
一步一步实现iOS微信自动抢红包(非越狱)
非越狱环境下从应用重签名到微信上加载Cycript
iOS 破壳 反编译 黑客技术大揭秘
工具下载:
进阶之路
这边就简单介绍几个工具。。
一款可以查看你是否注入成功的工具
这个厉害了。反编译APP,能显示汇编代码(无奈看不懂。),但是看不懂也没关系。。他能生成相应的伪代码。
越狱手机 上可以查看 任何APP的UI结构。
class-dump:
可导出APP的所有.h文件。
总结
网上现在教程也挺多,也能搜到很多前人先好的hook代码,如果真要自己去想实现一个功能从头到尾自己做还是非常难的!而且最近微信对于抢红包,多开微信的查处力度也在不断加强,微信那边简简单单加一句检测代码,逆向就可能要分析好久才能找到对应方法。(如果能拿到微信源代码那该多爽啊!)。
总之逆向非常坎坷,中途总会遇到莫名其妙的错误,只能不断的尝试当然最后成功的喜悦也是不言而喻的!希望大家都可以尝试尝试~