首先挂上代理抓个登陆包,结果发现抓不到包,我们直接换个思路,采用vpn转发方式进行抓包;


sign, hsign,hext-union 三个参数加密;
hsign长度为32,可能为MD5 , 其他两个未确定;
直接上我们的url定位:我直接附加吧
frida-trace -UF -m "+[NSURL URLWithString:]"

是搞出来点东西,看样子有这个MD5, 先个堆栈追踪;
打开提示目录中的,URLWithString_.js 文件
C:\Users\Codeooo\__handlers__
把咱们万能堆栈加上去;
log('堆栈 from:\n' +Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('\n') + '\n');

记录下堆栈,砸壳分析一波:
砸壳我这里用的是 CrackerXI ,https://blog.csdn.net/weixin_38927522/article/details/129497173
0x1024da038 /var/containers/Bundle/Application/82E81B77-8825-4ABC-A91F-EABC37E3408D/Driver.app/Driver!-[AFHTTPRequestSerializer requestBySerializingRequest:withParameters:error:]
0x1024d9380 /var/containers/Bundle/Application/82E81B77-8825-4ABC-A91F-EABC37E3408D/Driver.app/Driver!-[AFHTTPRequestSerializer requestWithMethod:URLString:parameters:error:]
0x1038de2a0 /var/containers/Bundle/Application/82E81B77-8825-4ABC-A91F-EABC37E3408D/Driver.app/Driver!-[XYNetworkProxy dataTaskWithHTTPMethod:sessionManager:requestSerializer:URLString:parameters:uploadProgress:downloadProgress:constructingBodyWithBlock:error:]
0x1038de1a4 /var/containers/Bundle/Application/82E81B77-8825-4ABC-A91F-EABC37E3408D/Driver.app/Driver!-[XYNetworkProxy dataTaskWithHTTPMethod:sessionManager:requestSerializer:URLString:parameters:uploadProgress:downloadProgress:error:]
0x1038de118 /var/containers/Bundle/Application/82E81B77-8825-4ABC-A91F-EABC37E3408D/Driver.app/Driver!-[XYNetworkProxy sessionTaskForRequest:error:]
0x1038dd6a8 /var/containers/Bundle/Application/82E81B77-8825-4ABC-A91F-EABC37E3408D/Driver.app/Driver!-[XYNetworkProxy addRequest:]
0x1038d89e8 /var/containers/Bundle/Application/82E81B77-8825-4ABC-A91F-EABC37E3408D/Driver.app/Driver!-[XYBaseRequest start]
0x1038dc8f8 /var/containers/Bundle/Application/82E81B77-8825-4ABC-A91F-EABC37E3408D/Driver.app/Driver!-[XYNetworkManager getWithUrl:param:header:progress:completion:]
0x1024ed940 /var/containers/Bundle/Application/82E81B77-8825-4ABC-A91F-EABC37E3408D/Driver.app/Driver!+[DrLogin58NetworkManager request:withMethod:parameters:withTimeoutInterval:resultClassType:withSuccess:withFail:]
0x1024ee8c8 /var/containers/Bundle/Application/82E81B77-8825-4ABC-A91F-EABC37E3408D/Driver.app/Driver!+[DrLogin58RequestManager login:success:Failure:]
0x10250f07c /var/containers/Bundle/Application/82E81B77-8825-4ABC-A91F-EABC37E3408D/Driver.app/Driver!-[DrUserLoginViewController passwordLoginRequestByPhone:ThePassword:]
0x102510b68 /var/containers/Bundle/Application/82E81B77-8825-4ABC-A91F-EABC37E3408D/Driver.app/Driver!-[DrUserLoginViewController verifyLoginButtonClicked:]
0x1b2169300 UIKitCore!-[UIApplication sendAction:to:from:forEvent:]
0x1b1c12424 UIKitCore!-[UIControl sendAction:to:forEvent:]
0x1b1c12744 UIKitCore!-[UIControl _sendActionsForEvents:withEvent:]
0x1b1c117b0 UIKitCore!-[UIControl touchesEnded:withEvent:]
8966 ms +[NSURL URLWithString:]https://user.ksedt.com/api/login/v2?sign=314CEEC4B7FF8F7097990FA5FC412E635A31D4FA5760ECBBD3085C5C6F8C5E54A62F92A824DAF5C87E6708F21547BBCA09362643C2FFF4504B87EDC5247FA102
我们通过frida hook也是一样的:
var ClassName = "NSURL";
var MethodName = "+ URLWithString:";
var func = ObjC.classes[ClassName][MethodName];
Interceptor.attach(func.implementation, {
onEnter: function (args) {
console.log(Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join("\n"));
console.log("URL: ", ObjC.Object(args[2]), "\n");
}, onLeave: function (retval) {
}
});

hook第一个堆栈函数,看一下:

