关于本例:
首先声明一下,这是一个副产品,暂定名叫LocalOS.写它的起因在于放假时去亲戚家串门,脑袋一热答应了下星期帮亲戚孩子做个游戏外挂,谁让国人都喜欢认为[IT人士]就是举凡和计算机有关的都会的人(而且不分软硬|||)。因为没写过外挂,手里没有相关类库,所以用什么写都一样,嫌分析封包麻烦并且也没时间,本想用Java写个汇编类,然后调用游戏本身指令进行挂机.目的有二:一是为了巩固相关的Java和汇编知识,二是强调下在软件世界中,Java能做什么并不是问题,Java不能做什么才是问题。
但事实上看,今天我回家后发觉一边写Java汇编的基础类库一边分析游戏做外挂似乎不赶趟|||,所以暂时放弃Java开发,直接用VB做界面,C++写核心了.
暂时把写了一部分的Java执行汇编指令例子丢出来,等有时间再继续,顺便希望有人能帮我把类库补全.
以下是刚写的这个类库的演示用例,发完了我就准备睡觉了~~~一不留神都这时候了~~~~明天上班还有事呢||||||||
目前提供的系统接口类:
- package org.loon.framework.os;
- /**
- *Copyright2008
- *
- *LicensedundertheApacheLicense,Version2.0(the"License");youmaynot
- *usethisfileexceptincompliancewiththeLicense.Youmayobtainacopyof
- *theLicenseat
- *
- *http://www.apache.org/licenses/LICENSE-2.0
- *
- *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
- *distributedundertheLicenseisdistributedonan"ASIS"BASIS,WITHOUT
- *WARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.Seethe
- *Licenseforthespecificlanguagegoverningpermissionsandlimitationsunder
- *theLicense.
- *
- *@projectloonframework
- *@authorchenpeng
- *@email:ceponline@yahoo.com.cn
- *@version0.1
- */
- class Kernel{
- static {
- System.loadLibrary( "localos" );
- }
- /**
- *获得内联汇编执行结果
- *
- *@paramasmBytes
- *@return
- */
- public native static long doResult( final byte []asmBytes);
- /**
- *将内联汇编动态注入指定进程
- *
- *@parampid
- *@paramasmBytes
- *@return
- */
- public native static boolean doInject( final int pid, byte []asmBytes);
- /**
- *写指定线程内存
- *
- *@parampid
- *@paramaddress
- *@parambuffer
- *@paramsize
- *@paramnumberOfBytesWrite
- *@return
- */
- public native static boolean writeProcessMemory( final int pid,
- final int address, final byte []buffer, final int size,
- final int []numberOfBytesWrite);
- /**
- *读指定线程内存
- *
- *@parampid
- *@paramaddress
- *@parambuffer
- *@paramsize
- *@paramnumberOfBytesWrite
- *@return
- */
- public native static boolean readProcessMemory( final int pid,
- final int address, final byte []buffer, final int size,
- final int []numberOfBytesWrite);
- /**
- *读指定线程内存
- *
- *@parampid
- *@paramaddress
- *@return
- */
- 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 ];
- }
- /**
- *以指定的访问方法进入一个已存在的进程
- *
- *@parammode
- *@parampid
- *@return
- */
- public native static int openProcess( final int mode, final int pid);
- /**
- *强制结束指定进程
- *
- *@parampid
- *@return
- */
- public native static boolean killProcessID( final int pid);
- /**
- *检查指定进程是否在运行中
- *
- *@parampid
- *@return
- */
- public native static boolean isProcessRunning( final int pid);
- /**
- *返回当前进程中所有程序名
- *
- *@return
- */
- public native static Object[]getProcessNames();
- /**
- *返回指定程序名的唯一进程id
- *
- *@paramprocessName
- *@return
- */
- public native static int getProcessID( final StringprocessName);
- }
示例代码:
- package org.loon.test;
- import org.loon.framework.os.ASM;
- /**
- *Copyright2008
- *
- *LicensedundertheApacheLicense,Version2.0(the"License");youmaynot
- *usethisfileexceptincompliancewiththeLicense.Youmayobtainacopyof
- *theLicenseat
- *
- *http://www.apache.org/licenses/LICENSE-2.0
- *
- *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
- *distributedundertheLicenseisdistributedonan"ASIS"BASIS,WITHOUT
- *WARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.Seethe
- *Licenseforthespecificlanguagegoverningpermissionsandlimitationsunder
- *theLicense.
- *
- *@projectloonframework
- *@authorchenpeng
- *@email:ceponline@yahoo.com.cn
- *@version0.1
- */
- public class TestASM{
- /**
- *格式化输出信息
- *
- *@parammes
- *@parama
- *@paramb
- *@return
- */
- public static StringformatMessage(Stringmes, int a, int b){
- Integera1= new Integer(a);
- Integerb1= new Integer(b);
- return String.format(mes, new Object[]{a1,b1});
- }
- /**
- *java进行汇编加法
- *
- *@paramasm
- *@parama
- *@paramb
- *@return
- */
- public static void plus(ASMasm, int a, int b){
- asm._MOV_EAX(a);
- asm._ADD_EAX(b);
- asm._RET();
- Stringmes=formatMessage( "Java进行汇编加法计算%d+%d=" ,a,b);
- System.out.println(mes+asm.doResult());
- }
- /**
- *java进行汇编减法
- *
- *@paramasm
- *@parama
- *@paramb
- */
- public static void minus(ASMasm, int a, int b){
- asm._MOV_EAX(a);
- asm._SBB_EAX(b);
- asm._RET();
- Stringmes=formatMessage( "Java进行汇编减法计算%d-%d=" ,a,b);
- System.out.println(mes+asm.doResult());
- }
- /**
- *java进行汇编乘法
- *
- *@paramasm
- *@parama
- *@paramb
- */
- public static void multiply(ASMasm, int a, int b){
- asm._MOV_EAX(a);
- asm._MOV_EBX(b);
- asm._IMUL_EAX_EBX();
- asm._RET();
- Stringmes=formatMessage( "Java进行汇编乘法计算%d*%d=" ,a,b);
- System.out.println(mes+asm.doResult());
- }
- /**
- *java进行汇编除法
- *
- *@paramasm
- *@parama
- *@paramb
- */
- public static void divide(ASMasm, int a, int b){
- asm._XOR_EDX_EDX();
- asm._MOV_EAX(a);
- asm._MOV_ECX(b);
- asm._IDIV_ECX();
- asm._RET();
- Stringmes=formatMessage( "Java进行汇编除法计算%d/%d=" ,a,b);
- System.out.println(mes+asm.doResult());
- }
- public static void main(String[]args){
- //PS:ASM类中不是所有汇编指令都有,因为太多,有时间再慢慢加.已写的不保证全部正确|||.
- //添加ASM类的方法大体有三种:
- //1、用汇编指令名和操作码自己一个个对
- //2、自己写汇编,然后debug读操作码
- //3、开OD之类的反汇编~
- //反正所有汇编命令都能实现,关键看有没有恒心,谁有空帮忙写下……
- ASMasm= 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