已知内存基值加偏移.现在我可以读.可以写..
但是我想要锁定住内存中的这个值..不让他减少..怎么做.当然可以只增不减也更好
用什么函数好.有实例最好

解决方案 »

  1.   

    这个有点复杂了,3种解决方法
    1.调试模式打开进程或者附加调试,然后VirtualProtectEx(hProcess,MemAdr ,.. , PAGE_NOACCESS) PAGE_EXECUTE_READ(允许读就用这个参数)
    然后从调试函数中获取异常,分析异常处的代码是否是读写MemAdr,如果是进行相应的处理(跳过或者干点别的)
    以上是CE的模式,缺点很明显,目标程序可以用任意检查调试器的方式检查到程序是否被调试,如果检查到了,对方可以干很多事情,所以CE对很多Exe无效.2.这是我的方法
    首先远程InLineHook , ntdll.KiUserExceptionDispatcher住这个API,
    HOOK代码里判断Exp:PExceptionRecord;
    Exp.ExceptionCode = $C0000005;    //内存违例访问异常代码
    并且
    Exp.ExceptionInformation[0] = 00000000 //0读错误,1写错误,
    判断Exp.ExceptionInformation[1] 在MemAdr所在的页面范围内,页面大小通常是4096
    然后分析异常处的语句是否是在操作MemAdr(有可能操作页面内的其他地址),如果是进入处理流程(跳过或者干点别的什么)然后远程
    VirtualProtectEx(hProcess,MemAdr,...,NOACCESS);
    让内存无法访问,如果访问该页面,就会进入Hook流程中,就可以找到访问该地址的语句.缺点:1.跨页地址处理比较麻烦,2.如果允许这个异常语句执行,就得首先暂停其他线程,然后用VirtualProtect恢复,并在当前语句下一句设置UD2异常,然后继续,并在Hook中判断UD2异常,代码C000001D,恢复线程恢复UD2继续,当然也可以用int 3,为了很好的区分,建议用UD23.硬件断点,需要在r0下修改调试寄存器,然后用上面任意一种方法拦截异常并分析.
      

  2.   

    以前曾用过FPE、金山游侠就可以。