首页
社区
课程
招聘
[解决]关于调用 VirtualProtect 说参数错误的疑问
发表于: 2010-5-25 00:32 10195

[解决]关于调用 VirtualProtect 说参数错误的疑问

2010-5-25 00:32
10195
问题描述

    a.dll 要调 b.dll 中的函数,并且 a.dll 监护 b.dll 是否被修改,结合其他方面分析,决定对 b.dll 进行 SMC,向 a.dll 返回正确的校验值,同时对 b.dll 的数据段两处(一处全局变量表示的标志位,一处导入表项)和代码段中一处进行修改。
    现因 b.dll 的以上部分均被设置成不可写,我知道可以修改PE文件头中的节属性,使之可写。但若不这样修改,在运行时用 VirtualProtect 函数进行修改需要怎样的步骤呢?
    比如拟改写代码段地址 10402AC8 开始的 20h 字节的内容,想修改数据段地址 10443650 和 10447214 中的双字,是这样做吗?

    lea eax, dword ptr [ebp-14]  //&OldProtect
    push eax
    push E0000040(push 00000004
    push 00000020
    push ebx                     //ebx=10402AC8
    mov eax, dword ptr [ebp-0C]
    call dword ptr [eax]         //VirtualProtect

数据段也是类似的做法,为何后面往相应地址写代码或数据时,仍出现异常?究竟是哪里弄错了,请指教。
顺便提一句,上述 VirtualProtect 调用结束返回值是 FALSE ,表明函数失败了,用 GetLastError 取到的错误号是 57h,其含义是:

  Code           Description                   Name
   87    The parameter is incorrect.  ERROR_INVALID_PARAMETER

请高人指点迷津,谢谢。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 213
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
可不可写跟pe header没什么关系,
你申请内存的时候,就可以设置页的读写权限

ERROR_INVALID_PARAMETER 肯定是参数push错了,查下msdn就可以了
2010-5-25 09:14
0
雪    币: 218
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
可不可写跟pe header没什么关系

前面说了,要写入的地址是 b.dll 自己的地址,不是我申请的。

拿上面的示例代码看,请问参数错在哪里呢?
2010-5-25 12:40
0
雪    币: 218
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看样子帖子要沉下去了,自己再顶。

是我提的问题太简单,还是条件不够?恳请高人指点一下。
2010-5-26 18:36
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
给你看下我写的功能代码:
    ;*******  Section Protect
    lea        esi,dword ptr [ebp+(Ker32DllName-ShellStart)]
        push        esi
        call        dword ptr [ebp+(GetmulehandleADDR-ShellStart)]
        lea        esi,[ebp+(VirtualProtect-ShellStart)]
        push        esi
        push        eax
        call        dword ptr [ebp+(GetprocaddressADDR-ShellStart)]
        mov            dword ptr [ebp+(VirtualProtectADDR-ShellStart)],eax
        mov     eax,ebp
        add     eax,(OldProtectCharacteristics1-ShellStart)
        push    eax
        push    PAGE_READWRITE;这个值据说是0X04;OD里查下吧
        push    600h
        push    dword ptr [ebp+(FileHandle-ShellStart)]
        call    dword ptr [ebp+(VirtualProtectADDR-ShellStart)]
       
               
    mov ebx,S_SectionCharacteristics-ShellStart
GetSectionCharacteristicsNext:
    cmp  dword ptr[ebp+ebx],0h
    jz   AllSectionGetCharacteristics
    mov  eax, ebp
    add  eax,ebx
    mov  ecx,dword ptr[eax]
    add  ecx,dword ptr [ebp+(FileHandle-ShellStart)]
    mov  edx,dword ptr[eax+4h]
    mov  dword ptr[ecx],edx
    add  ebx,8h
    jmp  GetSectionCharacteristicsNext
AllSectionGetCharacteristics:
   
       
        mov     eax,ebp
        add     eax,(OldProtectCharacteristics2-ShellStart)
        push    eax
        push    dword ptr [ebp+(OldProtectCharacteristics1-ShellStart)]
        push    600h
        push    dword ptr [ebp+(FileHandle-ShellStart)]
        call    dword ptr [ebp+(VirtualProtectADDR-ShellStart)]
2010-5-27 06:30
0
雪    币: 218
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢5楼指点。看来是我把着红色的宏部分弄错了,马上试试。

有点不解,这各种宏标志位“或”出来应该有 E0000040 这一结果啊?我直接用了 PE 头部节属性“或” 80000000h 后的数值,也许就是这个参数不对。
2010-5-27 12:59
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
PE头部是不可写的,明显不能用。0X04是可读写。
2010-5-29 07:20
0
游客
登录 | 注册 方可回帖
返回
//