2016-07-21 3 views
4

Я хочу создать инжектор dll в Java (и только на Java) для образовательных проприсов для себя и нашел базовый пример в website especialized in online game.JNA: Отсутствуют некоторые специфические методы

Только автор сказал, что был создан с использованием интерфейса JNA.

Итак, я изучаю этот кусок кода и с успехом пытаюсь скомпилировать IDE и JNA NetBeans, но, похоже, что интерфейс JNA, который у меня здесь (4.2.2), не имеет всех методов и функций, используемых на куске кода оставленный автором.

Являются ли они:

  1. GetProcAddress
  2. VirtualAllocEx
  3. VirtualFreeEx

Итак, я хотел некоторую помощь здесь, если это возможно, попытаться решить эту проблема отсутствия методов в JNA.

У меня была фиксированная большая часть этих erros, но все еще отсутствовала некоторые методы в 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

Это может быть разумный вопрос, если вы указали методы, которые отсутствуют или иным образом дают вам проблемы. Быть конкретной. Ожидая, что каждый компилирует ваш код, чтобы узнать, что вы имеете в виду, плохо принят на SO. –

+0

@ Erwin Bolwidt, я редактировал выше. –

ответ

0

ЮНА недостающих методов? It ain't so!

Вам просто нужно расширить библиотеку и добавить свои собственные (и, в идеале, также вносят свой вклад в «недостающие» методы обратно в библиотеку ЮНА, так что другие могут воспользоваться.

Here is an example, как кто-то наметил GetProcAddress.

Someone has mapped VirtualAllocEx here (хотя они должны надлежащим образом расширили kernel32, а не скопировали его целиком и редактировать части)

Я не мог найти пример VirtualFreeEx в те же 15 секунд, я обнаружил, что другие ... не означает, что это не из там, но после написания других вы также не должны беспокоиться о том, чтобы написать это.

Смежные вопросы