破解最新java手机游戏
自从被泡椒网的一批“破解游戏”欺骗了感情后,本人开始了对手机游戏收费破解的历程。 至于么,玩个游戏就要花一天的生活费。特别是我这种无聊就玩的人哪伤得起,所以只好利用自己的技术了。
我这么认为:技术人员玩收费的游戏,丢人啊。
提供三种方法:
第一种是直接用软件破解,适用于普通群众,但是对最新的联网收费和道具收费游戏无效。 软件推荐:halo
运行软件后,点击 工具》配置,然后按提示操作
据说这个软件还有很多神奇的地方,我没去研究了。
第二第三种需要熟悉J2ME编程(注:不是java,和java有区别的),你还要先了解什么是反编译(自己百度,我就不赘述了)
第二种需要软件如下:
eclipse
eclipseme.feature_1.7.9_site.zip(插件)
J2ME(TM) Wireless Toolkit 2.exe
这三个软件用来搭建手机java开发的环境,当然,现在是搞破解,不是做游戏,我只是用它来编译我修改后的代码。我就不说怎样搭建环境了,会j2me的都知道,不会的话搭建了也没什么用
当然,你也可以用其他工具,这只是用来把反编译修改后的代码编译回去 jd-gui:用来反编译代码,发现jad使用不方便,用xjad反编译发现错误多多,比如说在反编译的代码里看到了go to语句。我们也可以用这个软件把反编译修改后的游戏再次反编译查看有无错误,没报错再放到手机中测试。
下面开始破解吧:
首先打开jd-gui,单击open file,打开一个jar文件,然后你会发现很多类和代码,这些代码的类名一般都是a,b,c,d,很烦。找程序的入口,一般都含有MID这三个字母,实在找不到就用记事本打开MANIFEST.MF找。看半天代码可能根本看不出什么,程序里一般都是几个类环环相扣,跳来跳去人就晕了。而且反编译不是很到位,有些方法可能反复出现了几次,把代码粘贴eclipse中发现红点一大堆...
说个个人经验吧,联网收费的程序的调用一般写在程序入口类的构造方法中。构造方法中有个判断语句,如果满足条件就让某个变量的值为true,否则就new一个类。很好,就把这个判断语句删掉。
在startapp()中有个判断语句,那个就是游戏的进入界面,不是联网收费界面。它是要满足条件才进入界面,这样,我们只要把条件的值设为true就行。
一般是如下模式:if(a){开始游戏}
在构造方法里写a=true;或是直接在定义a时设置a的值为true。
在jd-gui中只可以看代码,不能改代码,那么在eclipse中新建一个j2me工程,把代码复制到工程中,修改发现不会报错后就运行程序,这只是个形式,因为这点代码根本就运行不了,目的只是编译代码。
打开j2me工程的目录,打开bin包,找到你修改的类的class文件。
用winrar或者其他软件打开jar压缩包,点击添加,将修改的类添加进去。
有些游戏是短信收费的,短信收费和MessageConnection有关,看下哪些类导入了这个包,然后把和这有关代码删了,改下返回值神马的,差不多就行了。
以上方法不敢保证百分之百成功,比如说某个游戏中我把这些代码改了,编译后也没错。在手机上运行时报异常,然后研究了下源代码,发现它收费的类继承了一个父类,而反编译后根本就没有这个父类。没办法,抱着试一下的心理,我自己写了个空的父类,然后放到halo中重新编译,运行成功。
各游戏公司代码的布置方式不同,但是收费代码一般是和一个前缀是pay的类挂钩的,payment:花费
适当懂点英语是有好处的
第三种方法:
修改记录文件(rms文件),可以保存的游戏都有一个或多个记录文件,在破解收费后发现自己玩游戏还是玩得很纠结,容易挂,没等级,高级道具等等。
我自己写了个类读了个游戏的记录文件,代码如下:
int[] all=new int[100];
File f=new File("F:\\a.rms");
try {
FileInputStream fa=new FileInputStream(f);
try {
int b=0;
while(fa.read()!=-1){
b++;
}
byte[] a=new byte[b];
fa=new FileInputStream(f);
fa.read(a);
fa.close();
ByteArrayInputStream bais=new ByteArrayInputStream(a);
DataInputStream dis=new DataInputStream((InputStream)bais);
for (int i = 0; i <100; i++){
all[i]=((DataInputStream)dis).readInt();
System.out.println(all[i]);
}
dis.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
测试发现,下标越界,然后我缩小范围,发现值在50以下
去反编译的代码中找到和recordstore(j2me和记录有关的类)有关的类,看了一下数据的读
写形式,刚好这个游戏的记录都是用readint和writeint操作的,通过对我在游戏中数据的
联系,发现游戏的数据记录在第22个数字后面,继续打开了几个记录