冒险封包拦截研究!

作者:风之谷冒险    时间:2016-12-15 15:33

注1:次文章只用与技术研究,并无其它用意!使用此软件造成的一切后果均与本人无关!

 

注2:此软件的原型来自互联网!软件作者:snow

 

正文:

    在网上搜索大半天后,就找到了这一个相关的软件,下过来后,初步研究发现只能截取国际服的相关数据包!所以要想用于GF还必须要进行改造!

    在使用软件前,需要设置所监听的网卡。运行Devices.bat后可以看到

 

[xhtml] view plain copy
 
  1. 冒险封包拦截网卡列表0: Marvell Yukon Ethernet Controller.)192.168.1.1请按任意键继续. . .  

 

 

由于我电脑上只开了一个网卡,所以只有一个编号0;如果你开了多个网卡,那么这里将会有多个编号!记住恩的网卡编号!

 

    接着我们打开文件settings.properties找到DEVICE这一项,把这一项的值改为刚才恩所记下的网卡编号!保存!

   

    好了这样就大概的弄完了准备活动!在未改源码之前,我们先大概看下软件的工作流程!运行Decrypt Packet.bat程序将会启动,首先出来的是一个CMD的窗口,会显示相关工作模式等!接着如果设置使用界面(一般都会用)就会弹出解密,这是软件的初始化工作就做完了!接着我们启动游戏,一直到停在选大区的界面是,解包软件仍然没有反映应,点大区后还没有反应,输密码,进游戏后还是没有反应!到此我们可以判断,软件没有起到效果!

 

    按常理来说,在我们点大区的时候就会有数据包的产生,而软件的截包启动也应该是在这个时候开始!所以我们猜测,是否这个封包就会不同呢?下面我们开始在源码中查找问题的所在!

 

    打开源码,首先我们要分析这个程序总体的启动流程和查找出判断是否启动拦截的关键代码!

 

    在源码中我们可以看到有两个包分别为:org.snow.maplesnowsniffer和org.snow.odinms,然后我们打开org.snow.maplesnowsniffer可以看到下面仅有一个Main.Java,我们打开这个Main.java,就可以找到启动时候的关键代码了。

 

[java] view plain copy
 
  1. if (program.equals("sniffer")) {    MaplePcapture.main(argsNew);} else if (program.equals("listdevices")) {    ListDevices.main(argsNew);} else if (program.equals("opcodeview")) {    MapleOpcodeView.main(argsNew);} else {    System.out.println("Unknown starting argument");}  

 

 

    从这里我们可以看出,有三种启动模式!我们所关心的是第一个,所以要查看对应的MaplePcapture.java文件!

 

    在包org.snow.odinms下面我们就可以找到MaplePcapture.java,打开此文件找到main方法

 

[java] view plain copy
 
  1. public static void main(String args[]) throws IOException {getInstance().doMain();}public void doMain() {System.out.print("冒险封包拦截器");try {loadSettings();} catch (Exception e) {System.out.println("加载设置错误!");e.printStackTrace();}try {captor = JpcapCaptor.openDevice(devices[deviceIndex], 65535false20);captor.setFilter(packetFilter, true);if (useGUI) {packetGUI = new MaplePcaptureGUI();packetGUI.setCapture(this);packetGUI.setVisible(true);}captor.loopPacket(-1this);} catch (Exception e) {e.printStackTrace();}}  
     

 

 

    可以看到main又调用了一个doMain的方法,我们继续看doMain函数,看完之后我们并没有发现有什么特殊的地方!继续往下看我们看到有个函数叫receivePacket,看来这个函数就是我们要找的了!看完这个函数后,我们会发现这段代码并未涉及到程序开始拦截封包!在此,我们注意到这个函数是一个重载函数,所以它可能还有其他的实现方法!所以我们在项目中搜索receivePacket。结果在MaplePcap.java 中还找到了一个receivePacket在这个文件中我们找到了关键代码

 

[java] view plain copy
 
  1. if (packet.data.length == 15 && packet.data[0] == 0x0d && packet.data[1] == 0) {  

 

 

    这个应该就是国际服点大区时候的封包头,只要我们将其替换成GF的,就应该能够截取到封包数据了!

 

    至于GF的点大区封包获取有很多方法,我门有尝试过,我想一种可能是,用要截获版本的客户端去连接低版本的服务端!这样服务端应该能够收到数据~然后就...

 

    好了,假如我们已经获得GF点大区的数据了:即 1F 00 所以只要我们收到这个包,那么我们就可以启动截包了!将上面那么判断语句修改为:

 

[java] view plain copy
 
  1. if (packet.data.length == 2 && packet.data[0] == 0x1F && packet.data[1] == 0) {  

 

 

这样编译后,我们就能够抓取到相应的封包了!

 

后记:

    1.经过试用后发现,当角色进入游戏后,截到的封包数据没有解密!这个问题,还请高人指教!