首页
社区
课程
招聘
[求助]新手的一个驱动内存补丁的问题 请指教
发表于: 2007-5-2 19:10 7984

[求助]新手的一个驱动内存补丁的问题 请指教

2007-5-2 19:10
7984
我的目的是修改一个函数入口JMP 到另一个函数上去
需要修改的地址是
F250A451
函数入口如下
lkd> U F77D8451
f77d8451 83ec04           sub     esp,0x4
f77d8454 55               push    ebp
f77d8455 8bec             mov     ebp,esp
f77d8457 fa               cli

要跳转到的地址是
0x8687B9B4

我的做法是
   unsigned long         addr;
   UCHAR JmpCode[] = {0xEA, 0xB4, 0xB9, 0x87,0x86}; //JMP 0x8687B9B4
  
   addr=0xF250A451;

   __asm{//去内存保护
     cli
     mov  eax,cr0
     and  eax,not 10000h
     mov  cr0,eax
        }

    memcpy((PVOID)(addr),JmpCode,5); //写跳转代码
  
    __asm{//恢复内存保护
     mov  eax,cr0
    or   eax,10000h
    mov  cr0,eax
    sti
        }
代码执行后 我用WINDBG 看被修改的地址 F250A451
发现如下

lkd> U F77D8451
f77d8451 eab4b98786796c   jmp     6c79:8687b9b4

不明白前面的6c79: 是怎么来的 而且一单触发这个跳转马上蓝屏
请高手指正,应该怎么写?

如果我想把跳转代码写成
UCHAR JmpCode[] = {0xE9, 0, 0, 0,0};
后面的地址应该怎么计算?
这个问题郁闷了好几天 新手上路 希望得到大侠指点!

顺祝大家劳动节快乐!

[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费
支持
分享
最新回复 (11)
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶 一下
2007-5-2 19:11
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
期待高手解答!
2007-5-2 22:17
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
4
UCHAR JmpCode[] = {0xEA, 0xB4, 0xB9, 0x87,0x86}; //JMP 0x8687B9B4
jmp的操作码为 ea 为远程调用,这里6c79 为段地址(在jmp时送入cs寄存器),这个6c79原来就在那里的,只不过现在作为段地址而显示出来,这个跳转必然吃兰玻璃。
操作码为e9时后面的操作数为相对转移量:
操作数 = 目标地址 - 源地址 - 5 sizeof (操作码+操作数)
例如:
401538  e9 08 00 00 00   jmp 401545  (401545 - 401538 - 5 = 08 )

401545
2007-5-3 01:34
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=gzgzlxg;304304]UCHAR JmpCode[] = {0xEA, 0xB4, 0xB9, 0x87,0x86}; //JMP 0x8687B9B4
jmp的操作码为 ea 为远程调用,这里6c79 为段地址(在jmp时送入cs寄存器),这个6c79原来就在那里的,只不过现在作为段地址而显示出来,这个跳转必然吃兰玻...[/QUOTE]

谢谢大大,详细的解答 我已经明白了!
2007-5-3 10:38
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
问题还没有完全解决 再次麻烦大大

试如我想从 0xBA7C0451 地址跳转到 0x86C80DD4

应该是 0x86C80DD4-0xBA7C0451-5 = FFFFFFFFCC4C097E

我试写 UCHAR JmpCode[] = {0xE9, 0x7E, 0x09, 0x4C,0xCC,0xFF,0xFF,0xFF,0xFF}; 结果是错误的

这么长地址的跳转 应该如何实现和表达?
2007-5-3 11:44
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
7
不用jmp嘛,比如

F77D8451 68 B4B98786    push 8687B9B4
F77D8456 C3             retn

方法很多
2007-5-3 12:03
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
用了直接返回,可以了~
汇编不行,真是寸步难行啊!跟着大侠混了.
2007-5-3 12:48
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=我是雷锋;304392]问题还没有完全解决 再次麻烦大大

试如我想从 0xBA7C0451 地址跳转到 0x86C80DD4

应该是 0x86C80DD4-0xBA7C0451-5 = FFFFFFFFCC4C097E

我试写 UCHAR JmpCode[] = {0xE9, 0x7E, 0x09, ...[/QUOTE]

晕过去,e9的操作数是4个byte,你居然弄出了8个byte,你使用的是64位机器?
用ret跳转当然可以,但是既然使用了jmp也最好弄明白这个东西。
2007-5-3 21:58
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
呵呵,见笑了。 不懂汇编,正在慢慢学了 看了例子,只好生搬硬套了 如果向上面这样的地址跨度太大 JMP能实现吗?
2007-5-3 22:26
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
11
e9(jmp)寻址范围是4G,你的机器超过4G?
2007-5-4 08:54
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我当时是想 0xBA7C0451 跳转到 0x86C80DD4

没加思考就直接相减了
0x86C80DD4-0xBA7C0451-5 = FFFFFFFFCC4C097E

把小的地址减了大地址 所以出现FFFFFFFFCC4C097E这种情况了..

其实问题的应该是,如果是要用e9(jmp)从后面往前跳 得怎么写.
虽然问题很肤浅,多谢gzgzlxg一直给于帮助
2007-5-4 18:45
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册