JNA: Some specific methods are missing

I want to create a dll injector in Java (and only in Java) for educational applications for myself and found a basic example on a website specialized in the online game mode .

Only the author said that he was created using the JNA interface.

So, I studied this piece of code and successfully try to compile IDE and JNA NetBeans, but it seems that the JNA interface that I have here (4.2.2) does not have all the methods and functions used on the piece of code on the left of the author.

Are they:

  • GetProcAddress
  • VirtualAllocEx
  • VirtualFreeEx

So, I want to help here, if possible, in order to try to solve this problem of the lack of methods in JNA.

I installed most of these erros, but some methods in JNA are still missing, as I will show the next point with comments.

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"));


  }
}

Thank you in advance for any suggestion or help :-)

+4
source share
1 answer

Missing JNA methods? This is not true!

You just need to expand the library and add your own (and, ideally, also bring the โ€œmissingโ€ methods back into the JNA library so that others can benefit.

Here is an example of how someone displayed GetProcAddress.

Someone displayed VirtualAllocEx here (although they should expand Kernel32 correctly, and not copy it completely and edit)

VirtualFreeEx 15 , ... , , , .

0

Source: https://habr.com/ru/post/1648592/


All Articles