从业iOS后,也算兢兢业业,平时关注一些OC,swift动态,看别人造的完美轮子来学习,而自己造的轮子和自己做的饭有相同功效,只有自己能吃的下去。然而这并不是重点,重点是自己一直忽略的ios黑产,其实依然一片繁荣。
最近会帮朋友搞一些ios破壳和逆向、外挂的功能,也算是涨了见识。下面列举一些常见的黑产需求:
- 修改别人游戏包,自己获利。
- 破壳,用途太广。可用来研究逻辑,也修改发布等等。
- 外挂。微信抢红包,钉钉打卡等。
- 企业签名。 昨天报价 8W,单个ios包签名报价大多在 500以内,看来只是签名,需要一段才能回本。
杂谈:
时间久了,到现在记得的一些逆向过程中印象比较深的事情。
游戏启动的时候要验证授权,没有授权直接kill。
程序启动的时候,有6、7个方法判断是否是越狱手机,是越狱手机kill,加大逆向成本。
修改程序中的所有连接域名,换壳。
还有逆向的较量,别人加的外挂防破解,而你又要去破解他的外挂,逆向之防逆向。
下面写个最近破解别人写的外挂程序。
最近的需求时在别人破解过的包中再次破解。
原始App是一个保险销售使用的销售软件,被人破解,加入随时随地指定坐标打卡。但是加了一个授权码,收费使用。
而我的需求就是在已破解的情况下,再次绕过授权码。
通过抓接口,找到验证接口域名,然后确定是每个动态库 的作用。(以为是已经破解的,所有 framwork
目录下已经有了5,6个自定义的dylib)。
如下:其中真实名字已隐藏,毕竟搞别人的app不太地道。
.
├── isMe.dylib
├── JSPatch.js
├── RevealServer.framework
├── custom1.dylib
├── custom2.dylib
├── libsubstrate.dylib
└── custom3.dylib
经确定控制验证的库为 custom3.dylib,然后用hopper找验证函数。
void * -[Auth getUserCode](void * self, void * _cmd) {
r0 = [NSUserDefaults standardUserDefaults];
r0 = [r0 retain];
stack[2043] = [[r0 objectForKey:@"!@#$*@#(!@^#(!@^#(!@^#"] retain];
[r0 release];
stack[2041] = [stack[2043] retain];
objc_storeStrong((sp - 0x1c) + 0x8, 0x0);
r0 = stack[2041];
r0 = [r0 autorelease];
return r0;
}
其中 !@#$*@#(!@^#(!@^#(!@^#
为key,我就想着直接在启动时写入正确的激活码就可以了。但是并不是一帆风顺,key其实和设备有绑定关系,这个被我忽略了,走了挺多弯路才知道。所以我还需要修改设备的标示,继续找。
r0 = [UUIDManager getUUID];
r0 = [r0 retain];
stack[1994] = r0;
stack[1992] = [[r0 substringToIndex:0x20, r1, stack[1964], stack[1965]] retain];
stack[1989] = [[NSString stringWithFormat:@"uuid=%@&", stack[1992]] retain];
额,然后在想办法在 UUIDManager getUUID
返回已经绑定过的UUID就可以。
这个算是通过了。但是要有一些dylib打包的错误。这个都是小问题了。
如果是做ios开发的话,对逆向有了解的话,对开发和安全都会有提高,比如上面的key就可以不用写成明文。
已经建议我家萌小七(也是媛)看逆向了,不过貌似没什么兴趣。(无奈脸)。还是手把手教吧。