有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用JNA调用SetProcessReliationPolicy

<>我试图通过JNA:

将这段C++代码转换成java代码
PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY signaturePolicy = {};
signaturePolicy.MicrosoftSignedOnly = true;
SetProcessMitigationPolicy(ProcessSignaturePolicy, &signaturePolicy, sizeof(signaturePolicy));

我已经有了来自Kernel32.dll的函数SetProcessMitigationPolicy,我可以调用它,但是如何传递这样的参数呢

你能举个例子吗

更新:

我已经尝试了下面的代码,但仍然不起作用。函数声明是否正确?显然,函数返回true,我没有得到任何错误

// Main

private static final Kernel32 kernel32 = Kernel32.INSTANCE;

public static void main(String[] args) {
    PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY signaturePolicy = new PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY();
    signaturePolicy.MicrosoftSignedOnly = 1;

    signaturePolicy.write();

    BaseTSD.SIZE_T dwLength = new BaseTSD.SIZE_T(signaturePolicy.size());

    boolean success = kernel32.SetProcessMitigationPolicy(8, signaturePolicy.getPointer(), dwLength);

    System.out.println("Result: " + success);

    while (true);
}
// PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY

@Structure.FieldOrder({"MicrosoftSignedOnly"})
public final class PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY extends Structure {

    public int MicrosoftSignedOnly;

}

共 (1) 个答案

  1. # 1 楼答案

    ^{}函数有三个参数

    BOOL SetProcessMitigationPolicy(
      PROCESS_MITIGATION_POLICY MitigationPolicy,
      PVOID                     lpBuffer,
      SIZE_T                    dwLength
    );
    

    第一个参数是PROCESS_MITIGATION_POLICY枚举。这是一个简单的整数(从0开始),指示要使用哪个策略。示例代码显示了枚举的ProcessSignaturePolicy成员。这就是整数8

    int MitigationPolicy = 8;
    

    示例代码显示,您正在使用PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY结构作为第二个参数。这实际上被映射为一个32位并集,其中一个是DWORD(可以映射为int),另一个是位字段总计32位的结构。JNA没有映射位字段的方法,所以需要直接设置这些位。所以我要简化映射,只把这个结构映射为Flags字段:

    @FieldOrder ({"Flags"})
    class PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY extends Structure {
      public int Flags;
    }
    

    MS文档指定位字段start at the least significant bit。因此signaturePolicy.MicrosoftSignedOnly = true;的等效方法是将最低有效位设置为1

    PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY signaturePolicy 
        = new PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY();
    signaturePolicy.Flags = 1;
    // alternately, since Flags is initialized to 0, the direct
    // counterpart to setting MicrosoftSignedOnly = true is:
    // signaturePolicy.Flags |= 0x1;
    

    第二个函数参数是指针(PVOID),您的示例显示的是结构的地址。因此,您应该为该参数传递signaturePolicy.getPointer()

    通常,当向函数传递Structure时,它会自动将Java值写入本机内存。我们将只传递指向结构的指针,因此在传递之前需要手动write()将值传递给本机内存

    signaturePolicy.write();
    // now pass signaturePolicy.getPointer()
    

    第三个参数是结构的SIZE_T大小

    SIZE_T dwLength = new SIZE_T(signaturePolicy.size());
    

    更新答案以解决问题中的更新

    根据答案,映射是正确的;您为结构映射选择的变量名可能会产生误导,因为您将位字段的名称用于整个32位Flags