小编wit*_*ens的帖子

钩子:为什么我们需要再次使用VirtualProtect()来恢复权限?

这是一些标准的代码片段,我们安装钩子在我们感兴趣的函数的开头重写一些字节.我的问题是:为什么我们需要重新保护一段重写的记忆?我们不能只留下PAGE_EXECUTE_READWRITE权限吗?我们假设我们需要不断恢复原始字节并再次重新挂起.

if (VirtualProtect(funcPtr, 6, PAGE_EXECUTE_READWRITE, &dwProtect)) // make memory writable
{
    ReadProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, Hook::origData, 6, 0); // save old data
    DWORD offset = ((DWORD)hook - (DWORD)funcPtr - 5);  //((to)-(from)-5)
    memcpy(&jmp[1], &offset, 4); // write address into jmp
    memcpy(Hook::hookData, jmp, 6); // save hook data
    WriteProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, jmp, 6, 0); // write jmp
    VirtualProtect(funcPtr, 6, dwProtect, NULL); // reprotect
}
Run Code Online (Sandbox Code Playgroud)

c++ x86 hook winapi

8
推荐指数
1
解决办法
7721
查看次数

在IEEE 754中,为什么在无操作中添加负零会产生但是添加正零则不会?

我在Rust中使用了一些算法(尽管这个语言对我的问题并不重要).考虑一下代码:

#[no_mangle]
pub fn test(x: f32) -> f32 {
    let m = 0.;
    x + m
}

fn main() {
    test(2.);
}
Run Code Online (Sandbox Code Playgroud)

它生成以下LLVM IR和相应的x86_64 asm(已启用优化):

;; LLVM IR
define float @test(float %x) unnamed_addr #0 {
start:
    %0 = fadd float %x, 0.000000e+00
    ret float %0
}

;; x86_64
; test:
    xorps xmm1, xmm1
    addss xmm0, xmm1
    ret
Run Code Online (Sandbox Code Playgroud)

如果我更改let m = 0.;let m = -0.;浮点,则添加优化:

;; LLVM IR
define float @test(float returned %x) unnamed_addr #0 {
start: …
Run Code Online (Sandbox Code Playgroud)

floating-point ieee-754

2
推荐指数
1
解决办法
116
查看次数

标签 统计

c++ ×1

floating-point ×1

hook ×1

ieee-754 ×1

winapi ×1

x86 ×1