能力值:
( LV13,RANK:410 )
|
-
-
2 楼
首先,funcaddress的类型未指定,不过看你的代码似乎是存放着函数地址的变量的指针。
其次,一般来说,代码段的内存属性是读取和执行,没有可写这条,所以你需要先改变下那一段的内存属性才能进行Inline补丁。改完之后推荐把内存属性改回去。
再次,这段代码可以用C来实现。没有asm的必要性
NTSTATUS InlinePatch_HoxFix(PBYTE oldFuncAddr,LPVOID newFuncAddr)
{
if (*oldFuncAddr==0x8b && *(oldFuncAddr+1)==0xff && (*(DWORD*)(oldFuncAddr-5)==0xCCCCCCCC || *(DWORD*)(oldFuncAddr-5)==0x90909090) && (*(oldFuncAddr-1)==0xCC || *(oldFuncAddr-1)==0x90))
{
DWORD oldProtect;
if(VirtualProtect((LPVOID)(oldFuncAddr-5),7,PAGE_EXECUTE_READWRITE,&oldProtect))
{
*oldFuncAddr=0xeb;
*(oldFuncAddr+1)=0xf9;
*(oldFuncAddr-5)=0xe9;
*(DWORD*)(oldFuncAddr-4)=(DWORD)((PBYTE)(newFuncAddr)-(oldFuncAddr-5)-5);
VirtualProtect((LPVOID)(oldFuncAddr-5),7,oldProtect,&oldProtect);
return STATUS_SUCCESS;
}
}
return STATUS_UNSUCCESSFUL;
}
测试了一下,没问题。
|
能力值:
(RANK:290 )
|
-
-
3 楼
(⊙o⊙)… 我要汇编的 。。方式 。。。。。。。。。
|
能力值:
( LV13,RANK:410 )
|
-
-
4 楼
void InlinePatch_HoxFix(LPVOID oldFuncAddr,LPVOID newFuncAddr)
{
__ASM
{
push esi
mov esi,oldFuncAddr
cmp word ptr [esi],0xff8b
jnz @Fail
cmp byte ptr [esi-1],0x90
je @Next1
cmp byte ptr [esi-1],0xcc
jnz @Fail
@Next1:
cmp dword ptr [esi-5],0x90909090
je @Next2
cmp dword ptr [esi-5],0xcccccccc
jnz @Fail
@Next2:
sub esi,5
push 0
push esp
push 40
push 7
push esi
call VirtualProtect
test eax,eax
je @Fail1
mov esi,oldFuncAddr //以防esi被改写,重新赋值
mov byte ptr [esi-5],0xe9
mov eax,newFuncAddr
sub eax,esi
mov dword ptr [esi-4],eax
mov word ptr [esi],0xfaeb
mov eax,[esp]
push esp
push eax
push 7
sub esi,5
push esi
call VirtualProtect
pop eax
mov eax,0
retn 8
@Fail1:
pop eax
@Fail:
mov eax,0xc0000001
retn 8
}
}
|
能力值:
(RANK:290 )
|
-
-
5 楼
O(∩_∩)O谢谢 ko了
|
|
|