关于本例:
首先声明一下,这是一个副产品,暂定名叫LocalOS.写它的起因在于放假时去亲戚家串门,脑袋一热答应了下星期帮亲戚孩子做个游戏外挂,谁让国人都喜欢认为[IT人士]就是举凡和计算机有关的都会的人(而且不分软硬|||)。因为没写过外挂,手里没有相关类库,所以用什么写都一样,嫌分析封包麻烦并且也没时间,本想用Java写个汇编类,然后调用游戏本身指令进行挂机.目的有二:一是为了巩固相关的Java和汇编知识,二是强调下在软件世界中,Java能做什么并不是问题,Java不能做什么才是问题。
但事实上看,今天我回家后发觉一边写Java汇编的基础类库一边分析游戏做外挂似乎不赶趟|||,所以暂时放弃Java开发,直接用VB做界面,C++写核心了.
暂时把写了一部分的Java执行汇编指令例子丢出来,等有时间再继续,顺便希望有人能帮我把类库补全.
以下是刚写的这个类库的演示用例,发完了我就准备睡觉了~~~一不留神都这时候了~~~~明天上班还有事呢||||||||
目前提供的系统接口类:
- packageorg.loon.framework.os;
-
-
- classKernel{
- static{
- System.loadLibrary("localos");
- }
-
-
- publicnativestaticlongdoResult(finalbyte[]asmBytes);
-
-
- publicnativestaticbooleandoInject(finalintpid,byte[]asmBytes);
-
-
- publicnativestaticbooleanwriteProcessMemory(finalintpid,
- finalintaddress,finalbyte[]buffer,finalintsize,
- finalint[]numberOfBytesWrite);
-
-
- publicnativestaticbooleanreadProcessMemory(finalintpid,
- finalintaddress,finalbyte[]buffer,finalintsize,
- finalint[]numberOfBytesWrite);
-
-
- publicstaticbytereadProcessMemory(finalintpid,finalintaddress){
- byte[]buffer=newbyte[1];
- int[]numberOfBytesRead=newint[1];
- readProcessMemory(pid,address,buffer,1,numberOfBytesRead);
- returnbuffer[0];
- }
-
-
- publicnativestaticintopenProcess(finalintmode,finalintpid);
-
-
- publicnativestaticbooleankillProcessID(finalintpid);
-
-
- publicnativestaticbooleanisProcessRunning(finalintpid);
-
-
- publicnativestaticObject[]getProcessNames();
-
-
- publicnativestaticintgetProcessID(finalStringprocessName);
- }
示例代码:
- packageorg.loon.test;
- importorg.loon.framework.os.ASM;
-
-
- publicclassTestASM{
-
-
- publicstaticStringformatMessage(Stringmes,inta,intb){
- Integera1=newInteger(a);
- Integerb1=newInteger(b);
- returnString.format(mes,newObject[]{a1,b1});
- }
-
-
- publicstaticvoidplus(ASMasm,inta,intb){
- asm._MOV_EAX(a);
- asm._ADD_EAX(b);
- asm._RET();
- Stringmes=formatMessage("Java进行汇编加法计算%d+%d=",a,b);
- System.out.println(mes+asm.doResult());
- }
-
-
- publicstaticvoidminus(ASMasm,inta,intb){
- asm._MOV_EAX(a);
- asm._SBB_EAX(b);
- asm._RET();
- Stringmes=formatMessage("Java进行汇编减法计算%d-%d=",a,b);
- System.out.println(mes+asm.doResult());
- }
-
-
- publicstaticvoidmultiply(ASMasm,inta,intb){
- 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());
- }
-
-
- publicstaticvoiddivide(ASMasm,inta,intb){
- 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());
- }
- publicstaticvoidmain(String[]args){
-
-
-
-
-
-
- ASMasm=newASM();
-
- 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