【iOS逆向与安全】原生程序与WebView交互

这篇具有很好参考价值的文章主要介绍了【iOS逆向与安全】原生程序与WebView交互。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

WKWebView 是 iOS 应用中强大的组件,但如何在逆向工程中最好地利用它呢?本文将带您了解在逆向过程中遇到webview后的相关操作。这些技术将让您能够修改 WKWebView 行为,读写关键元素,接口拦截,并揭示更多有趣的可能性。


一、目标

了解如何在 iOS 逆向工程中处理 WKWebView,包括 元素读写和接口拦截的基本概念。

二、开发环境和工具清单

  • mac系统
  • Xcode13.2.1
  • iOS15设备

三、流程

1、示例程序

手动创建一个示例程序,里面只包含了一个基本的webview容器,呈现的内容为某app的滑块url,基础代码如下:

@interface ViewController ()

@property (nonatomic, strong) WKWebView *webview;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self.view addSubview:self.webview];
    
    NSURL *url = [NSURL URLWithString:@"https://xxx/xxx"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [self.webview loadRequest:request];
}

- (WKWebView *)webview {
    if (_webview == nil) {
        _webview = [[WKWebView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    }
    return _webview;
}

@end

界面效果图:

app原生和webview交互流程图,ios,安全,交互

url的部分html代码如下:

app原生和webview交互流程图,ios,安全,交互

2、拦截并修改html

由于h5里内容被包含在一个自定义标签里(shadow-root),而这自定义标签的模式为closed。我们需要拦截并把该标签的模式改为open,这样才能通过css选择器去获取对应的子元素。通过全局搜索发现自定义标签于xxx.js返回。直接上代码:

a、修改webview的初始化代码如下:

// 修复'https' is a URL scheme that WKWebView handles natively错误
Method m1 = class_getClassMethod([WKWebView class], @selector(handlesURLScheme:));
Method m2 = class_getClassMethod([ViewController class], @selector(hook_handlesURLScheme:));
method_exchangeImplementations(m1, m2);
        
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
        
// 设置当前对象来处理webview的https请求
[config setURLSchemeHandler:self forURLScheme:@"https"];
        
_webview = [[WKWebView alloc] initWithFrame:[[UIScreen mainScreen] bounds] configuration:config];

b、实现处理https请求的协议:

- (void)webView:(nonnull WKWebView *)webView startURLSchemeTask:(nonnull id<WKURLSchemeTask>)urlSchemeTask {
    NSURLRequest *request = urlSchemeTask.request;
    NSString *urlStr = request.URL.absoluteString;
    
    NSLog(@"req url =%@=", urlStr);
    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (error) {
            [urlSchemeTask didFailWithError:error];
        } else {
            if ([urlStr containsString:@"xxx.js"]) {
                // 获取xxx.js的内容
                NSString *modifyData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                
                // 查询attachShadow({mode:\"closed\"})并替换为attachShadow({mode:\"open\"})
                modifyData = [modifyData stringByReplacingOccurrencesOfString:@"attachShadow({mode:\"closed\"})" withString:@"attachShadow({mode:\"open\"})"];
                
                // 覆盖xxx.js内容
                data = [modifyData dataUsingEncoding:NSUTF8StringEncoding];
            }
            
            // 设置当前请求的返回信息
            [urlSchemeTask didReceiveResponse:response];
            [urlSchemeTask didReceiveData:data];
            [urlSchemeTask didFinish];
        }
    }] resume];
}
app原生和webview交互流程图,ios,安全,交互app原生和webview交互流程图,ios,安全,交互

2、修改html元素

修改按钮文案"拖动滑块完成上方拼图"为"移动端小陈",修改html元素和修改js基本上一样,关键代码如下:

NSString *modifyData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if ([modifyData containsString:@"拖动滑块完成上方拼图"]) {
    modifyData = [modifyData stringByReplacingOccurrencesOfString:@"拖动滑块完成上方拼图" withString:@"移动端小陈"];
    // 替换html内容
    data = [modifyData dataUsingEncoding:NSUTF8StringEncoding];
}

3、获取img标签的值

简单的内容可通过查找替换处理。而复制的内容,还得用css选择器。咱们通过在webview中执行一段js来获取特定元素(注:获取到的结果只能是string类型),获取img标签的关键代码如下:

NSString *jsFunc = @"\
function getImgSrc(clsName) {\
var sliderImg = document.querySelector('#captcha-dialog').children[1].shadowRoot.querySelector('#slider').getElementsByClassName(clsName);\
if (sliderImg.length > 0) {\
  var imgSrc = sliderImg[0].src;\
  return imgSrc;\
} else {\
  return "";\
}\
};getImgSrc('#cls-name#')";

[webView evaluateJavaScript:[jsFunc stringByReplacingOccurrencesOfString:@"#cls-name#" withString:@"slider-img-bg"] completionHandler:^(NSString *backgroundData , NSError *error) {
    NSLog(@"background =%@=", backgroundData);
}];

4、接口拦截

修改某接口的请求参数,代码如下:

   // 修改接口的请求
    if ([urlStr containsString:@"xxx"]) {
        NSMutableDictionary *body = [NSJSONSerialization JSONObjectWithData:request.HTTPBody options:0 error:nil];
        body = [body mutableCopy];
        body[@"e"] = @(0);
        NSMutableURLRequest *mutableRequest = [NSMutableURLRequest requestWithURL:request.URL.absoluteURL
                                                                      cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                                  timeoutInterval:10.0];
        mutableRequest.HTTPMethod = @"POST";
        mutableRequest.allHTTPHeaderFields = request.allHTTPHeaderFields;
        mutableRequest.HTTPBody = [NSJSONSerialization dataWithJSONObject:body options:0 error:nil];
        request = mutableRequest;
    }

