首页 > 其他分享 >【APP逆向11】Android基础

【APP逆向11】Android基础

时间:2024-02-03 23:22:27浏览次数:29  
标签:11 body String APP json call new Android public

  • 1.发送网络请求
    • 基于okhttp3
      • 表单格式
new Thread() {
    @Override
    public void run() {
        OkHttpClient client = new OkHttpClient();
        
        //user=xwl&age=99&size18
        FormBody form = new FormBody.Builder()
                .add("user", dataMap.get("username"))
                .add("pwd", dataMap.get("password"))
                .add("sign", dataMap.get("sign")).build();

        Request req = new Request.Builder().url("http://192.168.0.6:9999/login").post(form).build();
        
        Call call = client.newCall(req);
        try {
            Response res = call.execute();
            ResponseBody body = res.body();
            // 字符串={"status": true, "token": "fffk91234ksdujsdsd", "name": "xwl"}
            String dataString = body.string();

            // Log.e("MDS", "请求成功获取返回值=" + dataString);
        } catch (IOException ex) {
            Log.e("MDS", "网络请求错误");
        }
    }
}.start();
- json格式
new Thread() {
    @Override
    public void run() {
        OkHttpClient client = new OkHttpClient();
			
        // dataMap = {"username":"xwl","password":"123","sign":"用户名和密码的md5值"}
        JSONObject json = new JSONObject(dataMap);
        String jsonString = json.toString();
        
        // RequestBody form = RequestBody.create(MediaType.parse("application/json;charset=utf-8"),jsonString);
         RequestBody form = RequestBody.create(MediaType.parse("application/json;charset=utf-8"),jsonString);

        Request req = new Request.Builder().url("http://192.168.0.6:9999/login").post(form).build();
        Call call = client.newCall(req);
        try {
            Response res = call.execute();
            ResponseBody body = res.body();
            String dataString = body.string();
            Log.i("登录", dataString);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}.start();
- 请求拦截器
  - 假设开发app,发送10个请求,每个请求中需要携带特殊的请求头:xxxx。如是开发会将所有请求公共的操作都放在拦截器里面。
// 创建拦截器
Interceptor interceptor = new Interceptor() {

    @Override
    public Response intercept(Chain chain) throws IOException {

        // 1988812212 + 固定字符串 => md5加密
        Request request = chain.request().newBuilder().addHeader("ts", "1988812212").addHeader("sign", "xxxx").build();

        // 请求前
        Response response = chain.proceed(request);
        // 请求后
        return response;
    }
};

new Thread() {
    @Override
    public void run() {
        // 线程执行的内容
        // user=xxx&pwd=xxx&sign=xxxx
        // OkHttpClient client = new OkHttpClient.Builder().build();
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();    //添加拦截器
        FormBody form = new FormBody.Builder()
            .add("user", dataMap.get("username"))
            .add("pwd", dataMap.get("password"))
            .add("sign", dataMap.get("sign")).build();
        Request req = new Request.Builder().url("http://192.168.0.6:9999/login").post(form).build();
        Call call = client.newCall(req);
        try {
            Response res = call.execute();
            ResponseBody body = res.body();
            String dataString = body.string();
            Log.e("请求发送成功", dataString);

        } catch (IOException ex) {
            Log.e("Main", "网络请求异常");
        }
    }
}.start();
  • 基于retrofit
    • 内部封装了okhttp,让你用的更加的简单
    • 接口声明网络请求
public interface HttpReq {
	
    // 向/api/v1/post 发送POST请求  name=xx&pwd=xxx
    @POST("/api/v1/post")
    @FormUrlEncoded
    Call<ResponseBody> postLogin(@Field("name") String userName, @Field("pwd") String password);
    
    // ->/api/v2/xxx?age=999
    @GET("/api/v2/xxx")
    Call<ResponseBody> getInfo(@Query("age") String age);
		
    // 向/post/users 发送POST请求 {name:xxxx,age:123}
    @POST("/post/users")
    Call<ResponseBody> postLoginJson(@Body RequestBody body);

    @GET("/index")
    Call<ResponseBody> getIndex(@Query("age") String age);
}
- 发送请求
//表单格式
new Thread() {
    @Override
    public void run() {
        Retrofit retrofit = new Retrofit.Builder().baseUrl("https://www.httpbin.org/").build();
        HttpRequest httpRequest = retrofit.create(HttpRequest.class);		
		
        // https://www.httpbin.org/api/v1/post  
        // name=xx&pwd=xxx
        Call<ResponseBody> call = httpRequest.postLogin("wupeiqi", "666");
        try {
            ResponseBody responseBody = call.execute().body();
            String responseString = responseBody.string();
            Log.i("登录", responseString);

        } catch (Exception e) {
            e.printStackTrace();
        }
  }
}.start();


//json格式
new Thread() {
    @Override
    public void run() {
        Retrofit retrofit = new Retrofit.Builder().baseUrl("https://www.httpbin.org/").build();
        HttpRequest httpRequest = retrofit.create(HttpRequest.class);

        JSONObject json = new JSONObject(dataMap);
        String jsonString = json.toString();
        RequestBody form = RequestBody.create(MediaType.parse("application/json;charset=utf-8"),jsonString);
		
        // https://www.httpbin.org/post/users  
        // {username:"root",password:"123","sign":"xxxxdfsdfsdfsdfdfd"}
        Call<ResponseBody> call = httpRequest.postLoginJson(form);
        try {
            ResponseBody responseBody = call.execute().body();
            String responseString = responseBody.string();
            Log.i("登录", responseString);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}.start();
  • 2.序列化与反序列化
    • Gson组件,implementation 'com.google.code.gson:gson:2.8.6'
//2.1序列化,对象--->>字符串
class HttpContext{
    public int code;
    public String message;
    
    public HttpContext(int code,String msg){
        this.code = code;
        this.message = msg;
    }
}

HttpContext obj = new HttpContext(1000,"成功");

# json.dumps
String dataString = new Gson().toJson(obj); // '{"code":1000,"Message":"成功"}'

//2.2反序列化,字符串 -> 对象
// JSON格式
String dataString = "{\"status\": true, \"token\": \"fffk91234ksd\", \"name\": \"xwl\"}";
    
class HttpResponse{
    public boolean status;
    public String token;
    public String name;
}

HttpResponse obj = new Gson().fromJson(dataString,HttpResponse.class);
obj.status
obj.name
obj.token
  • 3.保存到xml文件
    • 手机上APP产生数据的路径:/data/data/包名/...
    • 手机上APP安装包的位置:/data/app/包名
    • 有时候,APP启动或者运行过程中会保存一些数据到特殊的xml文件中,方便后续读取或者权限检测。 /data/data/com.nb.s6day10/shared_prefs/sp_city.xml
//保存
SharedPreferences sp = getSharedPreferences("sp_city", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("token","111111");
editor.commit();

//删除
SharedPreferences sp = getSharedPreferences("sp_city", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.remove("token");
editor.commit();

//获取
SharedPreferences sp = getSharedPreferences("sp_city", MODE_PRIVATE);
String token = sp.getString("token","");

标签:11,body,String,APP,json,call,new,Android,public
From: https://www.cnblogs.com/xwltest/p/18005404

相关文章

  • P7119 Mivik 的游戏 题解
    先从一个例子开始假如硬币开始是这样的:HHHHHTHH然后就可以将这个反面硬币\(T\)左边的硬币全都反过来,共需\(5\)步。然后就变成了:TTTTTTHH最后再将最右边两个反过来就可以了,共需\(5+2=7\)步。如果\(p\)为这个反面的硬币位置的话,那么答案\(as=2p-1\)。推导......
  • 洛谷题解-P1194 买礼物
    https://www.luogu.com.cn/problem/P1194题目描述又到了一年一度的明明生日了,明明想要买BBB样东西,巧的是,这BBB样东西价格都是AAA元。但是,商店老板说最近有促销活动,也就是:如果你买了第III样东西,再买第JJJ样,那么就可以只花KI,JK_{I,J}KI,J​元,更巧的是,KI,JK_{I,J}K......
  • 安卓开发1——安装Android studio
    去网上找Android的studio1的下载教程找到对应的下载链接,下载 因为我有安装完成后就把下载的软件安装的文件删除的习惯所以就不展示了具体的安装教程可以看AndroidStudio安装配置教程-Windows(详细版)-CSDN博客 安装后新建项目完成后在最右侧的第三个可以挑选自己安卓......
  • uni-app小程序开发 基础 #2月摸鱼计划01
    前言:最近看uni-app框架的时候发现了这套课程,看到网络上大都是收费的资料,所以打算把这份资源开源共享出来,如果觉得有帮助的话,务必支持一下,关注......
  • volatile源码解析【解决可见性(依据happened-befor)有序性(依据内存屏障)】
    @TOC转自极客时间解决内存可见性问题volatile实现原理-源码分析......
  • [EFI]英特尔 猛兽峡谷NUC11BTM电脑 Hackintosh 黑苹果efi引导文件
    硬件型号驱动情况主板猛兽峡谷NUC11BTM处理器Intel®Core™i9-11900KB处理器已驱动内存英睿达DDR416G3200MHz*2已驱动硬盘铠侠RC201T已驱动显卡AMDRadeonRX6600XT已驱动声卡USB音频已驱动网卡以太网控制器i225-LM已驱动无线网卡+蓝牙奋威t919Sonoma以上版本自行安装补......
  • [NOIP2011 提高组] 聪明的质监员
    原题链接首先要读懂题目啊:[Wj>=W]其实是一种bool表达,即大于等于时取1,小于时取0,然后再进行求和。根据要求出最小值大概可以猜测要运用二分,那么我们来判断单调性,首先W在所有矿石的最大最小值之间取值,W越小Y越大,W越大Y越小(观察和推理都很容易得到),那么Y是符合单调性的,即可以运用......
  • 【APP自动化进阶】pytest+appium多设备并发
    并发编程基础【Python进阶】并发编程方式APP自动化并发项目实战项目步骤获取设备信息并根据设备数量开启n个进程appium服务处理pytest前置处理开启appium服务pytest后置处理关闭appium服务pytest进行用例执行,并输出报告数据等待进程执行完毕生成每个设备的allure报告......
  • Golang 开发Android服务--交叉编译
    Golang开发Android服务--交叉编译移动端主要arm架构,编译命令CGO_ENABLED=0GOOS=linuxGOARCH=armgobuild-ogo_promine.goCGO_ENABLED=0GOOS=linux,指定临时环境变量不影响其它编译,也可以设置为全局环境变量。AOSP查看版本信息getprop不传参数查看所有属性值ge......
  • 【设计模式】原型模式——Android SDK源码中的原型模式
    AndroidSDK源码中很多地方都用到了原型模式IntentIntent是Android四大组件之间的桥梁,Intent和原型模式有关的源码如下:publicclassIntentimplementsParcelable,Cloneable{//……代码省略……/***Copyconstructor.*/publicIntent(In......