上次说到ZEVMS这个服务端有可能使用了修改版本的JVM,导致无法dump内存、打印线程,也无法直接从外部把字节码暴露出来,那我们这次继续分析下这个程序是如何运行的,从原理着手考虑有什么办法。

整个服务端的入口是“启动服务端.exe”。是个exe文件,但是显然最终是运行了个java程序,所以我们实际看看这个程序内部是怎么运行的吧。

上x64dbg(这个程序OllyDbg无可奈何,x64dbg有效)

首先加载的是ntdll,我们直接“run to user code”走到“启动服务端.exe”的入口
x64dbg1

可以看到这个程序很短,单步几次后,在栈上看到了调用的具体bat文件:000000000014FE28 00000000006A9D10 L”C:\\Users\\zhong\\AppData\\Local\\Temp\\6084.tmp\\6085.tmp\\6086.bat”

x64dbg2

资源管理器上找到相应路径,找到该文件

@shift /0
@echo off
color 1A
set PATH=jdk\jre\bin
set JRE_HOME=jdk\jre
set JAVA_HOME=jdk\jre\bin
set CLASSPATH=.;dist\*
java -server -Dnet.sf.odinms.wzpath=wz gui.ZEVMS
pause

可以看到它使用的确实是程序自带的jdk,而且是server版本的,我们将这个bat文件放到游戏服务端的根目录,直接运行该文件,服务端也可以正常启动。

至此,我们找到实际使用的jvm和实际的main函数入口”gui.”接下来可以用更多的手段来分析这个程序了,后续我考虑使用java agent技术发掘更多的信息达成目的。

浏览:0

去年想追忆一下网游冒险岛,作为一个老年人肯定是玩v079版本,找到一个服务端zevms功能不错,但是服务端只能一个人登录,作为技术宅我想方设法绕过了限制,记录一下。
声明,该版本是2018年底的版本,现在已不能使用,新版的zevms v79服务端限制已经扩大为6人,无需破解,为了避免侵害zev的利益,所以现在才发布此方法。

1. 目录结构和反编译

该服务端和其他服务端一样,是MySQL作为数据库,Java作为服务端的,数据库的用户名密码是提供的,无需多费心思,大概查了一下没有限制人数的配置,所以尝试分析下java服务端的代码

解压dist目录下的ZEVMS.jar,得到一堆class文件,这个作者做了很多修改工作,提供了很多特性,是个很勤劳的服主。很奇妙的是他喜欢用中文作为类名、方法名和变量名,或许我应该拿他的示例去回答“为什么很少有人用中文编程?”这个知乎热帖

zevms.jar

尝试使用JD-GUI对.class文件进行反编译。但是失败了。难道是加密了?为了一探究竟,用WINHEX工具打开其中一个.class文件瞧瞧,开头四个十六进制是0xC1DEBEDE,而不是我们熟悉的0xCAFEBABE,而且文件头下部也是乱码,看来是加密了

winhex1

加密了的.class文件

winhex2

对照个正常的.class文件

我们知道,很多java程序为了防止破解,会自己写classLoader保护代码,读入文件后再解密为正常的字节码,但这种方式可以将内存中解密后的字节码dump出来就是原文了,说做就做,尝试jstak、jmap attach到这个进程上先看看情况。

$ ./jmap.exe 8696
Attaching to process ID 8696, please wait...
Error attaching to process: Windbg Error: WaitForEvent failed!
sun.jvm.hotspot.debugger.DebuggerException: Windbg Error: WaitForEvent failed!
        at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.attach0(Native Method)
        at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.attach(WindbgDebuggerLocal.java:152)
        at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:671)
        at sun.jvm.hotspot.HotSpotAgent.setupDebuggerWin32(HotSpotAgent.java:569)
        at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:335)
        at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)
        at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
        at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
        at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
        at sun.jvm.hotspot.tools.PMap.main(PMap.java:72)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.tools.jmap.JMap.runTool(JMap.java:201)
        at sun.tools.jmap.JMap.main(JMap.java:130)
$ ./jstack 8696
8696: ▒ܾ▒▒▒▒ʡ▒

看样子不行呢,有可能这个程序自己修改了虚拟机,不允许用这些探查工具。但是我是不会气馁的,预知后事如何,且看下回分解。

浏览:0
© 2020 Zhonghcc 's Blog Suffusion theme by Sayontan Sinha