昨天在找东西的时候,找到了一个OKAA的应用,我一下就陷入回忆了。这个相机是我花了二百多买的。而且配件齐全。。。然后这个公司应该不在了,但是我想破解它一下子。
你看就是这个样子,被我改造了很多次了
正好看见有反编译的软件
直接编译了,我觉得也没有什么壳
这不白给
查一下看到的字符串
在这里
3种语言
第一步逆向出来的smail
这里是我们的自己的包,就是OKAA的私有包
我们对这个协议感兴趣的地方就这里,也是重点读的地方
我们这里就不按照直接寻找协议的方法看代码了,我们就面条式的读写代码了
这个代码就是MJPG格式的控制参数
一帧的大小,两个参数
至于下面的函数也是显而易见的,获得长宽和设置长宽
获得命令行参数
这个方法在这里,看名字是转换string
用法:StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。
Java不熟悉,土狗一样。而且编译型语言没有脚本语言那么富有表现力。
一直预览模式
视频预览模式
啊这,好奇怪
然后是枚举的类型
看这里的封装就好
Fragment
因为java不熟悉,这里需要补充一些Java的知识
我这里简单的翻译了一下
注意这里划横线的地方
是这里定义的类
这个类里面有很多的方法
看这个类的私有方法
LinkedList的本质是双向链表
LinkedList继承于AbstractSequentialList,并且实现了Dequeue接口。
LinkedList包含两个重要的成员:header 和 size。
header是双向链表的表头,它是双向链表节点所对应的类Entry的实例。Entry中包含成员变量:previous, next, element。其中,previous是该节点的上一个节点,next是该节点的下一个节点,element是该节点所包含的值。
size是双向链表中节点的个数。
其实读这个东西,不用多细致,知道就好
跳转到这个方法,
我把里面的变量分类了
第一类
第二类
第三类
文件函数,我做了一些处理
这些函数就是打印参数的
对文件句柄hash化
数据类型的转换
文件类型这个类是读取不出来
还是一些显式的函数参数打印
下面两个是在下载吗?文件列表清空
private boolean isDownloading = false;
private String ssid;
定时器退出
private void sendOkMsg(int paramInt)
{
this.mainHandler.obtainMessage(paramInt).sendToTarget();
}
发送OKAA的信息(这是啥啊。。。)
这里的代码就是开始响应触摸的事件
开启预览的模式
这是下面new的新实例,MJPEG的参数
开启流视频
这个视频流依赖的包
H.264的视频流参数,下面还跳转了一个方法
就是这个,至于具体是什么,看起来就是对函数做一些限定
得到视频的下一帧
package com.icatch.wificam.customer.type;
public class ICatchFrameBuffer
{
private byte[] buffer;
// 创建一个数组
private int frameSize;
// 帧数
private double presentationTime;
public ICatchFrameBuffer() {}
public ICatchFrameBuffer(int paramInt)
{
this.buffer = new byte[paramInt];
}
public ICatchFrameBuffer(byte[] paramArrayOfByte)
{
this.buffer = paramArrayOfByte;
}
public byte[] getBuffer()
{
return this.buffer;
}
public int getFrameSize()
{
return this.frameSize;
}
public double getPresentationTime()
{
return this.presentationTime;
}
public void setBuffer(byte[] paramArrayOfByte)
{
this.buffer = paramArrayOfByte;
}
public void setFrameSize(int paramInt)
{
this.frameSize = paramInt;
}
public void setPresentationTime(double paramDouble)
{
this.presentationTime = paramDouble;
}
}
缓存帧
private int sessionID;
检查连接
异常类
准备会话使能
然后开启一个线程来接收
开始判断是否准备好开始会话
这个地方是方法
这里线索就断了,我们继续看
在页面的左上有个电池的控件,这里是逻辑
如果一直往下看,其实会看到标准的安卓方法
我连接手机,可以看到一些关于相机wifi的参数
连接的样子
看左上角的图标
在电脑上面连接可以看的参数更多些
https://github.com/videolan/vlc
这里使用VLC简单的连接一下
https://www.videolan.org/vlc/index.html
下载页面
rtsp://192.168.1.1/MJPG?W=720&H=400&Q=50&BR=5000000/track1;seq=58450;rtptime=2000000000
提取到的一些URL
rtsp://192.168.1.1/MJPG?W=720&H=400&Q=50&BR=5000000/ RTSP/1.0
还是URL
RTSP/1.0 200 OK
CSeq: 2
Date: 2012/1/1
Content-Base: rtsp://192.168.1.1/MJPG?W=720&H=400&Q=50&BR=5000000/
Content-Type: application/sdp
Content-Length: 328
v=0
o=- 253157050 1 IN IP4 192.168.1.1
s=Motion JPEG. Streamed by iCatchTek.
i=MJPG
t=0 0
a=tool:iCatchTek
a=type:broadcast
a=control:*
a=range:npt=0-
a=x-qt-text-nam:Motion JPEG. Streamed by iCatchTek.
a=x-qt-text-inf:MJPG
m=video 0 RTP/AVP 26
c=IN IP4 0.0.0.0
b=AS:12288
a=frmerate:50.7643966
a=control:track1
一个简单的应答操作
这个是主机发信息
从机回应,可以看到视频流的传输使用的是RTSP
主机继续问
从机继续问答
因为上面的VPN抓包,应该app是写东西了
视频流的数据不传输,这里使用wicap,直接在底层接口收数据
就像这个,就是视频流稳定下来以后抓到的数据
一肯定视频传输使用的是UDP,然后发的数据包稳定在1478字节
接着后面应该是主机和从机的ip和adress
就是这样
细节繁复,主要是java不熟悉,还有就是协议尤其是网络上面不熟悉,接下来补课。