2016-07-21 2 views
4

나는 교육용 프로 세서 용으로 Java에서 (뿐만 아니라 자바로) dll 인젝터를 만들고 싶습니다. website especialized in online game의 기본 예제를 발견했습니다.JNA : 몇 가지 구체적인 방법이 없습니다

JNA 인터페이스를 사용하여 만든 autor라고합니다.

그래서이 코드 조각을 studyng로 만들고 NetBeans IDE와 JNA를 사용하여 컴파일을 시도하지만 여기 (4.2.2)에있는 JNA 인터페이스는 코드 조각에 사용 된 모든 메소드와 함수를 가지고 있지 않습니다. 곁에 남겨둔. 가능하면 시도가이 문제를 해결하기위한

  1. GetProcAddress를
  2. 하고 VirtualAllocEx
  3. VirtualFreeEx이

그래서, 내가 여기에 도움을 꿔 :

은 있습니까 JNA에서 메소드가 누락 된 문제.

나는이 오류를 크게 고쳤지 만, 의견이있는 지점을 따라 다음과 같은 JNA에서 일부 메서드가 여전히 누락되었습니다. 어떤 제안이나 사전에

package inject; 

//////////////////// JNA-4.2.2 ///////////////////// 

import com.sun.jna.Memory; 
import com.sun.jna.Native; 
import com.sun.jna.Pointer; 
import com.sun.jna.platform.win32.Kernel32; 
import com.sun.jna.platform.win32.Tlhelp32; 
import com.sun.jna.platform.win32.WinDef; 
import com.sun.jna.platform.win32.WinDef.HMODULE; 
import com.sun.jna.platform.win32.WinNT; 
import com.sun.jna.platform.win32.WinNT.HANDLE; 
import com.sun.jna.ptr.IntByReference; 
import com.sun.jna.win32.W32APIOptions; 
import java.io.File; 

////////////////////////////////////////////////// 

// Extracted from: https://github.com/warmuuh/AndroidCtx/tree/master/HotContext/src/luz/winapi 

import inject.luz.winapi.constants.DwDesiredAccess; 
import inject.luz.winapi.tools.Advapi32Tools; 
import inject.luz.winapi.tools.Kernel32Tools; 
import luz.winapi.api.exception.Kernel32Exception; 

////////////////////////////////////////////////////////////////////////////////////////////// 

public class Inject { 

