1中讲了找函数的方法,最近又有了新的感悟方法。
比如,我想逆向抖音的 评论功能
还是利用ida,当我们将可执行文件放入ida解析完毕之后,就可以看到app中的几乎所有执行发放,但是由于量太大,我们需要先进行函数的定位。
我们可以用logfiy查看当评论的时候这个controller执行了什么方法,当然 在控制台会打印很多行方法,但是总会有一些可疑的方法出现 例如 - (void)sendCommentContent:(id)arg1 inputView:(id)arg2;。很显然 这就是评论的函数,但是,由于这个函数是在详情页面实现的,我想做到在首页刷新视频列表,然后给视频发评论,点进去再评论太繁琐,而且这里调用评论参数同样很多,那么,我想通过一行代码 例如【xxx sendMsgTo: content: complete:】这样的方法。
这样的话,我们就需要ida了,打开ida,用上方菜单中的search功能,输入sendCommentContent,然后control+t,寻找下一个,找到评论页面执行的这个方法,然后看看里面到底发生了什么,在里面看了一些service方法的实现,然后我仔细扫了一遍,发现在最后几行objc_msgSend(v156, "commentWithContent:replyId:extraInfo:completion:", v186, v157, v159, &v192);,【补充一下,OC函数实现的底层都是抖的objc_msgSend方法,方法名都是一个串,不像我们写的那样会有提示】很显然,这行代码是评论函数中再次调用的一个函数,那么我们复制这个函数再次用ida的search功能,原来这个函数是AWECommentListManager类中的一个对象方法,我们在看看这个对象方法中大概发生了什么
void __cdecl -[AWECommentListManager commentWithContent:replyId:extraInfo:completion:](AWECommentListManager *self, SEL a2, id a3, id a4, id a5, id a6)
{
v19 = objc_retain(v16, v18);
+[AWEAwemeManager commentAwemeItemWithID:content:replyCommentID:extraInfo:completion:](
&OBJC_CLASS___AWEAwemeManager,
"commentAwemeItemWithID:content:replyCommentID:extraInfo:completion:",
里面又调用了AWEAwemeManager类中的commentAwemeItemWithID方法,很开心,感觉越来越接近最简单的方法了,用ida搜索commentAwemeItemWithID这个方法
在这个方法中,寥寥无几的几行代码,很开心 应该就是终极方法了,看了一下方法名果然和最初我想要的函数功能差不多【xxx sendMsgTo: content: complete:】给某个id发送某消息,最后有个block,我们用不着block回调 我们只需要自动发送评论。
最后整理一下就是
[%c(AWEAwemeManager) commentAwemeItemWithID:[dict objectForKey:@"group_id"] content:@"嗨,你好" replyCommentID:nil extraInfo:@[] completion:nil];
关于[dict objectForKey:@"group_id"] 中的dict哪来的,我们可以在刚才找这个方法的过程中看到这个dict的生成。
网友评论