根据网上资料,修改进程peb→param数据,可以达到伪装进程的目的。
但经过测试( aardio + win11 X64 ),进程信息数据可以修改成功,用aardio自身读取信息进行验证,也确实改变了内存数据,但用 procmon 进行查看时,却仍然显示原来数据。
总的来说,结果是失败的,留源码以待改进。
//RUNAS
import console;
import process
//打开进程
var p = process() // 可以指定进程id
//用自带库读取命令行进行验证
import process.cmdline
console.dump(process.cmdline(p.id))
//取进程信息
var info = process.getInfo(p.handle)
console.dump(info)
//取peb信息(只取有用的部分)
var addr = info.pebBaseAddress
var peb = {// 65 elements, 0x210 bytes
byte bInheritedAddressSpace,
byte bReadImageFileExecOptions,
byte bBeingDebugged,
byte bSpareBool,
int lpMutant,
int lpImageBaseAddress,
int pLdr,
INT lpProcessParameters
}
p.readStruct(addr,peb)
//获取进程参数
var param = {
byte Reserved1[16];
ptr Reserved2[10];
WORD length;
WORD maxLength;
INT buffer;
WORD length1;
WORD maxLength1;
int CommandLine;
}
//读取进程信息
p.readStruct(peb.lpProcessParameters,param)
console.dump("进程名:" ++ p.readStringUtf16(param.buffer,param.length/2) )
console.dump("命令行:" ++ p.readStringUtf16(param.CommandLine,param.length1/2) )
//修改进程信息
var pt = p.malloc(255)
var _,l = p.writeStringUtf16(pt,"C:\Windows\explorer.exe")
p.writeNumber(peb.lpProcessParameters+16+40,l,"word")
p.writeNumber(peb.lpProcessParameters+16+40+4,pt)
p.writeNumber(peb.lpProcessParameters+16+40+8,l,"word")
p.writeNumber(peb.lpProcessParameters+16+40+4+8,pt)
//重新读取进行验证
p.readStruct(peb.lpProcessParameters,param)
console.dump("进程名:" ++ p.readStringUtf16(param.buffer,param.length/2) )
console.dump("命令行:" ++ p.readStringUtf16(param.CommandLine,param.length1/2) )
//用自带库读取命令行进行验证
console.dump(process.cmdline(p.id))
console.pause()
运行结果:
用procmon查看结果:
有知道原因的,望留言指导一下。