关于本例:
首先声明一下,这是一个副产品,暂定名叫LocalOS.写它的起因在于放假时去亲戚家串门,脑袋一热答应了下星期帮亲戚孩子做个游戏外挂,谁让国人都喜欢认为[IT人士]就是举凡和计算机有关的都会的人(而且不分软硬|||)。因为没写过外挂,手里没有相关类库,所以用什么写都一样,嫌分析封包麻烦并且也没时间,本想用Java写个汇编类,然后调用游戏本身指令进行挂机.目的有二:一是为了巩固相关的Java和汇编知识,二是强调下在软件世界中,Java能做什么并不是问题,Java不能做什么才是问题。
但事实上看,今天我回家后发觉一边写Java汇编的基础类库一边分析游戏做外挂似乎不赶趟|||,所以暂时放弃Java开发,直接用VB做界面,C++写核心了.
暂时把写了一部分的Java执行汇编指令例子丢出来,等有时间再继续,顺便希望有人能帮我把类库补全.
以下是刚写的这个类库的演示用例,发完了我就准备睡觉了~~~一不留神都这时候了~~~~明天上班还有事呢||||||||
目前提供的系统接口类:
- package org.loon.framework.os;
- class Kernel {
-
- static {
- System.loadLibrary("localos");
- }
-
- public native static long doResult(final byte[] asmBytes);
-
- public native static boolean doInject(final int pid, byte[] asmBytes);
-
- public native static boolean writeProcessMemory(final int pid,
- final int address, final byte[] buffer, final int size,
- final int[] numberOfBytesWrite);
-
- public native static boolean readProcessMemory(final int pid,
- final int address, final byte[] buffer, final int size,
- final int[] numberOfBytesWrite);
-
- public static byte readProcessMemory(final int pid, final int address) {
- byte[] buffer = new byte[1];
- int[] numberOfBytesRead = new int[1];
- readProcessMemory(pid, address, buffer, 1, numberOfBytesRead);
- return buffer[0];
- }
-
- public native static int openProcess(final int mode, final int pid);
-
- public native static boolean killProcessID(final int pid);
-
- public native static boolean isProcessRunning(final int pid);
-
- public native static Object[] getProcessNames();
-
- public native static int getProcessID(final String processName);
- }
示例代码:
- package org.loon.test;
- import org.loon.framework.os.ASM;
- public class TestASM {
-
- public static String formatMessage(String mes, int a, int b) {
- Integer a1 = new Integer(a);
- Integer b1 = new Integer(b);
- return String.format(mes, new Object[] { a1, b1 });
- }
-
- public static void plus(ASM asm, int a, int b) {
- asm._MOV_EAX(a);
- asm._ADD_EAX(b);
- asm._RET();
- String mes = formatMessage("Java 进行汇编加法计算 %d + %d = ", a, b);
- System.out.println(mes + asm.doResult());
- }
-
- public static void minus(ASM asm, int a, int b) {
- asm._MOV_EAX(a);
- asm._SBB_EAX(b);
- asm._RET();
- String mes = formatMessage("Java 进行汇编减法计算 %d - %d = ", a, b);
- System.out.println(mes + asm.doResult());
- }
-
- public static void multiply(ASM asm, int a, int b) {
- asm._MOV_EAX(a);
- asm._MOV_EBX(b);
- asm._IMUL_EAX_EBX();
- asm._RET();
- String mes = formatMessage("Java 进行汇编乘法计算 %d * %d = ", a, b);
- System.out.println(mes + asm.doResult());
- }
-
- public static void divide(ASM asm, int a, int b) {
- asm._XOR_EDX_EDX();
- asm._MOV_EAX(a);
- asm._MOV_ECX(b);
- asm._IDIV_ECX();
- asm._RET();
- String mes = formatMessage("Java 进行汇编除法计算 %d / %d = ", a, b);
- System.out.println(mes + asm.doResult());
- }
- public static void main(String[] args) {
-
-
-
-
-
-
- ASM asm = new ASM();
-
- plus(asm, 65657632, 95454157);
-
- minus(asm, 996565, 12345);
-
- multiply(asm, 1841, 2009);
-
- divide(asm, 19820901, 12);
- }
- }
运行效果图如下:
大家用脚趾头都能猜出来是JNI实现的,毕竟和系统本地交互不用JNI是不可能的,目前仅支持Windows系统.不过在当今的Java世界中,由于SWT已经提供了良好的本地环境库支持,事实上用它便可以直接写出大多数系统与Java的汇编混合代码,但这与本例无关,自己琢磨吧,我安息了:)
CSDN下载地址: http://download.csdn.net/source/940199
下载地址: http://code.google.com/p/greenvm/downloads/list (暂时先丢这上面
源码在Jar内)
OD(ollydbg,传说中的汇编分析调试工具)下载地址: http://download.csdn.net/source/940795