You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JNA调用SetProcessMitigationPolicy并正确传递结构体参数

问题根因

你的代码无法生效的核心原因是PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY结构体的JNA映射不符合Windows原生定义,Windows原生的该结构是4字节大小的联合类型,包含多个位域标志,你当前的映射逻辑存在潜在的内存对齐和字段解析风险,因此虽然函数返回成功,但策略没有被正确应用。

可行实现示例

1. 修正结构体定义

推荐直接操作结构体的Flags全量字段,避免JNA位域映射可能出现的兼容问题:

import com.sun.jna.Structure;

@Structure.FieldOrder("Flags")
public final class PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY extends Structure {
    // 对应原生4字节DWORD类型的Flags联合
    public int Flags;

    // 位域常量定义
    public static final int MICROSOFT_SIGNED_ONLY = 1 << 0;
    public static final int STORE_SIGNED_ONLY = 1 << 1;
    public static final int MITIGATION_OPT_IN = 1 << 2;
    public static final int AUDIT_MICROSOFT_SIGNED_ONLY = 1 << 3;
    public static final int AUDIT_STORE_SIGNED_ONLY = 1 << 4;
}

2. 修正函数调用逻辑

不需要手动调用write()和传递Pointer,JNA的Structure对象作为参数传递时会自动处理内存同步:

import com.sun.jna.platform.win32.BaseTSD;
import com.sun.jna.platform.win32.Kernel32;

public class SignaturePolicyTest {
    private static final Kernel32 kernel32 = Kernel32.INSTANCE;
    // 对应PROCESS_MITIGATION_POLICY枚举中的ProcessSignaturePolicy项
    private static final int PROCESS_SIGNATURE_POLICY = 8;

    public static void main(String[] args) {
        PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY signaturePolicy = new PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY();
        // 仅开启MicrosoftSignedOnly策略
        signaturePolicy.Flags = PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY.MICROSOFT_SIGNED_ONLY;

        BaseTSD.SIZE_T dwLength = new BaseTSD.SIZE_T(signaturePolicy.size());
        boolean success = kernel32.SetProcessMitigationPolicy(PROCESS_SIGNATURE_POLICY, signaturePolicy, dwLength);

        System.out.println("调用结果: " + success);
        // 阻塞进程,方便使用进程工具验证策略是否生效
        while (Thread.onSpinWait());
    }
}

3. 补充说明

  • 如果你是自定义的Kernel32接口,需要保证SetProcessMitigationPolicy的声明正确:
    boolean SetProcessMitigationPolicy(int mitigationPolicy, Structure lpBuffer, BaseTSD.SIZE_T cbLength);
    
  • 该API仅支持Windows 8/Server 2012及以上版本系统
  • 策略一旦设置成功后无法关闭,建议在进程启动后尽早调用
  • 可以通过Process Explorer等工具查看进程的 mitigation 策略,确认Binary Signature Policy项显示为Microsoft Signed Only即代表生效

内容的提问来源于stack exchange,提问作者Donald C. Spencer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:39:01