關于本例:
首先聲明一下,這是一個副產品,暫定名叫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
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
