首页
社区
课程
招聘
[求助]会ASM 进来一下
发表于: 2012-5-10 13:50 4476

[求助]会ASM 进来一下

2012-5-10 13:50
4476
VOID Write_Inline (in funcaddress , inNewFuncAddress )   funk   挂了  
__asm
    {
        push eax  
        push ecx
        lea eax,[FuncAddress]  载入有效地址
        mov eax,[eax]
        cmp byte ptr[eax],0x8b        对比
        jnz failtohook     等于跳
        cmp byte ptr[eax+1],0xff    对比
        jnz failtohook    等与跳
        mov ecx,0xffffffff         
loopcheck:
        cmp byte ptr[eax+ecx],0x90  对比
        jnz failtohook   等于跳
        dec ecx
        cmp ecx,0xfffffffa
        jnz loopcheck  等于跳

       mov byte ptr[eax],0xeb      字节byte
        mov byte ptr[eax+1],0xf9
          mov byte ptr[eax-5],0xe9
          mov ecx,[NewFuncAddress]
        sub ecx,eax   
        mov dword ptr[eax-4],ecx
        jmp hookok  等于跳
failtohook:
        mov stat,0xc0000001   写出stat
        jmp end  无条件 跳到end
hookok:   
        mov stat,0    把0给 stat
end:
        pop ecx  弹出
        pop eax  弹出

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 622
活跃值: (294)
能力值: ( 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;
}

测试了一下,没问题。
2012-5-10 15:35
0
雪    币: 219
活跃值: (738)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
3
(⊙o⊙)…  我要汇编的  。。方式  。。。。。。。。。
2012-5-11 11:13
0
雪    币: 622
活跃值: (294)
能力值: ( 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
}
}
2012-5-11 12:08
0
雪    币: 219
活跃值: (738)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
5
O(∩_∩)O谢谢  ko了
2012-5-11 13:34
0
游客
登录 | 注册 方可回帖
返回
//