NSIS 反模拟器

NSIS ANTI EMULATOR

我正在尝试做一个反模拟器 分配一个大的内存区域并强制内核通过用值填充内存来将页面提交给物理内存,因为模拟器不能分配太多内存 但我不知道如何用该区域的值填充内存 这是我到目前为止所做的

系统::调用"kernel32::LocalAlloc(i 0, i 143978374) p .r0";分配 143 978 374 字节并将指针写入 $0

;我需要用这里的值填充内存

系统::调用"kernel32::LocalFree(p r0)"

如果您使用 LMEM_ZEROINIT 标志调用 LocalAlloc,Windows 可能会为您写入缓冲区。从技术上讲,这可能是一个实现细节,理论上未来的系统可以在硬件中支持这样的功能。你的仿真东西,不管是什么,也可能会忽略它。

可以使用系统插件结构语法写入内存:

!define PAGESIZE 4096
!define BLOBSIZE 143978374

!include Util.nsh
!ifndef IntPtrOp ; NSIS 2 compatibility
!define IntPtrOp IntOp
!endif
!ifndef IntPtrCmpU
!define IntCmpU
!endif

System::Alloc ${BLOBSIZE} ; This calls GlobalAlloc(GPTR, ...)
Pop [=10=]
${IntPtrCmpU} [=10=] 0 done "" "" ; Failure to allocate memory?
StrCpy  [=10=] ; Start
${IntPtrOp}   + ${BLOBSIZE} ; End
loop:
    System::Call '*(&i1 42)' ; Set the first byte in the page to 42
    ${IntPtrOp}   + ${PAGESIZE}
    ${IntPtrCmpU}   "" loop ""
System::Free [=10=]
done:

系统插件速度不是很快,所以大内存块需要一段时间才能填满。