JNA:缺少一些特定方法

用户名

我想要用Java(仅Java)创建一个dll注入器来为我自己提供教育支持,并在一个在线游戏专业网站上找到一个基本的例子

主持人只说这是使用JNA接口制作的。

因此,我正在研究这段代码,并尝试使用NetBeans IDE和JNA进行成功编译,但是似乎我在这里(4.2.2)具有的JNA接口没有使用autor留下的所有代码和方法。

他们是:

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


  }
}

在此先感谢您的任何建议或帮助:-)

丹尼尔·威迪斯(Daniel Widdis)

JNA缺少方法?不是这样!

您只需要扩展库并添加自己的库即可(理想情况下,还可以将“遗漏”方法贡献回JNA库,以便其他人可以从中受益。

这是某人如何映射GetProcAddress的示例

有人在这里映射了VirtualAllocEx(尽管他们应该适当地扩展了Kernel32,而不是完全复制并编辑了部分)

我在找到其他人的同一15秒钟内找不到VirtualFreeEx的示例……这并不意味着它不存在,但是在编写其他人之后,编写它也不会有很多麻烦。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JNA:缺少一些具体方法

来自分类Dev

缺少一些括号

来自分类Dev

MongoDB在Node中缺少一些方法

来自分类Dev

Calendar 类中缺少一些方法

来自分类Dev

Scrapy缺少一些html元素

来自分类Dev

Android BufferedReader缺少一些字母

来自分类Dev

缺少一些MFC标头

来自分类Dev

V93k 测试方法参数类型缺少一些可接受的值?

来自分类Dev

DataGridView中缺少一些多对一的对象

来自分类Dev

在PHP中缺少一些CURL常量

来自分类Dev

沿DataFrame列平均,但缺少一些行

来自分类Dev

消息未完全发送。缺少一些文字

来自分类Dev

我似乎缺少了一些东西。

来自分类Dev

范围中缺少一些JavaScript变量

来自分类Dev

列表理解缺少一些值与编写循环

来自分类Dev

缺少一些JavaFX文档(NetBeans 11)

来自分类Dev

PostgreSQL中缺少一些.dll文件

来自分类Dev

RecvFrom缺少一些UDP数据包

来自分类Dev

SublimeText-命令面板中缺少一些命令

来自分类Dev

Ubuntu 16上缺少一些菜单栏

来自分类Dev

WebMatrix网站缺少一些文件夹?

来自分类Dev

联接无法正常工作-缺少一些结果

来自分类Dev

MergeQueue在return语句中缺少一些值

来自分类Dev

jQuery打开关闭div缺少一些东西

来自分类Dev

我的角色图中缺少一些脚本(语言)

来自分类Dev

PHP mysql_num_rows()缺少一些参数

来自分类Dev

PHP array_multisort缺少一些键

来自分类Dev

列表理解缺少一些值与编写循环

来自分类Dev

缺少一些系统调用手册页