能力值:
(RANK:350 )
|
-
-
2 楼
感谢分享,赠10KX,你现在可以购邀请码转正了。
|
能力值:
( LV6,RANK:90 )
|
-
-
3 楼
谢谢kanxue老大的鼓励,没想到还能得到你的关注啊,太激动了!!我会再接再厉的!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
唉,我也激动
|
能力值:
( LV6,RANK:90 )
|
-
-
5 楼
这么晚了,你激动啥呢?
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
从来只用 inline hook ..iat啥的 鸡肋啊
|
能力值:
( LV6,RANK:90 )
|
-
-
7 楼
inline hook太高端,本小菜还不懂,有待学习~
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
我用IAT hook的时候
call __chkesp (004013e0)
崩溃,堆栈失衡,请问lz是否有过经验,怎么解决这个问题。
|
能力值:
( LV9,RANK:610 )
|
-
-
9 楼
有这么麻烦吗? API的地址不管后面有没有保存到寄存器中,原始值肯定还是来源于IAT,所以IAT Hook不用考虑是debug还是release,如果你没做到,只能说明你Hook的时机有问题
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
Vc6debug版本的程序中的.idata节是可写的,我们可以不用VirtualProtect而直接用WriteProcessMemory覆盖掉目标API的地址,但是在release版本下此节被编译器优化成了只读属性,所以在release下必须要用VirtualProtect加上写属性才能写内存成功,这是《windows程序设计》这本书给出的答案。
这个貌似有点不对
貌似 WriteProcessMemory写自己本身进程的内存是不需要使用VirtualProtect加写属性的
验证代码
#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwSize;
LPVOID lpAddr;
__asm
{
_A:
mov ebx, _A;
mov lpAddr, ebx;
mov eax, _B;
sub eax, ebx;
mov dwSize, eax;
jmp _B;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
_B:
}
DWORD dwSizeNeed;
char *pdata = new char[dwSize];
memset(pdata, 0xCC, dwSize);
// WriteProcessMemory 可以正常写
WriteProcessMemory(INVALID_HANDLE_VALUE
, lpAddr
, pdata
, dwSize
, &dwSizeNeed
);
delete[] pdata;
// 使用memset设置 直接崩溃
memset(lpAddr, 0x90, dwSize);
printf("hello world!");
return 0;
}
|
|
|