修改某接口的响应和上边的修改js类型,大家自行尝试


总结

以上就是在逆向中遇到webview后的相关处理办法,希望能对你有所帮助。

源码请关住工众好后回复:webview源码

提示:阅读此文档的过程中遇到任何问题,请关住工众好【移动端Android和iOS开发技术分享】或+99 君羊【812546729

app原生和webview交互流程图,ios,安全,交互

app原生和webview交互流程图,ios,安全,交互文章来源地址https://www.toymoban.com/news/detail-786738.html

到了这里,关于【iOS逆向与安全】原生程序与WebView交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp 在app和小程序端使用webview进行数据交互

    结论:app端支持比较好可以做到实时传递,微信小程序支持比较差,小程序向url传参只能通过url,url向app传参需要特定时机(后退、组件销毁、分享、复制链接)触发才能收到消息。 以下是代码 app端(需要使用nvue) 微信小程序端(正常vue格式) 3、html端

    2024年02月16日
    浏览(46)
  • Android与H5交互 -- 点击H5跳转到 Android原生 页面 ,webview与h5(js)交互

    Android与H5交互 app开发过程中,利用原生+h5模式来开发是比较常见的 下面案例演示的是:原生调起一个H5页面,然后H5点击跳转到原生 WebViewActivity页面 调用H5 ,点击H5链接 跳转到原生MainActivity页面 注意 别忘了 !-- 添加网络权限 -- 一、清单文件,增加的配置 data的数据就是H5

    2023年04月14日
    浏览(72)
  • 利用webview 内嵌实现小程序,h5 ,app 页面跳转和数据通讯,附带实现pdf文件的预览(兼容ios和安卓)

    承载网页的容器。会自动铺满整个小程序页面, 个人类型的小程序暂不支持使用。 客户端 6.7.2 版本开始,navigationStyle: custom 对 web-view 组件无效 相关的属性说明:开放能力 / web-view (qq.com) 2.bindmessage 可以实现网页端和小程序之间通讯, 但只在特定时机触发 网页端向小程序

    2024年02月02日
    浏览(72)
  • 小程序webview组件,小程序和webview交互,小程序内联h5页面,小程序webview内网页实现微信支付

    小程序支持webview以后,我们开发的好多h5页面,就可以直接在小程序里使用了,比如我们开发的微信商城,文章详情页,商品详情页,就可以开发一套,多处使用了。我们今天来讲一讲。在小程序的webview里实现微信支付功能。因为微信不允许在小程序的webview里直接调起微信

    2024年02月09日
    浏览(63)
  • Apppium driver的一些比较重要操作,原生APP和H5 APP(WEBVIEW)

    //重置app 这时候driver会重置,相当于卸载重装应用。所以本地缓存会失效 driver.reset() //启动app的某一个activity 例如:driver.start_activity(\\\"com.wuba.zhuanzhuan\\\",\\\"./presentation.view.activity.LaunchActivity\\\") //获得所有contexts driver.contexts 结果如下: [\\\'NATIVE_APP\\\', \\\'WEBVIEW_com.android.browser\\\'] NATIVE_APP:na

    2024年02月02日
    浏览(34)
  • 微信小程序和webview使用postMessage交互

    小程序和webview能交互,但是没有你想的那个完美 小程序向webview传递参数只能使用url携带参数 webview向小程序传递参数可以使用postMessage, 但是注意了,postMessage只会在特定的时机执行 ,请看官方文档 由此可见,如果你想点击webview中的一个按钮A,然后给小程序发消息,然后由

    2024年02月02日
    浏览(49)
  • WebView引入的页面如何实现交互。通过webview方式嵌套在小程序里面的页面如何实现保存到相册的功能

    通过 WebView 方式嵌套在小程序中的页面,保存图片到相册的功能需要借助 WebView 的内部通信机制。以下是实现步骤: 1. 小程序端,给 WebView 组件添加一个监听事件,以便接收来自 WebView 页面的消息: ```html web-view src=\\\"your-website.com domain name is for sale. Inquire now.\\\" bindmessage=\\\"handle

    2024年01月17日
    浏览(39)
  • app中内嵌一个WebView,然后在WebView中加载该H5页面来达到打开小程序

    在 Android 应用中内嵌一个 WebView 来打开 H5 页面,从而打开小程序,可以通过以下步骤实现: 添加依赖库 首先,在项目的 build.gradle 文件中添加如下依赖库: 在布局文件中添加 WebView 在布局文件中添加一个 WebView 组件,并在 Activity 中获取该组件: 加载 H5 页面 使用 WebView 组件

    2024年02月14日
    浏览(43)
  • 【小程序】媒体API能力集成指南——视频、原生视频、WebView、相机API

    ty.createVideoContext(string id) 创建 video 上下文 VideoContext 对象。 参数 string id video 组件的 id 返回值 VideoContext VideoContext 实例,可通过 ty.createVideoContext 获取。 VideoContext 通过 id 跟一个 video 组件绑定,操作对应的 video 组件。 方法 VideoContext.play VideoContext.play() 播放视频 Vid

    2024年04月08日
    浏览(46)
  • 钉钉小程序 - - - - 内嵌webview打不开?ios打开白屏?安卓页面受限?

    小程序内引入H5页面是常见需求,但是总有一些弯弯绕绕在阻挠着开发的进度。 开发者工具打开H5页面是没问题的,但是真机访问有问题?安卓机能够正常访问,但是ios访问有问题? http需要换成https协议 url传参是可能有一些特殊字符、汉字等,需要使用 decodeURIComponent(url) 进

    2024年02月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包