目录

2023-06-01-某点资讯Signature纯算逆向

目录

某点资讯Signature纯算逆向

本篇主要是介绍一些工作的运用熟练性,以及跟踪堆栈去看是否做一些其他操作等:

抓包:

https://i-blog.csdnimg.cn/blog_migrate/180c1e2e8c13c61a1f412778eb2dd956.png

signature 为加密值;

https://i-blog.csdnimg.cn/blog_migrate/e7c15164a9ae4f0f997432066400fd81.png

先上trace下堆栈及加密

https://i-blog.csdnimg.cn/blog_migrate/3a7283034d9e580093c5cc677f1e8690.png

https://i-blog.csdnimg.cn/blog_migrate/d0598c53cf66f13082028fa5b5a3aeb0.png

我们把结果base64下,看结果是否一致,来判断base64是否魔改

https://i-blog.csdnimg.cn/blog_migrate/5a08cebdc8333691747bc47e2375e665.png

https://i-blog.csdnimg.cn/blog_migrate/c7fc3bde2e1df2de041ff2f0c7bb3cde.png

https://i-blog.csdnimg.cn/blog_migrate/0cbe81c8c00f2b61ee2270a30dff533a.png

验证base64为标准;

根据刚刚的堆栈,跟一下

0x101115468 /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!+[RSA encryptData:withKeyRef:isSign:]

0x101115ae0 /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!+[RSA encryptData:publicKey:]

0x101115a28 /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!+[RSA encryptString:publicKey:]

0x10108a8ac /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!-[YDRequest getSignatureWithReqId:]

0x10108a6b0 /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!-[YDRequest updateParametersForGet:reqid:]

0x10108aaf4 /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!-[YDRequest initWithURLString:parameters:method:]

0x10108e300 /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!-[HpEngineRequest initWithURLString:parameters:method:]

0x101047544 /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!-[HpEngine refreshNewsListOfKeyword:sinceIndex:]

0x101a17858 /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!-[HpNewsListDataProvider userRefreshLatestData:]

0x1017be2ac /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!-[YDNewsListView userRefreshData:]

0x101a235bc /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!-[YDNLViewModel didFinishLoadingLocalData:]

0x101a166f0 yidian!0x16ae6f0 (0x1016ae6f0)

0x232360a38 libdispatch.dylib!_dispatch_call_block_and_release

0x2323617d4 libdispatch.dylib!_dispatch_client_callout

0x23230f008 libdispatch.dylib!_dispatch_main_queue_callback_4CF

V A R I A N T VARIANT

V

A

R

I

A

NT mp

0x2328b4b20 CoreFoundation! CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE

https://i-blog.csdnimg.cn/blog_migrate/ffbe2f79042351cb817161d166f07b0a.png

https://i-blog.csdnimg.cn/blog_migrate/d5e753ad348d7969e73b4db5f8869175.png

我们再hook下:encryptData:withKeyRef:isSign:

https://i-blog.csdnimg.cn/blog_migrate/6fc0ae07353fc02701fba86b1eed73ad.png

frida -UF -l hook.js 直接附加在该app上

var initWithMethod = ObjC.classes.RSA['+ encryptData:withKeyRef:isSign:'];
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]: ",  ObjC.Object(args[2]));
        console.log("args[3]: ", hexdump(args[3]));
        console.log("args[4]: ", args[4]);
    }, onLeave: function (retval) {
        console.log('Base64Encode() this.args1 onLeave:',  hexdump(retval));
    }
});

https://i-blog.csdnimg.cn/blog_migrate/f5c8331d55efe5a01d7129b8c77fd4c9.png

bool a5为 0,也就是false, 直接走

https://i-blog.csdnimg.cn/blog_migrate/e60b12822c2309e1231e73442c27d971.png

https://i-blog.csdnimg.cn/blog_migrate/9cb32b669e2e544d01b9c818b3da6256.png

这个时候就明白了吧,这个地方就是上面的 最开始trace下堆栈及加密的地方了。

根据堆栈再往上看下吧:

https://i-blog.csdnimg.cn/blog_migrate/3ad03a325eb4116bc06c96ccb1265a3f.png

https://i-blog.csdnimg.cn/blog_migrate/a7b45e65c2e25869f29a73b0a17def67.png

看到这里也是做了rsa然后base64, 没有其他操作

我们hook下吧:

var initWithMethod = ObjC.classes.RSA['+ encryptString:publicKey:'];
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]: ", ObjC.Object(args[2]));
        console.log("args[3]: ", ObjC.Object(args[3]));
        console.log("args[4]: ",hexdump(args[4]));
    }, onLeave: function (retval) {
       console.log('Base64Encode() this.args1 onLeave:',  ObjC.Object(retval));
    }
});

https://i-blog.csdnimg.cn/blog_migrate/2eb62c60a19a5d9a952e4a6a54073edc.png

https://i-blog.csdnimg.cn/blog_migrate/0dd773e930b0b2864e6613d2b2380b1f.png

我去,这不就直接出来了吗

需要加密的值 :“pro6.4.0.00njbh2wlr_1685327378963_38033100”

入参拼接 appid、cv、platform、reqid、version

秘钥公钥也出来了。

https://i-blog.csdnimg.cn/blog_migrate/53efc8f821b3ea20e3e27d2ee9a0f2bc.png

没毛病,收工!

68747470733a2f2f626c6f672e:6373646e2e6e65742f77656978696e5f33383932373532322f:61727469636c652f64657461696c732f313330393433353639