var requestBySerializingRequest = ObjC.classes.AFHTTPRequestSerializer['- requestBySerializingRequest:withParameters:error:'];
Interceptor.attach(requestBySerializingRequest.implementation, {
onEnter: function (args) {
console.log("args[2]: ", ObjC.Object(args[2]));
console.log("args[3]: ", ObjC.Object(args[3]));
console.log("args[4]: ", ObjC.Object(args[4]));
this.arg4 = args[4];
}, onLeave: function (retval) {
console.log("args[4]: ", ObjC.Object(this.arg4.readPointer()));
}
});

继续往上找吧;
找到这个堆栈:
// 0x1038dc8f8
/var/containers/Bundle/Application/82E81B77-8825-4ABC-A91F-EABC37E3408D/Driver.app/Driver!-[XYNetworkManager
getWithUrl:param:header:progress:completion:]


var initWithMethod = ObjC.classes.XYHTTPRequest['+ initWithMethod:requestURL:requestParam:requestHeaderField:'];
Interceptor.attach(initWithMethod.implementation, {
onEnter: function (args) {
console.log('initWithMethod called from:\n' +
Thread.backtrace(this.context, Backtracer.ACCURATE)
.map(DebugSymbol.fromAddress).join('\n') + '\n');
//console.log("args[2]: ", (args[2]));
console.log("args[3]: ", ObjC.Object(args[3]));
console.log("args[4]: ", ObjC.Object(args[4]));
console.log("args[5]: ", ObjC.Object(args[5]));
}, onLeave: function (retval) {
}
});


看来还是不对,再继续往上找:
找到: // 0x1024ed940
/var/containers/Bundle/Application/82E81B77-8825-4ABC-A91F-EABC37E3408D/Driver.app/Driver!+[DrLogin58NetworkManager
request:withMethod:parameters:withTimeoutInterval:resultClassType:withSuccess:withFail:]

这里有个方法比较特殊 记录下:

有个类似于MD5的调用,再点进去看看

也是个cc_md5;
再往上找:
// 0x10250f07c
/var/containers/Bundle/Application/82E81B77-8825-4ABC-A91F-EABC37E3408D/Driver.app/Driver!-[DrUserLoginViewController
passwordLoginRequestByPhone:ThePassword:]
看到这个函数,我们搞一下:
+[DrGenerateLoginRequestSign generateLoginRequestSignByParamDict:]
var initWithMethod = ObjC.classes.DrGenerateLoginRequestSign['+ generateLoginRequestSignByParamDict:'];
Interceptor.attach(initWithMethod.implementation, {
onEnter: function (args) {
console.log("args[2]: ", ObjC.Object(args[2]));
}, onLeave: function (retval) {
console.log("retval: ", ObjC.Object(retval));
}
});


这里面东西不少;
var initWithMethod = ObjC.classes.NSData['- jx_aes256EncryptWithKey:iv:'];
Interceptor.attach(initWithMethod.implementation, {
onEnter: function (args) {
console.log("args[0]: ", ObjC.Object(args[0]));
console.log("args[2]: ", ObjC.Object(args[2]));
console.log("args[3]: ", ObjC.Object(args[3]));
}, onLeave: function (retval) {
console.log("retval: ", ObjC.Object(retval));
}
});

retval:则是 314CEEC4B7FF8F7097990FA5FC412E635A31D4FA5760ECBBD3085C5C6F8C5E54A62F92A824DAF5C87E6708F21547BBCA09362643C2FFF4504B87EDC5247FA102
那我们aes的key找到了 , iv是 nil,那就是ecb模式,无需iv;
再看下data明文,62376363 37386263 31346130 37356639 34353462 62643733 33663564 62626164 7c70686f 6e653d31 38383838 38383838 38382670 77643d31 32333435 36

b7cc78bc14a075f9454bbd733f5dbbad|phone=18888888888&pwd=123456

b7cc78bc14a075f9454bbd733f5dbbad 哪里来?
var jx_toMD5 = ObjC.classes.NSString['- jx_toMD5'];
Interceptor.attach(jx_toMD5.implementation, {
onEnter: function (args) {
console.log("args[0]: ", ObjC.Object(args[0]));
}, onLeave: function (retval) {
console.log("retval: ", ObjC.Object(retval));
}
});

这里就说看出来 b7cc78bc14a075f9454bbd733f5dbbad 这里来;

hsign值得到了,其他参数都在请求里,30319502d66d31a4779bf67a54588c4ec572b3b5 这个值哪里来的:固定的吗?固定盐?

MD5的时候,同时又把 hsign 直接给勾出来了;

继续看下,hext-union,直接shift + F12, 老话说的好,直接ida搜字符串;




再通过上面hook aes脚本,仔细观察看下:


这个是跟设备一些关联;
args[2]: <3338387a 7a683770 77346961 67307039>
args[3]: <336b796c 77676c6d 63376d7a 66783265>


说明秘钥没问题;


对比下确实是没问题,只不过他的base64将/ + 号等都做了替换;
我们去ida看下是不是码表也有变化,方便我们在页面调整:

码表搞出来,替换上来:

对比完美结束。
所以说这个CyberChef是真的好用!!!

