admin管理员组

文章数量:1532221

2024年2月9日发(作者:)

大D在和谐游戏研究室发了个游戏,本身收费很容易破解,用HALO就可以搞定了,但游戏不能在模拟器运行,开头动画完毕后提示请使用手机运行游戏.然后游戏就不动了,如果是手机会提示按任意键继续.如图:

在HALO里搜索"请使用手机" 这个关键词,得到结果在g类的b方法里,我用DJ反编译了源代码,其它没有什么特别.有一句time().totalMemory(),比较特别以前从没见过,到GOOGLE查了下,这句是用来得到当前JAVA虚拟机正在使用的内存大小,那就很清楚了,如果正在使用的内存大小大于用来对比的的内存,也就是6M,那就不是手机,因为手机上JVM的内存只有几十K,百K或1-2M,没有太大的,因为J2ME本来就是为小内存掌上设备设计的.把思想定位在这里了,因为这没办法用HALO的字节码来讲清楚,只能用JAVA代码来讲,大家见谅,这只是个思路,看代码.

这是q方法的代码:

private void q(Graphics g1)

{

if(bh == 0)

a(0, g1);

if(bi == 99)

{

int i1 = o.F - p.c;

int j1 = (o.G - p.d) + 42;

o.p.a(o.c, g1, i1, j1);

o.o.a(o.c + 20, g1, i1, j1);

return;

}

bg.a(bi, g1, 120, 160);

if(p.p == 99)

{

if(time().totalMemory() >> 20 > 6L)

{

if(w % 4 < 2)

0xffffff);

else

0xffff00);

} else

if(w % 4 < 2)

.a.a(g1, "u4EFBu610Fu952Eu7EE7u7EED", 120, 278, 65, 0, 0xffffff);

else

.a.a(g1, "u4EFBu610Fu952Eu7EE7u7EED", 120, 278, 65, 0, 0xffff00);

if(w < 120)

{

w++;

return;

}

w = 0;

}

}

看了下代码,追了几个类手发现 bg.a(bi, g1, 120, 160);这句是用来画一骑当千那个动画图片的而

if(time().totalMemory() >> 20 > 6L)

{

if(w % 4 < 2)

0xffffff);

else

0xffff00);

} else

if(w % 4 < 2)

.a.a(g1, "u4EFBu610Fu952Eu7EE7u7EED", 120, 278, 65, 0, 0xffffff);

else

.a.a(g1, "u4EFBu610Fu952Eu7EE7u7EED", 120, 278, 65, 0, 0xffff00);

就是用来提示的,除了提示一点作用都没有,这段只要留下最后一句.a.a(g1,

"u4EFBu610Fu952Eu7EE7u7EED", 120, 278, 65, 0, 0xffff00);就行,如果不留会觉得卡在那里了,这句提示按任意键继续.用DJ查JVM,从if(runtime到最后一个else是55-100句,在HALO里删除56-101,保存方法这个方法里只删除

.a.a(g1,

"u8BF7u4F7Fu7528u624Bu673Au624Du80FDu7EE7u7EEDu6E38u620F", 120, 278, 65, 0,

.a.a(g1,

"u8BF7u4F7Fu7528u624Bu673Au624Du80FDu7EE7u7EEDu6E38u620F", 120, 278, 65, 0,

.a.a(g1,

"u8BF7u4F7Fu7528u624Bu673Au624Du80FDu7EE7u7EEDu6E38u620F", 120, 278, 65, 0,

.a.a(g1,

"u8BF7u4F7Fu7528u624Bu673Au624Du80FDu7EE7u7EEDu6E38u620F", 120, 278, 65, 0,

if(time().totalMemory() >> 20 > 6L)

{

if(w % 4 < 2)

0xffffff);

else

0xffff00);

} else

if(w % 4 < 2)

.a.a(g1, "u4EFBu610Fu952Eu7EE7u7EED", 120, 278, 65, 0, 0xffffff);

else

就行了,不要删其它的,我删了之后到那里就动不了了.

前面说过了这只是提示用的,提示用到了time().totalMemory() >> 20 > 6L这句,那不让在模拟器运行肯定也用了这个,全文搜索runtime,看到那个大X了吧

.a.a(g1,

"u8BF7u4F7Fu7528u624Bu673Au624Du80FDu7EE7u7EEDu6E38u620F", 120, 278, 65, 0,

.a.a(g1,

"u8BF7u4F7Fu7528u624Bu673Au624Du80FDu7EE7u7EEDu6E38u620F", 120, 278, 65, 0,

上面的q方法我们已经改过了,现在看下X()方法的源代码.

private void X()

{

label0:

{

if(bi == 99)

{

o.o.a(o.c + 20, 1);

if(!o.o.b(o.c + 20))

break label0;

} else

{

bg.a(bi, bj);

if((bj != -1 || !v()) && (bj == -1 || !bg.b(bi)))

break label0;

if(time().totalMemory() >> 20 > 6L)

return;

}

bk = false;

r.a = false;

}

}

看到那句了吧,这个方法是真正判断模拟器的,我们把

if(time().totalMemory() >> 20 > 6L)

return;

这两句删掉就可以了.

我觉得这个就用不着用DJ看JVM来对比了.在HALO里双击搜索结果里的那个X方法,HALO自动定位到了行.

下面那个return很明显吧,删除45-52,保存方法,然后把HALO的自动破解短信打上勾,这游戏用HALO就可以自动破解了,然后编译-打包-运行,一切顺利吧.

本文标签: 游戏运行方法提示模拟器