    private static int GetPid(String proc){ 

     int id = 0; 

     Kernel32 kernel32 = (Kernel32) Native.loadLibrary(Kernel32.class, W32APIOptions.UNICODE_OPTIONS); 
     Tlhelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();   

     WinNT.HANDLE snapshot = kernel32.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0)); 
     try { 
      while (kernel32.Process32Next(snapshot, processEntry)) { 

       if (Native.toString(processEntry.szExeFile).equalsIgnoreCase(proc)) { 

        id = processEntry.th32ProcessID.intValue(); 

       } 
      } 
      } 
    finally { 
      kernel32.CloseHandle(snapshot); 
     } 

    return id; 
    } 

    private static String findProcessByPID(int pid){ 

     String name = ""; 

     Kernel32 kernel32 = (Kernel32) Native.loadLibrary(Kernel32.class, W32APIOptions.UNICODE_OPTIONS); 
     Tlhelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();   

     WinNT.HANDLE snapshot = kernel32.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0)); 
     try { 
      while (kernel32.Process32Next(snapshot, processEntry)) { 

       if (pid == processEntry.th32ProcessID.intValue()) { 

        name = processEntry.szExeFile.toString(); 
       } 
      } 
      } 
    finally { 
      kernel32.CloseHandle(snapshot); 
     } 

    return name; 
    } 

    public static void inject(File dll, Integer pId) throws Kernel32Exception { 

    if(null == dll || !dll.exists() || !dll.isFile() || !dll.getName().endsWith(".dll")) 
      return; 

    String p = findProcessByPID(pId); 

    if(null == p) return; 

    Kernel32 kernel = Kernel32.INSTANCE; 

    HMODULE kernel32Pointer = kernel.GetModuleHandle("Kernel32"); 

             // Cannot find "GetProcAddress" 
     Pointer loadLibraryAddress = kernel.GetProcAddress(kernel32Pointer, "LoadLibraryA"); 

    HANDLE process = null; 

    DwDesiredAccess access = new DwDesiredAccess(); 
     access.setPROCESS_ALL_ACCESS(); 

     try { 
      Advapi32Tools.getInstance().enableDebugPrivilege(Kernel32Tools.getInstance().GetCurrentProcess()); 
     } catch (Exception e) { 
     } 

          // Incompatible types "Pointer" and "HANDLE" 
     process = Kernel32Tools.getInstance().OpenProcess(access, false, pId); 

     String path = dll.getPath() + '\0'; 
     byte[] bytes = path.getBytes(); 

     int pathLength = bytes.length; 

            // Cannot find "VirtualAllocEx" 
     Pointer memoryDllPath = kernel.VirtualAllocEx(process, null, pathLength, Kernel32Tools.MEM_COMMIT, Kernel32Tools.PAGE_READWRITE); 

     Memory dllPathContent = new Memory(pathLength); 

     for(int i=0;i<pathLength;i++) 
      dllPathContent.setByte(i, bytes[i]); 

     IntByReference writeResult = new IntByReference(); 

     boolean successWritting = kernel.WriteProcessMemory(process, memoryDllPath, dllPathContent, pathLength, writeResult); 

     if(!successWritting) { 

       kernel.CloseHandle(process); 

      return; 
     } 

     IntByReference threadId = new IntByReference();  

       // Pointer cannot be converted to "FOREIGN_THREAD_START_ROUTINE" 
     Pointer thread = kernel.CreateRemoteThread(process, null, 0, loadLibraryAddress, memoryDllPath, 0, threadId); 

     boolean res = false; 

         // Incompatible types "Pointer" and "HANDLE"    //Cannot find "WAIT_TIMEOUT" 
      res = kernel.WaitForSingleObject(thread, Integer.MAX_VALUE) != Kernel32Tools.WAIT_TIMEOUT; 

       // Cannot find "VirtualFreeEx" method     // Cannot find "MEM_RELEASE" 
     kernel.VirtualFreeEx(process, memoryDllPath, pathLength, Kernel32Tools.MEM_RELEASE); 

     kernel.CloseHandle(process); 

    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 

      System.out.println(GetPid("notepad.exe")); 


    } 
} 

감사는

+1

누락 된 방법이나 문제가있는 방법을 나열하면 합리적인 질문 일 수 있습니다. 구체적으로 말하십시오. 모든 사람이 코드를 컴파일하여 코드의 의미를 알아낼 수있을 것으로 기대합니다. –

+0

@ 위윈 볼 위트, 나는 위에서 편집했습니다. –

답변

0

JNA 누락 된 방법 :-) 도움이 필요하십니까? It ain't so!

당신은 다른 사람들이 혜택을 누릴 수 있도록 이상적으로, 또한 JNA 라이브러리에 다시 "실종"방법을 기여하는 라이브러리를 확장하고, 자신의 (그리고 추가해야합니다. 사람이 GetProcAddress를 매핑 한 방법

Here is an example.

내가 다른 사람을 발견 같은 15 초 이내 VirtualFreeEx의 예를 찾을 수 없습니다 (그들이 제대로을 완전히 복사하고 편집 부분을 대신의 Kernal32를 확장해야하지만) ...

Someone has mapped VirtualAllocEx here하지 않습니다 뜻밖의 일이 아니다. 거기 있지만 다른 사람을 쓰고 난 후에 당신은 그것을 쓰는 데 많은 어려움이 있어서는 안된다.