文章目录前言核心逻辑配置iSH安装Python创建Python脚本配置启动文件测试效果快捷指令前言iOS快捷指令所能做的操作极为有限。假如快捷指令能运行Python程序,那么可操作空间就瞬间变大了。iSH是一款免费的iOS软件,它模拟了一个类似Linux的命令行解释器。我们将在iSH中运行Python程序,然后在快捷指令中获取Python程序的输出。核心逻辑我们用一个“获取当前日期”的Python程序作为演示(其实快捷指令中本身存在“获取当前日期”的操作,因而此需求可以不用Python,这里仅仅为了演示方便),核心代码如下。>>>importtime>>>time.strftime('%Y-%
iOS适配Unity-2019背景由于2019起,Unity的Xcode工程,更改了项目结构。Unity2018的结构:可以看Targets只有一个Unity-iPhone,Unity-iPhone直接依赖管理三方库。Unity2019以后:Targets多了一个UnityFramework,UnityFramework管理三方库,Unity-iPhone依赖于UnityFramwork。所以升级后,会有若干的问题,以下是对问题的解决方式。问题一错误描述error:exportArchive:Missingsigningidentifierat"/var/folders/fr//T/Xcode
Note:thisquestioncouldlookoddonsystemsnotsupportingtheincludedemoji.这是HowdoIremoveemojifromstring的后续问题.我想构建一个正则表达式来匹配所有可以在MacOSX/iOS中输入的表情符号。明显的Unicodeblock涵盖了大部分,但不是所有这些表情符号:U+1F300..U+1F5FFMiscellaneousSymbolsAndPictographsU+1F600..U+1F64FEmoticonsU+1F650..U+1F67FOrnamentalDingbatsU+1F680..U+1
当我的应用启动时,情节板启动屏幕显示我的图像如预期的,但部分被灰色盒子覆盖。有人可以让我知道图像框的来源吗?启动屏幕上唯一的东西是页面上的图像。这是屏幕截图:看答案您是否检查了启动图像是否损坏了?
我正在尝试执行以下操作:在我的appDelegate中,我正在设置一个cookie。之后,我尝试使用来自网络应用程序的JavaScript读取该cookie。这可能吗?因为我不能让它工作...这是我在iOS应用程序中的代码:NSMutableDictionary*cookieProperties=[NSMutableDictionarydictionary];[cookiePropertiessetObject:@"test"forKey:NSHTTPCookieName];[cookiePropertiessetObject:@"yes"forKey:NSHTTPCookieValu
我有一个客户有一台原装iPad,我注意到它doesn'tsupportthe.bindmethod.问:如果我的老板坚持支持IOS5.1.1,是否有其他方法可以将变量传递给回调?我不认为我可以简单地将变量放入全局范围,因为如果我在循环中,我设置的变量可能会覆盖回调正在寻找的同一个变量。 最佳答案 您可以使用MDN提供的实现,甚至可以使用您自己的实现。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bin
在我的网站上用iPad测试词缀后,我发现它不能正常工作,我用眼镜观察它是iOS的问题https://github.com/twbs/bootstrap/issues/11560目前还没有简单的解决方案。iOSjusthasproblemswithcalculatingfixedpositionasyouscroll.Basicallyyoudon'tgetanupdatedfixedpositionuntilaslightdelayafteryoustopscrolling有什么我可以做的让它工作吗,可能有人已经做了一些解决? 最佳答案
首先,我知道contenteditable仅适用于iOS5我已经说明了这一点-我们为iOS5用户提供了一项功能,允许使用contenteditable进行富文本粘贴。到目前为止,此功能非常有效,我想做的就是当View似乎将contenteditable字段设置为事件(预选)以便出现键盘并且用户可以立即开始键入。这是我用于UIWebView的本地html文件PLACEHOLDER我已经尝试使用一些javascript来完成此操作,使用我找到的用于预选文本输入的教程。我无法让它工作,即使我试图切换到文本输入字段进行测试。这可能是由于我对javascipt缺乏经验,所以如果这是解决方案,请明
我有一个基于Web的应用程序,其中包含一个用户可以用手指上下滚动的组件。我使用事件的preventDefault方法来防止触摸移动在iOS设备上移动整个屏幕的默认行为。不幸的是,这在我今天早上刚升级到的iOS5中似乎不再有效。我不得不假设这在iOS5中的做法有所不同,但我还没有找到提供说明的资源。更新#1:我无法找到我的特定问题的答案,但我可以稍微调整我的代码以使用-webkit-overflow-scrolling样式(设置到“触摸”的值)并实现时髦的惯性滚动功能(其中内容滚动速度更快,具体取决于您的滑动速度,如果它触及边界,将“橡皮筋弹回”。看起来很酷...更新#2:我现在有另一个
Aquestion在SO上被问及iPhone4用户代理和iOS5.0用户代理。我使用以下方法检测不同的移动设备、视口(viewport)和屏幕。我希望能够区分iPhone5和所有其他iOS设备。据我所知,我用来检测iOS5.0用户代理variPhone5的行也适用于任何运行iOS5.0的iOS设备,所以从技术上讲它是不正确的。varpixelRatio=window.devicePixelRatio||1;varviewport={width:window.innerWidth,height:window.innerHeight};varscreen={width:window.scr