逆向经验 + 逆向工具

目标:某桔充电Day11、请求抓包,锁定路径为station-api/station/search的请求,对比多个请求的参数,确定要逆向的参数为:url的wsgsig(dd03)、headers中的wsgsig(dd04)、ticket/token/tokenId、headers中的didi-header-rid。2、FDex脱壳得到六个.dex文件,逐个打开寻找wsgsig关键字,锁定OkHttpRpc$OkHttpRpcInterceptor类中的a函数。3、其代码中有部分不理解,请教蔡
摘要由CSDN通过智能技术生成

目标:某桔充电

Day1

1、请求抓包,锁定路径为station-api/station/search的请求,对比多个请求的参数,确定要逆向的参数为:url的wsgsig(dd03)、headers中的wsgsig(dd04)、ticket/token/tokenId、headers中的didi-header-rid。

2、FDex脱壳得到六个.dex文件,逐个打开寻找wsgsig关键字,锁定OkHttpRpc$OkHttpRpcInterceptor类中的a函数。

3、其代码中有部分不理解,请教蔡依林大佬,接受建议,将jadx更换为ida/jeb工具。

Day2

使用ida工具进行静态代码调试、so层动态调试,想通过打断点的方式找到函数调用关系、参数生成过程,然没有在so文件中找到代码,回首看代码才发现不是native声明,回归原点。

Day3

重新开始流程:
1、抓包,锁定要模拟的请求,通过搜索请求路径关键字没有得到相关结果;通过搜索url找到GatewayRequest类,通过hook发现没有调用此类;通过搜索参数wsgsig锁定OkHttpRpc$OkHttpRpcInterceptor类中的a函数。

2、根据OkHttpRpc$OkHttpRpcInterceptor类中的a函数,hook打印调用栈,有七次输出、一次请求,分析七次输出的结果:由七个类调用(SignInterceptor、KeywordFilterRequestInterceptor、HttpPostInterceptor、KeywordFilterResponseInterceptor、LoginNetInterceptor、HttpReqInterceptor、HttpComParamReqInterceptor)、url参数相同。推测在七次调用之间发起请求,并且该函数在请求发起前后都有调用。

Day4

在七次调用之间的调用栈中有一个类为RealCall,内部有一函数a()。其返回值类型为ab。调用ab类的toString方法,得到打印纸,反查找其代码处,得到Response类,推测其返回值为请求响应的结果。尝试打印输出该类的各个属性,但hook代码是js代码非java代码,难以调用java方法。寻找解决办法。(程序总是未响应、闪退,原因未知。)
打印其属性(通过同名方法简介打印),没有请求结果,也没有参数,其中返回值的a属性是个Request类,打印其属性没有参数,但头信息有tikcet、CityId、Flowtag。还需继续寻找请求发起处。

Day05

尝试寻找请求结果处理,根据stationId、stationName等关键内容关键字查找,找到FeedGasCard类,但是hook之后,似乎没有调用这里;OilStationInfo也没有调用。查阅资料,找相关请求发起的类库。

Day06

周末请java室友参谋了一波,决定返回OkHttpRpc$OkHttpRpcInterceptor的调用栈,从第一个类开始hook,寻找dd03、ticket的生成位置。

遇到问题:e$1$1,内部类的内部类中的函数调用,hook时hook不到其内的函数、属性。

Day07

06的内部类涉及到线程相关,学习java线程相关内容https://www.codingke.com/v/2731-lesson-248-course。

进程:程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上一次执行过程,是一个动态概念。进程是一个具有一定独立功能的程序,一个实体,每一个进程都有它自己的地址空间。

进程执行时的间断性,决定了进程可能具有多种状态:就绪、运行、阻塞。

线程实际上是在进程基础上的进一步划分,一个进程启动后,里面的若干程序又可以划分成若干个线程。是进程中的一个执行路径,共享一个内存空间,线程之间可以子哦与切换,并发执行,一个进程最少有一个线程。
一个程序可以同时执行多个任务来提高效率。

并行:两个任务同时运行(多CPU)
兵法:两个任务同时请求运行,而处理器一次只能接收一个任务,就会把两个任务安排轮流执行,由于CPU时间片运行实践较短就会感觉两个任务在同时执行。

实现线程:实现Runnable接口;继承Thread类。

线程休眠:在当前线程的执行中,暂停指定毫秒数,释放CPU的时间片。

join与中断线程:调用join()方法的效果是等待这个线程死亡。

守护线程与yield

线程同步:
多线程共享数据:在多线程的操作中,多个线程可能同时处理一个资源,也就是共享数据。
线程同步:解决数据共享问题,必须使用同步:即多个线程在同一个时间段内只能由一个线程执行指定代码,其他线程要等待此线程完成之后才可以继续执行。
同步准则:当编写synchronized块时,是代码块保持间断,把不随线程变化的预处理和后续处理移出synchronized块;不要阻塞;在持有锁时,不要对其他对象调用方法。

死锁:一般在程序运行的时候有可能出现。通常原因是:同步过多。

生命周期:

线程池:预先创建线程的一种技术。线程池在还没有任务到来之前,创建一定数量的线程,放入空闲队列中,然后对这些资源进行服用。减少频繁的创建和销毁对象。线程池的顶级接口是Executor是一个执行线程的工具。线程池接口是ExecutorService。
在Executors类里面提供了一些静态工厂,用于生成一些常用的线程池。
newSingleThreadExecutor:创建一个但线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串执行所有任务。如果因为异常结束,那么会有一个新的线程来代替。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程。知道线程达到线程池最大的大小。一旦达到最大值就会保持不变,如果因为异常结束,会有一个新的线程补充进来。
newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,任务数量增加时,又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

//继承Thread
class MyThread extends Thread{
	public void run(){
		//逻辑处理
	}
}
MyThread mt = new MyThread();
mt.start();


// 实现Runnable接口
class MyRunnable implements Runnable{
	public void run(){
		//逻辑处理
	}
}
MyRunnable mr = new MyRunnable(
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值