提交 4d8ce8f1 authored 作者: wangqiang's avatar wangqiang

2022新需求

上级 78dbfd55
......@@ -6,6 +6,10 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.context.event.ContextStoppedEvent;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
......@@ -14,7 +18,7 @@ import javax.annotation.Resource;
@Slf4j
@EnableScheduling
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, SecurityAutoConfiguration.class})
public class ApqClientApplication {
public class ApqClientApplication implements ApplicationListener {
public static void main(String[] args) {
SpringApplication.run(ApqClientApplication.class, args);
......@@ -36,4 +40,10 @@ public class ApqClientApplication {
}
}
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ContextStoppedEvent || event instanceof ContextClosedEvent) { // 应用停止
log.info("应用停止==================");
}
}
}
......@@ -21,9 +21,6 @@ import com.priusis.lib.R;
import com.priusis.utils.MacAddrUtil;
import com.priusis.utils.SysConfigUtil;
import com.priusis.vo.FacilityProgramVo;
import com.sun.jna.platform.win32.*;
import com.sun.jna.platform.win32.Sspi.*;
import com.sun.jna.ptr.IntByReference;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
......@@ -384,97 +381,9 @@ public class ProgramController {
}
System.out.println(exitVal);*/
CredHandle serverCredHandle = new CredHandle();
TimeStamp clientLifetime = new TimeStamp();
int rc = Secur32.INSTANCE.AcquireCredentialsHandle(
null,
"Negotiate",
Sspi.SECPKG_CRED_INBOUND,
null,
null,
null,
null,
serverCredHandle,
clientLifetime);
// SecBufferDesc pbClientToken = new SecBufferDesc(Sspi.SECBUFFER_TOKEN, tokenBuffer);
SecBufferDesc pbClientToken = new SecBufferDesc();
CtxtHandle phNewServerContext = new CtxtHandle();
// SecBufferDesc pbServerToken = new SecBufferDesc(Sspi.SECBUFFER_TOKEN, Sspi.MAX_TOKEN_SIZE);
SecBufferDesc pbServerToken = new SecBufferDesc();
IntByReference pfClientContextAttr = new IntByReference();
rc = Secur32.INSTANCE.AcceptSecurityContext(
serverCredHandle,
null,
pbClientToken,
Sspi.ISC_REQ_CONNECTION,
Sspi.SECURITY_NATIVE_DREP,
phNewServerContext,
pbServerToken,
pfClientContextAttr,
null);
// rc = Advapi32.INSTANCE.ImpersonateLoggedOnUser();
// =================================================================
// get impersonation token of user
WinNT.HANDLEByReference threadToken = new WinNT.HANDLEByReference();
WinNT.HANDLE threadHandle = Kernel32.INSTANCE.GetCurrentThread();
boolean threadTokenResult = Advapi32.INSTANCE.OpenThreadToken(
threadHandle,
WinNT.TOKEN_QUERY | WinNT.TOKEN_DUPLICATE | WinNT.TOKEN_ASSIGN_PRIMARY,
false, /* TRUE if the access check is to be made against the process-level security context. FALSE if the access check is to be made against the current security context of the thread calling the OpenThreadToken function. */
threadToken);
// create primary token by duplicating impersonation token
WinNT.HANDLEByReference primaryToken = new WinNT.HANDLEByReference();
boolean primaryTokenResult = Advapi32.INSTANCE.DuplicateTokenEx(
threadToken.getValue(), /* hExistingToken */
WinNT.TOKEN_DUPLICATE | WinNT.TOKEN_QUERY | WinNT.TOKEN_ASSIGN_PRIMARY, /* dwDesiredAccess */
null, /* lpTokenAttributes */
WinNT.SECURITY_IMPERSONATION_LEVEL.SecurityDelegation, /* ImpersonationLevel */
WinNT.TOKEN_TYPE.TokenPrimary, /* TokenType */
primaryToken); /* phNewToken */
// String environment = createEnvironment(primaryToken);
WinBase.STARTUPINFO startupInfo = new WinBase.STARTUPINFO();
WinBase.PROCESS_INFORMATION processInfo = new WinBase.PROCESS_INFORMATION();
//BOOL CreateProcessAsUser(
//HANDLE hToken,//处理表示登录用户的标记
//LPCTSTR lpApplicationName,//指向可执行模块名称的指针
//LPTSTR lpCommandLine,//指向命令行字符串的指针
//LPSECURITY_ATTRIBUTES lpProcessAttributes,//处理安全属性
//LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程安全属性
//BOOL bInheritHandles,//新进程是否继承处理
//DWORD dwCreationFlags,//创建标志
//LPVOID lpEnvironment,//指向新环境块的
//指针LPCTSTR lpCurrentDirectory,//指向当前目录名称的
//指针LPSTARTUPINFO lpStartupInfo,//指向STARTUPINFO的指针
//LPPROCESS_INFORMATION lpProcessInformation //指向PROCESS_INFORMATION的指针
//);
boolean createProcessResult = Advapi32.INSTANCE.CreateProcessAsUser(
primaryToken.getValue(), /* hToken */
null, /* lpApplicationName */
"C:\\windows\\notepad.exe D:\\info.log", /* lpCommandLine */
null, /* lpProcessAttributes */
null, /* lpThreadAttributes */
false, /* bInheritHandles */
WinNT.CREATE_NEW_CONSOLE | WinNT.CREATE_UNICODE_ENVIRONMENT, /* dwCreationFlags */
null, /* lpEnvironment */
null, /* lpCurrentDirectory */
startupInfo, /* lpStartupInfo */
processInfo); /* lpProcessInformation */
}
@Scheduled(fixedDelay = 60000)
protected void autoUpgradeJob() {
try {
......
apq:
iot-gateway: 39.98.116.19:80/api
client:
productId: 210
tenantId: 156
productId: 286
tenantId: 138
job:
type: all
control:
......
......@@ -7,7 +7,7 @@ spring:
application:
name: apq-pc-client
profiles:
active: atest
active: aprod
# Check new version updates parameters
......@@ -39,6 +39,8 @@ core:
apq:
antivirus:
type: P360
iot-gateway: 192.168.124.19:7002
client:
productId: 210
......
......@@ -7,10 +7,12 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.priusis.utils.ProcessExtensionsApqUtil;
import com.priusis.utils.WinExecuteUtils;
import com.priusis.vo.MqttRpcDataMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Scheduled;
......@@ -38,12 +40,13 @@ public class ApqAntivirusJob {
private RestTemplate restTemplate;
// 杀毒程序
private AntivirusProcessEnum antivirusProcess = AntivirusProcessEnum.P360;
@Value("${apq.antivirus.type}") // P360
private AntivirusProcessEnum antivirusProcess;
// https://blog.csdn.net/weixin_43145361/article/details/90667636
enum AntivirusProcessEnum {
// 360安全卫士 360sd.exe <file_name>
P360("360", "360杀毒", "360sd.exe C:", /*"D:\\Program Files (x86)\\360\\360sd", */"Log\\VirusScanLog", "\\d{14}.log", Arrays.asList(0, 2, 3, 4, 5, 6, 7, 8, -1)),
P360("360", "360杀毒", "s360sd.bat", "未发现威胁文件", "Log\\VirusScanLog", "\\d{14}.log", Arrays.asList(0, 2, 3, 4, 5, 6, 7, 8, -1)),
// 腾讯电脑管家
TENCENT,
......@@ -53,7 +56,7 @@ public class ApqAntivirusJob {
// 卡巴斯基 avp.com SCAN /i0 <file_name>
KASPERSKY,
// 趋势科技
trendmicro,
trendmicro("trendmicro", "趋势科技", "sqssd.bat", "未发现威胁文件", "Log\\VirusScanLog", "\\d{14}.log", Arrays.asList(0, 2, 3, 4, 5, 6, 7, 8, -1)),
;
......@@ -61,6 +64,7 @@ public class ApqAntivirusJob {
private String name;
private String exeName;
private String exePath;
private String rightStr;
private String logPath;
private String logNamePattern;
private List<Integer> logLines;
......@@ -69,10 +73,11 @@ public class ApqAntivirusJob {
}
AntivirusProcessEnum(String code, String name, String exeName, String logPath, String logNamePattern, List<Integer> logLines) {
AntivirusProcessEnum(String code, String name, String exeName, String rightStr, String logPath, String logNamePattern, List<Integer> logLines) {
this.code = code;
this.name = name;
this.exeName = exeName;
this.rightStr = rightStr;
// this.exePath = exePath;
this.logPath = logPath;
this.logNamePattern = logNamePattern;
......@@ -107,12 +112,6 @@ public class ApqAntivirusJob {
@Scheduled(fixedDelay = 60000L)
protected void antivirusProgramTask() {
boolean hasSdExe = WinExecuteUtils.findProcess("360sd.exe");
if (!hasSdExe) {
WinExecuteUtils.startProc("D:\\Program Files (x86)\\360\\360sd\\msnmsgr.exe"); // or 360sd.exe
}
log.info("病毒查杀请求=================");
if (!initExePath()) {
......@@ -139,11 +138,9 @@ public class ApqAntivirusJob {
log.info("收到病毒查杀下发请求, sendTime:{}, params:{}", sendTime, params);
try {
// boolean hasSdExe = WinExecuteUtils.findProcess(antivirusProcess.exeName);
// if (!hasSdExe) {
// WinExecuteUtils.startProc(antivirusProcess.exePath + File.separator + antivirusProcess.exeName);
// }
WinExecuteUtils.executeExe(antivirusProcess.exePath + File.separator + antivirusProcess.exeName);
// WinExecuteUtils.executeExe(antivirusProcess.exePath + File.separator + antivirusProcess.exeName);
String pNameStr = antivirusProcess.exeName + " \"" + antivirusProcess.exePath + "\" c:\\windows";
ProcessExtensionsApqUtil.apq_CreateProcessAsUser(pNameStr);
} catch (Exception e) {
log.error("病毒查杀异常,杀毒程序可能未安装,或者配置错误, antivirusProcess:{}, exePath:{}", antivirusProcess.name, antivirusProcess.exePath, e);
}
......@@ -171,23 +168,24 @@ public class ApqAntivirusJob {
List<File> files = FileUtil.loopFiles(Paths.get(logPath), 1, file -> (file.isFile() && (file.lastModified() >= current - FIXED_DELAY)
&& file.getName().matches(antivirusProcess.logNamePattern)));
for (File file : files) {
// String logDataStr = FileUtil.readString(file, "gbk");
StringBuffer logDataStr = new StringBuffer();
// String logDataSb = FileUtil.readString(file, "gbk");
StringBuffer logDataSb = new StringBuffer();
List<String> logDatas = FileUtil.readLines(file, "gbk");
for (Integer logLine : antivirusProcess.logLines) {
if (logLine < 0) {
logLine = logDatas.size() + logLine;
}
logDataStr.append(logDatas.get(logLine)).append("\n");
logDataSb.append(logDatas.get(logLine)).append("\n");
}
if (!StrUtil.isBlank(logDataStr.toString())) {
log.info("存在病毒查杀接口扫描告警: logData:{}", logDataStr);
String logDataStr = logDataSb.toString();
if (!StrUtil.isBlank(logDataStr) && !logDataStr.contains(antivirusProcess.rightStr)) {
log.info("存在病毒查杀接口扫描告警: logData:{}", logDataSb);
// 上报病毒查杀监控数据
List<String> mapSoftRequest = new ArrayList<>();
// 上报病毒查杀异常
Map eventMapRequest = new HashMap();
Map mapRequest = new HashMap();
mapRequest.put("antivirusContent", logDataStr.toString());
mapRequest.put("antivirusContent", logDataStr);
eventMapRequest.put("requestId", 6);
eventMapRequest.put("methodName", "antivirus_info"); // BlackList WriteList
eventMapRequest.put("params", mapRequest);
......@@ -206,7 +204,7 @@ public class ApqAntivirusJob {
public static void main(String[] args) {
/*List<File> files = FileUtil.loopFiles(Paths.get("D:\\Program Files (x86)\\360\\360sd\\Log\\VirusScanLog"), 1, file -> (file.isFile() && file.getName().matches("20220119164850.log")));
/*List<File> files = FileUtil.loopFiles(Paths.get("D:\\360\\360sd\\Log\\VirusScanLog"), 1, file -> (file.isFile() && file.getName().matches("20220119164850.log")));
System.out.println(files);
for (File file : files) {
// String logDataStr = FileUtil.readString(file, "gbk");
......@@ -242,10 +240,10 @@ public class ApqAntivirusJob {
//C:\WINDOWS\SysWOW64\drivers
boolean hasSdExe = WinExecuteUtils.findProcess("360sd.exe");
if (!hasSdExe) {
WinExecuteUtils.startProc("D:\\Program Files (x86)\\360\\360sd\\msnmsgr.exe"); // or 360sd.exe
WinExecuteUtils.startProc("D:\\360\\360sd\\msnmsgr.exe"); // or 360sd.exe
}
WinExecuteUtils.executeExe("D:\\Program Files (x86)\\360\\360sd\\360sd.exe C:\\WINDOWS"); // C:\WINDOWS,C:\WINDOWS\system
WinExecuteUtils.executeExe("D:\\Program Files (x86)\\360\\360sd\\360sd.exe C:\\WINDOWS\\system"); // C:\WINDOWS,C:\WINDOWS\system
WinExecuteUtils.executeExe("D:\\360\\360sd\\360sd.exe C:\\WINDOWS"); // C:\WINDOWS,C:\WINDOWS\system
WinExecuteUtils.executeExe("D:\\360\\360sd\\360sd.exe C:\\WINDOWS\\system"); // C:\WINDOWS,C:\WINDOWS\system
} catch (Exception e) {
log.error("病毒查杀异常", e);
}
......
......@@ -6,6 +6,9 @@ import cn.hutool.json.JSONUtil;
import com.priusis.dto.HwPortControllerDto;
import com.priusis.service.control.DeviceChangeCallbackImpl;
import com.priusis.utils.IHwPortController;
import com.priusis.utils.ProcessExtensions;
import com.priusis.utils.ProcessExtensionsApqUtil;
import com.priusis.utils.WinExecuteUtils;
import com.priusis.vo.MqttRpcDataMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -17,6 +20,7 @@ import org.springframework.web.client.RestTemplate;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -42,6 +46,12 @@ public class ApqControlJob {
@PostConstruct
public void init() {
// String pNameStr = "s360sd.bat \"D:\\360\\360sd\" \"c:\\windows\"";
// String pNameStr = "D:\\Program Files (x86)\\apq-client\\client-soft\\apq.exe";
// String pNameStr2 = "C:\\windows\\notepad.exe D:\\info.log";
// ProcessExtensionsApqUtil.apq_CreateProcessAsUser(pNameStr);
// ProcessExtensionsApqUtil.apq_CreateProcessAsUser(pNameStr2);
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.submit(() -> {
// 初始化硬件接口管理模块
......
......@@ -170,8 +170,8 @@ public class ApqInfoJob {
memoryAvailableV = new DecimalFormat("#,##0.###").format(mem.getFree() / Math.pow(1024, 3));
OperatingSystem OS = OperatingSystem.getInstance();
operatingSystemV = OS.getVendor() + " " + OS.getName().replace("Win32", "Windows") + " " + OS.getVersion() + "(" + OS.getArch() + ")";
// OperatingSystem OS = OperatingSystem.getInstance();
operatingSystemV = Oshi4NoneSigarUtil.getOsWithCache();
// 用WMI接口读出的是CPU温度 getCpuTemperature == MSAcpiThermalZoneTemperature.queryCurrentTemperature();
// WMI接口读出的就是这个ACPI Thermal Zone的温度,是主板的温区温度,而不是CPU的温度
......@@ -180,8 +180,9 @@ public class ApqInfoJob {
// 最佳实践 https://www.cnblogs.com/javawebsoa/archive/2013/05/31/3111351.html WinRing0.sys + rdmsr指令
// cpuTempV = Double.parseDouble(new DecimalFormat("#.00").format(OshiUtil.getSensors().getCpuTemperature()));
cpuTempV = CoreTempUtil.getCpuTemp();
gpuTempV = CoreTempUtil.getGpuTemp();
int[] cpuAndGpuTemp = CoreTempUtil.getCpuAndGpuTemp();
cpuTempV = cpuAndGpuTemp[0];
gpuTempV = cpuAndGpuTemp[1];
} catch (Exception e) {
log.error("SigarException", e);
}
......
package com.priusis.utils;
import cn.hutool.system.oshi.OshiUtil;
import com.sun.jna.NativeLibrary;
import com.sun.jna.ptr.IntByReference;
import oshi.software.os.OperatingSystem;
import java.util.Arrays;
......@@ -14,28 +16,82 @@ public class CoreTempUtil {
static final String WR0_DLL_NAME = ParseUrlUtil.parseAbsolutePath("/core/CoreTemp.dll", System.getProperty("user.dir") + "/apq-pc-common");
/**
* CPU温度
*/
public static int[] getCpuAndGpuTemp() throws Exception {
NativeLibrary instance = null;
try {
instance = NativeLibrary.getInstance(WR0_DLL_NAME);
IntByReference cpuCoreNum = new IntByReference(0);
int[] cpuAndGpuTemp = new int[2];
int[] cpuTemp = new int[64];
int[] gpuTemp = new int[64];
//WinRing0初始化
instance.getFunction("GetCpuTemp").invoke(new Object[]{cpuCoreNum, cpuTemp});
int cpuTempV = Arrays.stream(cpuTemp).max().getAsInt();
instance.getFunction("GetGpuTemp").invoke(new Object[]{cpuCoreNum, cpuTemp});
int gpuTempV = Arrays.stream(gpuTemp).max().getAsInt();
cpuAndGpuTemp[0] = cpuTempV;
cpuAndGpuTemp[1] = gpuTempV;
return cpuAndGpuTemp;
} finally {
if (null != instance) {
WinRing0Util.doDeinitializeOls();
instance.dispose();
instance = null;
}
}
}
/**
* CPU温度
*/
public static int getCpuTemp() throws Exception {
NativeLibrary instance = NativeLibrary.getInstance(WR0_DLL_NAME);
IntByReference cpuCoreNum = new IntByReference(0);
int[] cpuTemp = new int[64];
//WinRing0初始化
instance.getFunction("GetCpuTemp").invoke(new Object[]{cpuCoreNum, cpuTemp});
return Arrays.stream(cpuTemp).max().getAsInt();
NativeLibrary instance = null;
try {
instance = NativeLibrary.getInstance(WR0_DLL_NAME);
IntByReference cpuCoreNum = new IntByReference(0);
int[] cpuTemp = new int[64];
//WinRing0初始化
instance.getFunction("GetCpuTemp").invoke(new Object[]{cpuCoreNum, cpuTemp});
return Arrays.stream(cpuTemp).max().getAsInt();
} finally {
if (null != instance) {
WinRing0Util.doDeinitializeOls();
instance.dispose();
instance = null;
System.gc();
}
}
}
/**
* GPU温度
*/
public static int getGpuTemp() throws Exception {
NativeLibrary instance = NativeLibrary.getInstance(WR0_DLL_NAME);
IntByReference pSensorNum = new IntByReference(0);
int[] gpuTemp = new int[64];
instance.getFunction("GetGpuTemp").invoke(new Object[]{pSensorNum, gpuTemp});
NativeLibrary instance = null;
try {
instance = NativeLibrary.getInstance(WR0_DLL_NAME);
IntByReference pSensorNum = new IntByReference(0);
int[] gpuTemp = new int[64];
instance.getFunction("GetGpuTemp").invoke(new Object[]{pSensorNum, gpuTemp});
return Arrays.stream(gpuTemp).max().getAsInt();
return Arrays.stream(gpuTemp).max().getAsInt();
} finally {
if (null != instance) {
WinRing0Util.doDeinitializeOls();
instance.dispose();
instance = null;
}
}
}
public static void main(String[] args) throws Exception {
// System.out.println(CoreTempUtil.getCpuTemp());
OperatingSystem os = OshiUtil.getOs();
String osValue = os.getManufacturer() + " " + os.getFamily() + " " + os.getVersionInfo().getVersion() + "(" + os.getBitness() + ")";
System.out.println(osValue);
}
}
package com.priusis.utils;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.platform.win32.Wincon;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;
public interface Kernel32 extends StdCallLibrary, WinNT, Wincon {
/**
* The instance.
*/
Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class, W32APIOptions.DEFAULT_OPTIONS);
DWORD WTSGetActiveConsoleSessionId();
/**
* Closes an open object handle.
*
* @param hObject Handle to an open object. This parameter can be a pseudo
* handle or INVALID_HANDLE_VALUE.
* @return If the function succeeds, the return value is nonzero. If the
* function fails, the return value is zero. To get extended error
* information, call {@code GetLastError}.
* @see <A HREF="https://msdn.microsoft.com/en-us/library/windows/desktop/ms724211(v=vs.85).aspx">CloseHandle</A>
*/
boolean CloseHandle(HANDLE hObject);
}
......@@ -3,8 +3,10 @@ package com.priusis.utils;
import cn.hutool.core.util.StrUtil;
import cn.hutool.system.oshi.OshiUtil;
import lombok.extern.slf4j.Slf4j;
import oshi.SystemInfo;
import oshi.hardware.HWDiskStore;
import oshi.hardware.HWPartition;
import oshi.software.os.OperatingSystem;
import java.util.Arrays;
import java.util.stream.Collectors;
......@@ -13,6 +15,7 @@ import java.util.stream.Collectors;
public class Oshi4NoneSigarUtil {
static String baseboard;
static String diskStoresModel;
static String os;
public static String getBaseboardWithCache() {
if (null == baseboard) {
......@@ -21,6 +24,14 @@ public class Oshi4NoneSigarUtil {
return baseboard;
}
public static String getOsWithCache() {
if (null == os) {
OperatingSystem ost = OshiUtil.getOs();
os = ost.getManufacturer() + " " + ost.getFamily() + " " + ost.getVersionInfo().getVersion() + "(" + ost.getBitness() + ")";
}
return os;
}
public static String getDiskStoresModelFromOshiJson() {
try {
HWDiskStore[] diskStoresFromOshi = OshiUtil.getHardware().getDiskStores();
......
package com.priusis.utils;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Advapi32;
import com.sun.jna.platform.win32.WinBase;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.PointerByReference;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ProcessExtensions {
private static int CREATE_UNICODE_ENVIRONMENT = 0x00000400;
private static int CREATE_NO_WINDOW = 0x08000000;
private static int CREATE_NEW_CONSOLE = 0x00000010;
private static WinDef.DWORD INVALID_SESSION_ID = new WinDef.DWORD(0);
private static Pointer WTS_CURRENT_SERVER_HANDLE = Pointer.NULL;
public static void main(String[] args) {
// [DllImport("advapi32.dll", EntryPoint = "CreateProcessAsUser", SetLastError = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
//BOOL CreateProcessAsUser(
//HANDLE hToken,//处理表示登录用户的标记
//LPCTSTR lpApplicationName,//指向可执行模块名称的指针
//LPTSTR lpCommandLine,//指向命令行字符串的指针
//LPSECURITY_ATTRIBUTES lpProcessAttributes,//处理安全属性
//LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程安全属性
//BOOL bInheritHandles,//新进程是否继承处理
//DWORD dwCreationFlags,//创建标志
//LPVOID lpEnvironment,//指向新环境块的
//指针LPCTSTR lpCurrentDirectory,//指向当前目录名称的
//指针LPSTARTUPINFO lpStartupInfo,//指向STARTUPINFO的指针
//LPPROCESS_INFORMATION lpProcessInformation //指向PROCESS_INFORMATION的指针
//);
// boolean createProcessResult = Advapi32.INSTANCE.CreateProcessAsUser();
// [DllImport("advapi32.dll", EntryPoint = "DuplicateTokenEx")]
// Advapi32.INSTANCE.DuplicateTokenEx();
// [DllImport("kernel32.dll", SetLastError = true)]
// Kernel32.INSTANCE.Kernel32.INSTANCE.CloseHandle();
// [DllImport("kernel32.dll")] WTSGetActiveConsoleSessionId
// Kernel32.INSTANCE.WTSGetActiveConsoleSessionId();
// [DllImport("userenv.dll", SetLastError = true)]
// private static extern bool CreateEnvironmentBlock(ref IntPtr lpEnvironment, IntPtr hToken, bool bInherit);
// Userenv.INSTANCE.CreateEnvironmentBlock()
// [DllImport("userenv.dll", SetLastError = true)]
// [return:MarshalAs(UnmanagedType.Bool)]
// private static extern bool DestroyEnvironmentBlock(IntPtr lpEnvironment);
// Userenv.INSTANCE.DestroyEnvironmentBlock()
// [DllImport("Wtsapi32.dll")] WTSQueryUserToken
// private static extern uint WTSQueryUserToken(uint SessionId, ref IntPtr phToken);
// Wtsapi32.INSTANCE.WTSQueryUserToken()
// [DllImport("wtsapi32.dll", SetLastError = true)] WTSEnumerateSessions
// Wtsapi32.INSTANCE.WTSEnumerateSessions()
// ProcessExtensions.StartProcessAsCurrentUser("D:\\360\\360sd\\360sd.exe C:\\WINDOWS", null, null, true);
// WinExecuteUtils.startProcAsUser("D:\\360\\360sd\\360sd.exe C:\\WINDOWS");
}
// Gets the user token from the currently active session
private static boolean GetSessionUserToken(WinNT.HANDLEByReference phUserToken) {
log.info("调用windows - api CreateProcessAsUser 启动=================2");
boolean bResult = false;
WinNT.HANDLE hImpersonationToken = new WinNT.HANDLE(); // IntPtr.Zero
WinDef.DWORD activeSessionId = INVALID_SESSION_ID;
PointerByReference pSessionInfo = new PointerByReference();
IntByReference sessionCount = new IntByReference();
// Get a handle to the user access token for the current active session.
if (Wtsapi32.INSTANCE.WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, pSessionInfo, sessionCount)) {
Pointer sessionInfo = pSessionInfo.getValue();
int count = sessionCount.getValue();
Wtsapi32.WTS_SESSION_INFO arrRef = new Wtsapi32.WTS_SESSION_INFO(sessionInfo);
arrRef.read(); // <-- not sure why this is here
Wtsapi32.WTS_SESSION_INFO[] sessions = (Wtsapi32.WTS_SESSION_INFO[]) arrRef.toArray(count);
for (Wtsapi32.WTS_SESSION_INFO session : sessions) {
// use session as needed...
if (session.state == 0) {
System.out.println(session);
activeSessionId = new WinDef.DWORD(session.sessionId);
}
}
Wtsapi32.INSTANCE.WTSFreeMemory(sessionInfo);
}
// If enumerating did not work, fall back to the old method
if (activeSessionId == INVALID_SESSION_ID) {
activeSessionId = Kernel32.INSTANCE.WTSGetActiveConsoleSessionId();
}
log.info("调用windows - api CreateProcessAsUser 启动=================3,activeSessionId:{}", activeSessionId);
int wtsQueryUserToken = Wtsapi32.INSTANCE.WTSQueryUserToken(activeSessionId, hImpersonationToken);
log.info("调用windows - api CreateProcessAsUser 启动=================4,wtsQueryUserToken:{}", wtsQueryUserToken);
if (wtsQueryUserToken != 0) {
// Convert the impersonation token to a primary token
bResult = Advapi32.INSTANCE.DuplicateTokenEx(hImpersonationToken, 0, null,
2, 1, phUserToken);
log.info("调用windows - api CreateProcessAsUser 启动=================5,duplicateTokenEx:{}", bResult);
Kernel32.INSTANCE.CloseHandle(hImpersonationToken);
}
return bResult;
}
public static boolean StartProcessAsCurrentUser(String appPath, String cmdLine, String workDir, boolean visible) {
log.info("调用windows - api CreateProcessAsUser 启动=================1");
WinNT.HANDLEByReference hUserToken = new WinNT.HANDLEByReference();
WinBase.STARTUPINFO startInfo = new WinBase.STARTUPINFO();
WinBase.PROCESS_INFORMATION procInfo = new WinBase.PROCESS_INFORMATION();
WinDef.LPVOID pEnv = new WinDef.LPVOID();
int iResultOfCreateProcessAsUser;
// startInfo.cb = Marshal.SizeOf(typeof(STARTUPINFO));
WinNT.HANDLE handleValue = hUserToken.getValue();
try {
if (!GetSessionUserToken(hUserToken)) {
throw new RuntimeException("StartProcessAsCurrentUser: GetSessionUserToken failed.");
}
log.info("调用windows - api CreateProcessAsUser 启动=================6,handleValue:{}", handleValue);
int dwCreationFlags = CREATE_UNICODE_ENVIRONMENT | (int) (visible ? CREATE_NEW_CONSOLE : CREATE_NO_WINDOW);
startInfo.wShowWindow = visible ? new WinDef.WORD(5) : new WinDef.WORD(0);
startInfo.lpDesktop = "winsta0\\default";
if (!Userenv.INSTANCE.CreateEnvironmentBlock(pEnv, handleValue, false)) {
throw new RuntimeException("StartProcessAsCurrentUser: CreateEnvironmentBlock failed.");
}
if (!Advapi32.INSTANCE.CreateProcessAsUser(handleValue,
appPath, // Application Name
cmdLine, // Command Line
null,
null,
false,
dwCreationFlags,
pEnv.toString(),
workDir, // Working directory
startInfo,
procInfo)) {
iResultOfCreateProcessAsUser = 1;
throw new RuntimeException("StartProcessAsCurrentUser: CreateProcessAsUser failed. Error Code -" + iResultOfCreateProcessAsUser);
}
} finally {
Kernel32.INSTANCE.CloseHandle(handleValue);
if (pEnv != null) {
Userenv.INSTANCE.DestroyEnvironmentBlock(pEnv);
}
Kernel32.INSTANCE.CloseHandle(procInfo.hThread);
Kernel32.INSTANCE.CloseHandle(procInfo.hProcess);
}
return true;
}
}
package com.priusis.utils;
import com.sun.jna.Library;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
/**
* CreatProcess
*/
@Slf4j
public class ProcessExtensionsApqUtil {
static final String CP_DLL_NAME = ParseUrlUtil.parseAbsolutePath("/core/apq_CreatProcess.dll", System.getProperty("user.dir") + "/apq-pc-common");
static ProcessExtensionsApq CP_API_INSTANCE = Native.loadLibrary(CP_DLL_NAME, ProcessExtensionsApq.class);
/**
* 获取gpu温度
*
* @return
*/
public static int apq_CreateProcessAsUser(String pNameStr) {
int i = 0;
try {
log.info("=============================== s");
Pointer pName = new Memory(pNameStr.length() + 1); // WARNING: assumes ascii-only string
pName.setString(0, pNameStr);
i = CP_API_INSTANCE.apq_CreateProcessAsUser(pName);
log.info("=============================== e" + i);
} catch (Exception e) {
log.error("apq_CreateProcessAsUser error", e);
}
return i;
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String pNameStr = "C:\\windows\\notepad.exe D:\\info.log";
ProcessExtensionsApqUtil.apq_CreateProcessAsUser(pNameStr);
}
private interface ProcessExtensionsApq extends Library {
// 声明将要调用的DLL中的方法
int apq_CreateProcessAsUser(Pointer pName);
}
}
package com.priusis.utils;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;
public interface Userenv extends StdCallLibrary {
Userenv INSTANCE = (Userenv) Native.loadLibrary("UserEnv", Userenv.class, W32APIOptions.DEFAULT_OPTIONS);
// ref IntPtr lpEnvironment, IntPtr hToken, bool bInherit
boolean CreateEnvironmentBlock(WinDef.LPVOID lpEnvironment, WinNT.HANDLE hToken, boolean bInherit);
boolean DestroyEnvironmentBlock(WinDef.LPVOID lpEnvironment);
}
package com.priusis.utils;
import cn.hutool.core.util.StrUtil;
import com.sun.jna.platform.win32.Advapi32;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinBase;
import com.sun.jna.platform.win32.WinNT;
import lombok.extern.slf4j.Slf4j;
import java.awt.*;
......@@ -29,6 +33,71 @@ public class WinExecuteUtils {
}
}
/**
* 调用windows - api CreateProcessAsUser 启动
*
* @param lpCommandLine
*/
public static void startProcAsUser(String lpCommandLine) {
log.info("调用windows - api CreateProcessAsUser 启动=================1");
// https://github.com/murrayju/CreateProcessAsUser/blob/master/ProcessExtensions/ProcessExtensions.cs
// get impersonation token of user
WinNT.HANDLEByReference threadToken = new WinNT.HANDLEByReference();
WinNT.HANDLE threadHandle = Kernel32.INSTANCE.GetCurrentThread();
boolean threadTokenResult = Advapi32.INSTANCE.OpenThreadToken(
threadHandle,
WinNT.TOKEN_QUERY | WinNT.TOKEN_DUPLICATE | WinNT.TOKEN_ASSIGN_PRIMARY,
false, /* TRUE if the access check is to be made against the process-level security context. FALSE if the access check is to be made against the current security context of the thread calling the OpenThreadToken function. */
threadToken);
log.info("调用windows - api CreateProcessAsUser 启动=================2, threadToken:{}, result:{}", threadToken.getValue(), threadTokenResult);
// create primary token by duplicating impersonation token
WinNT.HANDLEByReference primaryToken = new WinNT.HANDLEByReference();
boolean primaryTokenResult = Advapi32.INSTANCE.DuplicateTokenEx(
threadToken.getValue(), /* hExistingToken */
WinNT.TOKEN_DUPLICATE | WinNT.TOKEN_QUERY | WinNT.TOKEN_ASSIGN_PRIMARY, /* dwDesiredAccess */
null, /* lpTokenAttributes */
WinNT.SECURITY_IMPERSONATION_LEVEL.SecurityDelegation, /* ImpersonationLevel */
WinNT.TOKEN_TYPE.TokenPrimary, /* TokenType */
primaryToken); /* phNewToken */
// String environment = createEnvironment(primaryToken);
log.info("调用windows - api CreateProcessAsUser 启动=================3, primaryToken:{}, result:{}", primaryToken.getValue(), primaryTokenResult);
WinBase.STARTUPINFO startupInfo = new WinBase.STARTUPINFO();
WinBase.PROCESS_INFORMATION processInfo = new WinBase.PROCESS_INFORMATION();
//BOOL CreateProcessAsUser(
//HANDLE hToken,//处理表示登录用户的标记
//LPCTSTR lpApplicationName,//指向可执行模块名称的指针
//LPTSTR lpCommandLine,//指向命令行字符串的指针
//LPSECURITY_ATTRIBUTES lpProcessAttributes,//处理安全属性
//LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程安全属性
//BOOL bInheritHandles,//新进程是否继承处理
//DWORD dwCreationFlags,//创建标志
//LPVOID lpEnvironment,//指向新环境块的
//指针LPCTSTR lpCurrentDirectory,//指向当前目录名称的
//指针LPSTARTUPINFO lpStartupInfo,//指向STARTUPINFO的指针
//LPPROCESS_INFORMATION lpProcessInformation //指向PROCESS_INFORMATION的指针
//);
boolean createProcessResult = Advapi32.INSTANCE.CreateProcessAsUser(
primaryToken.getValue(), /* hToken */
null, /* lpApplicationName */
lpCommandLine, /* lpCommandLine */
null, /* lpProcessAttributes */
null, /* lpThreadAttributes */
false, /* bInheritHandles */
WinNT.CREATE_NEW_CONSOLE | WinNT.CREATE_UNICODE_ENVIRONMENT, /* dwCreationFlags */
null, /* lpEnvironment */
null, /* lpCurrentDirectory */
startupInfo, /* lpStartupInfo */
processInfo); /* lpProcessInformation */
log.info("调用windows - api CreateProcessAsUser 启动=================4, result:{}", createProcessResult);
}
/**
* @throws IOException
* @desc 杀死进程
......@@ -110,9 +179,16 @@ public class WinExecuteUtils {
}
}
public static void main(String[] args) throws IOException {
// get impersonation token of user
// WinExecuteUtils.executeExe("C:\\windows\\notepad.exe D:\\info.log");
// WinExecuteUtils.executeExe("D:\\360\\360sd\\360sd.exe C:\\WINDOWS");
// WinExecuteUtils.startProcAsUser("C:\\windows\\notepad.exe D:\\info.log");
WinExecuteUtils.startProcAsUser("D:\\360\\360sd\\360sd.exe C:\\WINDOWS");
// WinExecuteUtils.startProcAsUser("D:\\360\\360sd\\360sd.exe");
public static void main(String[] args) {
String procName = "Postman.exe";
/*String procName = "Postman.exe";
boolean exist = findProcess(procName);
try {
if (exist) {
......@@ -126,7 +202,7 @@ public class WinExecuteUtils {
} catch (Exception e) {
// TODO: handle exception
log.error("重启/杀死提取程序失败。。。");
}
}*/
}
}
package com.priusis.utils;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.PointerByReference;
import java.util.HashMap;
import java.util.Map;
/**
* Java通过JNA调用WinRing0.dll实现模拟驱动级别按键
*/
public class WinRing0Util {
static final String WR0_DLL_NAME = ParseUrlUtil.parseAbsolutePath("/core/WinRing0" + (Platform.is64Bit() ? "x64" : "") + ".dll",
System.getProperty("user.dir") + "/apq-pc-common");
static WR0 WR0_INSTANCE = Native.loadLibrary(WR0_DLL_NAME, WR0.class);
/**
* 获取dll的状态
*/
public static int GetDllStatus() {
return WR0_INSTANCE.GetDllStatus();
}
/**
* 销毁
*/
public static void DeinitializeOls() {
WR0_INSTANCE.DeinitializeOls();
}
/**
* 销毁
*/
public static void doDeinitializeOls() {
WinRing0Util.InitializeOls();
WR0_INSTANCE.DeinitializeOls();
}
/**
* 初始化
*/
public static void InitializeOls() {
WR0_INSTANCE.InitializeOls();
}
/**
* 如果启动报错java.lang.UnsatisfiedLinkError: Unable to load library 'WinRing0x64':
* 请将lib目录下的四个文件复制到jdk或jre的bin目录下
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
WinRing0Util.doDeinitializeOls();
/*//WinRing0初始化
WinRing0Util.InitializeOls();
//获取WinRing0的状态码
WinRing0Util.GetDllStatus();
int dllStatus = WinRing0Util.GetDllStatus();
//销毁WinRing0
WinRing0Util.DeinitializeOls();
System.err.println("WinRing0 dllStatus:" + dllStatus);*/
}
private interface WR0 extends Library {
// 声明将要调用的DLL中的方法
int InitializeOls();
int DeinitializeOls();
int GetDllStatus();
}
}
package com.priusis.utils;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;
public interface Winbase extends StdCallLibrary {
Winbase INSTANCE = (Winbase) Native.loadLibrary("Winbase", Winbase.class, W32APIOptions.DEFAULT_OPTIONS);
WinDef.DWORD WTSGetActiveConsoleSessionId();
}
package com.priusis.utils;
import com.sun.jna.LastErrorException;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.PointerByReference;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;
import java.util.Arrays;
import java.util.List;
public interface Wtsapi32 extends StdCallLibrary {
Wtsapi32 INSTANCE = (Wtsapi32) Native.loadLibrary("Wtsapi32", Wtsapi32.class, W32APIOptions.DEFAULT_OPTIONS);
boolean WTSEnumerateSessions(Pointer hServer, int Reserved, int Version, PointerByReference ppSessionInfo, IntByReference pCount) throws LastErrorException;
void WTSFreeMemory(Pointer pMemory);
int WTSQueryUserToken(WinDef.DWORD SessionId, WinNT.HANDLE phToken);
WinDef.DWORD WTSGetActiveConsoleSessionId();
class WTS_SESSION_INFO extends Structure {
public static class ByReference extends WTS_SESSION_INFO implements Structure.ByReference {
}
public int sessionId;
public String pWinStationName;
public int state;
public WTS_SESSION_INFO() {
}
public WTS_SESSION_INFO(Pointer p) {
super(p);
}
@Override
protected List getFieldOrder() {
return Arrays.asList("sessionId", "pWinStationName", "state");
}
}
}
package com.priusis.utils;
import com.sun.jna.LastErrorException;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.PointerByReference;
public class Wtsapi32Test {
public static void main(String[] argv) {
PointerByReference sessionInfoPtr = new PointerByReference();
IntByReference sessionCount = new IntByReference();
try {
if (Wtsapi32.INSTANCE.WTSEnumerateSessions(Pointer.NULL, 0, 1, sessionInfoPtr, sessionCount)) {
Pointer sessionInfo = sessionInfoPtr.getValue();
int count = sessionCount.getValue();
Wtsapi32.WTS_SESSION_INFO arrRef = new Wtsapi32.WTS_SESSION_INFO(sessionInfo);
arrRef.read(); // <-- not sure why this is here
Wtsapi32.WTS_SESSION_INFO[] sessions = (Wtsapi32.WTS_SESSION_INFO[]) arrRef.toArray(count);
for (Wtsapi32.WTS_SESSION_INFO session : sessions) {
// use session as needed...
if (session.state == 0) {
System.out.println(session);
}
}
Wtsapi32.INSTANCE.WTSFreeMemory(sessionInfo);
}
} catch (LastErrorException ex) {
ex.printStackTrace();
}
}
}
......@@ -481,7 +481,7 @@ public class SigarUtil {
} catch (Exception e) {
log.error("获取ethernet信息异常", e);
}
sb.append("}");
sb.append("]");
return sb.toString();
}
}
......@@ -11,5 +11,5 @@
<startargument>-Dplatform=windows</startargument>
<startargument>-jar</startargument>
<startargument>%BASE%\apq-pc-client-0.0.1-SNAPSHOT-boot.jar</startargument>
<startargument>--spring.profiles.active=atest</startargument>
<startargument>--spring.profiles.active=aprod</startargument>
</service>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论