一、前语
本篇首要完成在微信上自动增加老友,然后了解 iOS 逆向分析的进程。
二、 东西
2.1 MacBook 软件
theos
制造 Tweak 的东西
hopper disassembler
用于静态分析
u *** muxd
端口转发,可以让咱们通过u *** 衔接手机进行ssh、lldb调试等。首要运用python-client目录下的文件
class-dump
dump 政策目标的 class 信息的东西.
lldb
> 调试神器,用过的都说好。默许自带,在/Applications/Xcode.app/Contents/Developer/usr/bin/lldb 中。
2.2 越狱iPhone 软件
以下软件在 Cydia 中即可下载
OpenSSH
完成在越狱手机上长途进行 ssh 服务
iOS 东西大部分都需求在 ssh 环境中运用
Cycript
&g在如下演示场景中,咱们假定侵犯者检验诱骗受害者将全部流量通过侵犯者控制的署理进行路由。t;脚本语言,用于 hook 正在作业的进程,并实时注入代码。
ondeviceconsole
用于在 Terminal 中检查手机的 log
debugserver
用于衔接手机进行 lldb 调试的东西。用 Xcode 在手机上进行 app 调试即可生成,在手机目录的 /Developer/usr/bin/ 中。
运用 debugserver 03 00000000`000ac6a0 00000001`3fe6cdd0 windbg!WinCommand::OnNotify+0x454需求先进行处理。因为短少task_for_pid权限,所以调试不了其他的 app。
先通过 ssh 复制 debugserver
scp root@iOSIP:/Developer/usr/bin/debugserver ~/debugserver
瘦身
lipo -thin armv7s ~/debugserver -output ~/debugserver// 看自己手机是armv7s 仍是arm64
下载 ldid 与 ent,进行
ldid - Sent.xml debugserver
在运用 ssh 复制至手机,完结。
三、 分析
思路:想要完成自动增加老友,则要拿到获取老友恳求的 *** ,以及增加老友的 *** 。hook 获取老友恳求的 *** ,在接纳到老友恳求的时分,实行增加老友的 *** 。
而这些首要逻辑在“新的朋友”界面。
3.1 定位老友恳求的 ***
3.1.1 UI 分析
想要拿到老友恳求的 *** ,要先拿到 *** 完成的 ViewController。而这时分可以通过 UI 分析取得。
先翻开新的朋友界面。
运用 u *** muxd 进行端口的转发(若手机不卡,可以越过这步直接运用ssh进行wifi长途衔接)
python tcprelay.py -t 22:2222
再运用ssh衔接至手机
ssh roothome.php?mod=space&uid=485241 -p 2222// ssh root@192.168.31.94
检查微信的进程信息
ps -e |grep WeChat
cycript 注入
cycript -p WeChat
检查其时 UI 布局
UIApp.keyWindow.recursiveDescription().toString()
因为知道其时的视图有tableview,所以找到tableview的目标。从上图可以看到该目标的地址为0x18c4be00。
在运用 nextResponder()依据响应者往上找其时的控制器。
找到其时的控制器,为SayHelloViewController
3.1.2 Log 分析
运用class-dump dump 出微信的 clas
s 信息。
class-dump -S -s -H demo.app -o ~/Document/headers/// 保存在 ~/Document/headers/ 目录中
再运用 theos 的 logify 东西,该东西用来注入NSLog来打印 *** 的入参和出参。(便是在一切的 *** 里边加 log)
logify.pl ~/Document/headers/SayHelloViewController.h > ~/Desktop/Tweak.xm
留意:一般该Tweak.xm依然无法实行,需求进行修正:
Accept-Encoding: //默许是identity去掉.cxx_destruct ***
将HBLogDebug 改为NSLog
去掉一切的delegate
将一切的参数目标类型改成id
去掉一切的weak
再运用theos配备相关文件详细检查前一篇文章, 然后进行make package install 设备至手机。
从头启动微信进入新的朋友界面。
在ssh中运用ondeviceconsole打印手机的 log。
这时用另一个微信号增加自己老友。动身老友恳求的 *** 。可以看到以下的 log
阐明有老友增加恳求的时分,会调用
-[SayHelloViewController OnSayHelloDataChange]
3.1.3 动态分析
已然现已知道了其时控制器会调用OnSayHelloDataChange,那么咱们可以想怎样检查是哪些 *** 触发了OnSayHelloDataChange,这时分就要用到 lldb + hopper 神器了。
先用 hopper 翻开微信的二进制文件。搜索-[SayHelloViewController OnSayHelloDataChange] *** 。
可以看到其时 *** 在微信中的偏移地址0x14a4824。
再运用 u *** muxd 转化端口[!-]*|-*[!ne]*) break ;;
python tcprelay.py -t 1234:1234
在 ssh 到手机上,敞开 debugserver 。
debugserver *:1234 -a "WeChat"
运用新的 terminal 窗口,翻开 lldb,衔接1234端口,并检查其时一切进程。
此刻会卡住一段时间。
// 翻开lldb/Applications/Xcode.app/Contents/Developer/usr/bin/lldb// 衔接端口调试(lldb) process connect connect://localhost:1234// 打印一切进程(lldb) image list -o -f
找到微信在其时手机上的进程内存基地址为0x000b2000(这个值不是不变的)
通过以上可以找到 [SayHelloViewController OnSayHelloDataChange] *** 在手机上的内存地址。即
内存地址 = 进程内存基地址 + *** 偏移地址
运用 br 打断点检查
br s -a "0x000b2000 + 0x14a4824"
接着输入 c 继续作业,从头运用另一微信账号增加老友,会触发该断点。
运用 bt 检查调用栈信息,即哪些 *** 调用了其时的 *** ,找到 *** 的上游。(异步调用的话没 *** 检查)
之一个表明其时的 *** ,可以看到在调用此 *** 前,该进程一共调用了3个 *** 。
别离计算出这三个 *** 在微信中的偏移量。
将这三个地址在 hopper 中检查,找到了对应的 *** 为
// 调用的次序为从下到上[SayHelloViewController OnSayHelloDataChange][SayHelloDataLogic onFriendAssistAddMsg:][FriendAsistSessionMgr OnAddMsgForSpecialSession:MsgList:][CMessageMgr MainThreadNotifyToExt:]
从以上 *** 名可以猜测
[FriendAsistSessionMgr OnAddMsgForSpecialSession:MsgList:]
是用来接纳增加老友音讯的函数处理,其间MsgList:后边的参数或许为音讯的数组,为了证明咱们可以打个断点检查下。
看出r3的确是个数组,一起也得到了音讯的目标为CMessageWrap 证明咱们是对的。
解说下为什么要看r3,因为在 armv7 中,一个 *** 的调用,一般寄存器都是这么存储的。前四个参数放在r0~r3,剩余的存放在仓库中。检查仓库的话运用x/10 $sp 检查前10个仓库里的目标地址。
但是FriendAsistSessionMgr这个类或许需求一些初始化,且放在SayHelloViewController中,而咱们想要的是不论在哪个控制器里都可以 hook 住上面的音讯数组目标。因而咱们往上找,[CMessageMgr MainThreadNotifyToExt:],但是里边并没有咱们需求的信息。而依据类名咱们估测CMessageMgr是用来办理音讯的。有或许是在异步实行了音讯数组的获取。
因而,重复以上过程,运用 logify 对CMessageMgr进行 Log 分析。终究确定了
CMessageMgr MessageReturn: MessageInfo:Event:
3.2 定位 通过老友恳求的 ***
3.2.1 动态分析
咱们知道,通过老友恳求的 *** ,是在新的朋友界面,点击承受的时分触发的。(可以通过 Log 分析,但是这儿还有另一个比较快速的 *** )
相同,咱们可以运用 cycript 进行定位。
先依照 3.1 的 *** ,打印出一切的UI层级。
找到“承受”按钮的目标,(有个技巧,咱们知道其时按钮是在某个cell下面的,所以定位这个)。
在把该目标的 hidden = 1,看是否躲藏。
#0x186922f0.hidden = 1
发现按钮不见了,证明咱们是对的。
而咱们知道 UIButton 是承继 UIControl 的,而 UIControl 的话可以通过allTargets 与 allControlEvents检查一切的目标与事情,再运用actionsForTarget:forControlEvent:然后找到触发的 *** 。
看出所触发的 *** 为[ContactsItemView onRightBtnAction]
3.2.2 静态分析
已然拿到了 *** 名,那咱们怎样看他详细的完成呢?
接下来便是大名鼎鼎的hopper 上台了。
用 hopper 翻开微信的二进制文件,并进行汇编与伪代码的转化。
因为汇编读起来比较不流畅,所以仍是进行伪代码的转化,这样功率比较快。点击该按钮进行转化
可以得到伪代码
上图咱们看到了
r10 = self;r5 = r10 + *0x33befe8;r4 = objc_loadWeakRetained(r5);r8 = @selector(onContactsItemViewRightButtonClick:);r11 = [r4 respondsToSelector:r8];
可以得出,r11 = [r5 onContactsItemViewRightButtonClick:btn],而 r5 咱们判别为 self 的代{过}{滤}理,这个咱们也可以通过在之前用 class-dump 的头文件里边搜索onContactsItemViewRightButtonClick,会发现在ContactsItemViewDelegate中。
也便是[ContactsItemView onRightBtnAction]内部调用了[self.delegate onContactsItemViewRightButtonClick:].
而 ContactsItemView 的delegate为 SayHelloViewController。
再用 hopper 定位onContactsItemViewRightButtonClick。
看到这儿估计会很蒙不知道从何下手。这时分只需加以估测就可以了。
上图中进行了两个if判别,之一个为
r10 = @selector(class);r2 = loc_1c099bc(@class(CPushContact), r10);r1 = @selector(isKindOfClass:);r5 = loc_1c099bc(r4, r1, r2);loc_1c099d4(r4);if ((r5 & 0xff) != 0x0) {
可以得出其实是实行了 if([r4 isKindOfClass:[CPushContact class]]);
而r4是什么呢?可以肯定是 CPushContact 目标,否则下面的代码都不实行了。咱们可以依据3.1的动态分析,通过lldb打断点,并检查r3寄存器的目标类型,可以看到该目标为 CPushContact 目标。因而r4便是 CPushContact 目标,依据字面意思可以得到便是联系人目标。
继续看下面的代码,可以看到也进行了一次判别if (((loc_1c099bc(r6, @selector(m_bSuspiciousUser)) & 0xff) != 0x0) && ((loc_1c099bc(r6, @selector(isMMContact)) & 0xff) == 0x0)),看到了MMUIAlertView。估测是弹窗的 view ,估测如果是可疑的用户或许其时恳求的老友现已是自己的老友,那就进行弹窗。而另一部分为verifyContactWithOpCode:opcode:,估测该部分为增加老友的 *** 。
可以通过Log 分析或许通过 lldb 打断点,会看到都会进入该 *** 。且参数别离为 CPushContact 目标与 3。
接着继续分析verifyContactWithOpCode:opcode: *** 。首要的部分如下所示。
通过分析,咱们可以得到,承认老友恳求,显现结构了CContactVerifyLogic目标。再结构了一个CVerifyContactWrap目标,并设置了相关特点,比方m_nsUsrNamem_uiScene m_nsTicket.然后通过增加到数组中,通过CContactVerifyLogic目标的startWithVerifyContactWrap:opCode:parentView:fromChatRoom: *** 发送。
代码如下:
CContactVerifyLogic *verifyLogic = [[CContactVerifyLogic alloc] init];CVerifyContactWrap *wrap = [[CVerifyContactWrap alloc] init];[wrap setM_nsUsrName:contact.m_nsEncodeUserName];[wrap setM_uiScene:contact.m_uiFriendScene];[wrap setM_nsTicket:contact.m_nsTicket];[wrap setM_nsChatRoomUserName:contact.m_nsChatRoomUserName];wrap.m_oVerifyContact = contact;AutoSetRemarkMgr *mgr = [[MMServiceCenter defaultCenter] getService:[AutoSetRemarkMgr class]];id attr = [mgr GetStrangerAttribute:contact AttributeName:1001];if([attr boolValue]) { [wrap setM_uiWCFlag:(wrap.m_uiWCFlag | 1)];}[verifyLogic startWithVerifyContactWrap:[NSArray arrayWithObject:wrap] opCode:3 parentView:[UIView new] fromChatRoom:NO];
这样咱们就得到了 获取老友恳求的 *** 与增加老友的 *** 。
而这儿还有一个问题,便是增加老友的目标是CPushContact,而取得老友恳求的目标的CMessageWrap。这儿需求进行转化,而转化的 *** 也在SayH }elloViewController中,可以重复上面的分析 *** 取得。
四、编写Tweak
通过以上的分析,将代码兼并起来
%hook CMessageMgr- (void)MessageReturn:(unsigned int)arg1 MessageInfo:(NSDictionary *)info Event:(unsigned int)arg3 { %orig; if (arg1 == 332) { // 收到增加老友音讯 NSString *keyStr = [info objectForKey:@"5"]; if ([keyStr isEqualToString:@"fmessage"]) { NSArray *wrapArray = [info objectForKey:@"27"]; [self addAutoVerifyWithArray:wrapArray]; } }}%new- (void)addAutoVerifyWithArray:(NSArray *)ary { [ary enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { CPushContact *contact = [%c(SayHelloDataLogic) getContactFrom:obj]; if (![contact isMyContact] && [contact.m_nsDes isEqualToString:autoVerifyKeyword]) { CContactVerifyLogic *verifyLogic = [[%c(CContactVerifyLogic) alloc] init]; CVerifyContactWrap *wrap = [[%c(CVerifyContactWrap) alloc] init]; [wrap setM_nsUsrName:contact.m_nsEncodeUserName]; [wrap setM_uiScene:contact.m_uiFriendScene]; [wrap setM_nsTicket:contact.m_nsTicket]; [wrap setM_nsChatRoomUserName:contact.m_nsChatRoomUserName]; wrap.m_oVerifyContact = contact; AutoSetRemarkMgr *mgr = [[%c(MMServiceCenter) defaultCenter] getService:%c(AutoSetRemarkMgr)]; id attr = [mgr GetStrangerAttribute:contact AttributeName:1001]; if([attr boolValue]) { [wrap setM_uiWCFlag:(wrap.m_uiWCFlag | 1)]; } [verifyLogic startWithVerifyContactWrap:[NSArray arrayWithObject:wrap] opCode:3 parentView:[UIView new] fromChatRoom:NO]; } }];}
五、总结
因为整个逆向流程有点繁琐,有时分也不是只需分析一次就可以成功的,需求反反复复的进行UI分析、LOG分析、lldb分析。因而或许在进程中,有些常识没有漏掉,期望我们可以指出。
黑客模拟器:浅淡苹果体系iOS逆向技能共享
· SwampThing.exe {现已看过的朋友,咱继续。564120:28:17.300000 3 taskmgr.exe (3532) - RegOpenKey (hive=REGISTRYMACHINESYSTEM,key=ControlSet001ControlNls
LocaleSOFTWAREMicrosoftCTFKnownClasses,pid=3532, status=3221225524, tid=4324)浅淡苹果系统iOS逆向技术分享
黑客模拟器getuid
设备剧本还会设备KillerBee政策和作业该政策所需的其他依托。进击影响分析
$ ./client.py -v 127.0.0.1 1矿池地址黑客模拟器
开发途径:VisualStudio Professional 2015(14.0.25431.01 Update 3)一个USB设备在不同主机之间进行交叉运用的情况,就类似于生物界的“授粉”(Pollination)现象。这种交叉感染的概念,相同适用于不同 *** 内不同主机间的USB混用。翻开指令行窗口,运用指令“whoami”来检查其时Windows用户账号的情况。
1.越狱后在cydia上设备OpenSSH
$ret = 0;AllowUsers aa@10.0.0.50 #对方用户对方ip。 * While the user could easily DoS the kernel, I don't think they
浅淡苹果系统iOS逆向技术分享黑客模拟器针对信用卡的暴力侵犯 *** —分布式猜测侵犯(Distributed Guessing Attack)IS
C BIND 9.4.2 on open port 53coffee make这种 *** 可以运用exploit/windows/local/ask模块,但是该模块实践上只是以高权限重启一个回来式shellcode,并没有绕过UAC,会触发系统UAC,受害机器有提示,提示用户是否要作业,假设用户选择“yes”,就可以程序回来一个高权限meterpreter shell(需求实行getsystem)。如下:
在这种情况下,的确仍是全盘加密更安全些,虽然的确要牺牲必定的系统功用。msfvenom -p linux/x86/meterpreter/bind_tcp lport=4444 -f elf -o bindshelluname -a
一盘两用,用金山快盘加密文件夹
黑客模拟器数据版别:if self.bp_end == None:这个系统相同可以通过相同的网关192.168.101.6访问,运用443端口,并且有一个登录功用。浅淡苹果系统iOS逆向技术分享
它是一个依据 Debian GNU/Linux操作系统,发起之后会自动作业Tor,它不向本地系统储存任何数据。系统内部预设备一些软件程序,例如 *** 浏览器、即时通讯客户端,电子邮件客户端,作业软件,图像和动静编辑器等。这都以安全为理念进行了预配备,并对 *** 流量进行了匿名性处理。为达到此政策,该系统运用了 Tor *** ,以使得 *** 流量很难被寻找。B05E577E002C510E7AB11B996A1CD8FE8FDADA0C如前面所述,研究者可以reboot系统并运用该Shim缓存分析器东西分析注册表中序列化的应用程序兼容性缓存。或许从内核内存获取内存转储并运用ShimCacheMem插件直接分析应用程序兼容性缓存。
extern "C" void __stdcall some_func()
本文标题:黑客模拟器:浅淡苹果体系iOS逆向技能共享
位于意大利北部布雷萨诺内的TreeHugger旅游信息办公室的特色是光滑的混凝土墙,弯曲在树干周围。由当地工作室MoDus Architects设计的小建筑毗邻主教宫,这是一栋13世纪的别墅,是该镇的...
聂耳是个非常有名的音乐家。但是人们对于聂耳还是会有些疑问。譬如聂耳是哪里人、聂耳到底是谁、聂耳除了音乐家以外还有没有别的身份等等。先来说一下聂耳是哪里人吧。聂耳出生在云南昆明,但他并不是云南昆明人,而...
去海边总是很有趣的经历,可以吸收阳光,在沙滩上玩耍。这是完美的夏日活动。无论您是在热带某个地方度假还是去最靠近您的海滩放松一天,都有一些基本知识是每个人都必须拥有的,以度过最美好的海滩一天。这些必不...
Win10系统设置WiFi热点时提示“无法启动承载网络”,导致了WiFi热点设置失败了,那么Win10系统设置WiFi热点时提示“无法启动承载网络”怎么办?下面小编带来具体解决方法,来看看吧。 1.我...
天津市外场商务群-少付酒店餐厅廉价营销 伴游叙述:近期有很多盆友在商务预约网后台管理留言板留言,想掌握有关天津市外场商务群信息内容。因此我根据百度搜索、知乎问答、百度文库等方式,汇总了下列有关天津市外...
微信聊天记录删除了怎么恢复?手机中我们打开最多的应用就是微信,经常使用微信进行聊天,里面保存我们大量的聊天记录。 不小心删除了微信聊天记录怎么找回?一起来看看解决办法 微信聊天记录备份?微信是大家都熟...