首页
社区
课程
招聘
[求助]dll打补丁出现的问题
2008-10-16 17:57 7187

[求助]dll打补丁出现的问题

2008-10-16 17:57
7187
016F0CFC    66:8B15 5C0A770>mov     dx, word ptr [1770A5C]        ;[1770A5C]=60
016F0D03    66:8BCA         mov     cx, dx
016F0D06    B8 01000000     mov     eax, 1
016F0D0B    66:81E1 F00F    and     cx, 0FF0
016F0D10    66:83F9 50      cmp     cx, 50
016F0D14    74 06           je      short 016F0D1C
016F0D16    66:83F9 60      cmp     cx, 60
016F0D1A    75 26           jnz     short 016F0D42
016F0D1C    813D 640A7701 8>cmp     dword ptr [1770A64], 61A80        ;[1770A64]=61A80
016F0D26    7C 1A           jl      short 016F0D42
016F0D28    66:833D BE08770>cmp     word ptr [17708BE], 5        ;[17708BE]=5
016F0D30    75 10           jnz     short 016F0D42
016F0D32    84D0            test    al, dl
016F0D34    75 0C           jnz     short 016F0D42
016F0D36    66:A3 AC177701  mov     word ptr [17717AC], ax        ;[17717AC]=1
016F0D3C    5E              pop     esi
016F0D3D    5B              pop     ebx
016F0D3E    8BE5            mov     esp, ebp
016F0D40    5D              pop     ebp
016F0D41    C3              retn

比如我们想对[1770A64]赋值;mov dword ptr [1770A64],61A80
但是[1770A64]这个地址好像会变,所以很麻烦

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞0
打赏
分享
最新回复 (18)
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
edigar 2008-10-16 18:25
2
0
估计重定位问题,需要给1770A64地址重定位
雪    币: 10760
活跃值: (2619)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
menglv 2008-10-16 18:55
3
0
1770A64地址重定位
具体怎么操作???
谢谢
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yygx 2008-10-16 18:56
4
0
这种经常碰到,该怎么处理呢?
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
mstwugui 6 2008-10-16 19:12
5
0
可以在重定位表里面修改,也可以运行时刻从这条写指令
mov     dx, word ptr [1770A5C]所处的地址+3处读一个DWORD出来
雪    币: 10760
活跃值: (2619)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
menglv 2008-10-16 19:22
6
0
还是不懂,我想对[1770A5C]赋值,但修改后无法正常运行!其实我的目的很简单就是要让[1770A5C]的值等于60,该怎么打补丁???
谢谢
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
mstwugui 6 2008-10-16 19:29
7
0
如果1770A5C这个值从程序开始运行后没有改变过,你可以直接用十六进制编辑器修改文件中对应位置的数值

如果1770A5C保存的是一个计算结果,你可能需要做一定的代码变动来实现,或是改变之前的计算结果,或是改变此处读写代码,这条指令有7个字节,如果要达到你的目的其实很简单,只需将该处代码修改为

66 BA 60 00 mov dx, 60h
90 nop
90 nop
90 nop
雪    币: 10760
活跃值: (2619)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
menglv 2008-10-16 20:44
8
0
首先感谢mstwugui的回答,可能是我提的问题不是让人很明白。 再说一次。这是一个dll文件,
66:8B15 5C0A770>mov     dx, word ptr [1770A5C]  ;我想对[1770A5C]赋值,但[1770A5C]这个地址并不是每次都是1770A5C,可能是1550A5C,应该是运行后产生的,不过之后就不会变,我也想mov word ptr [1770A5C],60,但保存后不能正常运行!!!
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
mstwugui 6 2008-10-16 21:18
9
0
这个地址会变化是因为重定位的原因,当dll的imagebase所指向的地址已经被其他模块占用时,系统会自动将dll加载到其他地址,随后根据重定位表修改代码中的部分地址

如果我理解没有错误的话,你的实际需要应该给dx或cx赋值60h,这也是为什么我让你把

mov     dx, word ptr [1770A5C]

这句指令patch掉的原因
mov     dx, 60h

因此原始指令总共是7个字节,而新指令只有4个字节,所以还会多出3个字节,因此后面还要继续nop3个字节
雪    币: 10760
活跃值: (2619)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
menglv 2008-10-16 21:26
10
0
不是对dx赋值,是对[1770A5C]赋值,因为还有很多个地方要查询[1770A5C]的值!
雪    币: 2071
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
sessiondiy 4 2008-10-16 21:32
11
0
重定位时, 90 就不是 90 了
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
mstwugui 6 2008-10-16 21:32
12
0
ok, 那就跳转出去执行完了再跳回来
重定位表的介绍可以google,不想用重定位表的话就用call+pop定位代码位置,然后去读出

mov     dx, word ptr [1770A5C]

这条指令+3的DWORD,就是你要写入的地方
雪    币: 10760
活跃值: (2619)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
menglv 2008-10-16 21:41
13
0
我也试过,先跳到一段不用的代码(全部nop掉),跳转出去执行完了再跳回来,可能是写入的地方不正确!OD调试可以运行,脱离od,程序只是一闪而过,应该是重定位的问题。第一次调试程序的插件,没想到这么麻烦!楼上说的这条指令+3的DWORD是什么意思?能否再说明白些,谢谢。
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
mstwugui 6 2008-10-16 21:44
14
0
对了,我都忘记这一出了,看来只能动态patch或还是要改重定位表啊
雪    币: 10760
活跃值: (2619)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
menglv 2008-10-16 21:45
15
0
就是呀,PE Tools 1.5可以修复吗?
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
mstwugui 6 2008-10-16 21:49
16
0
od调试和实际运行的地址可能不一样,那条指令
66 8B 15前面三个字节是表示 mov dx, word ptr []

后面的四个字节是目标地址,只不过这个地址会被改掉
所以这里你最多只有三个字节的空间可以用,可以用短跳转EB
建议还是学习一下重定位表吧,否则改起来太麻烦
雪    币: 2071
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
sessiondiy 4 2008-10-16 21:51
17
0
初学者搞这个限制多
很难用教的方式打入观念

也可以试试谁赋予他值
雪    币: 189
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
Osris 2 2008-10-16 22:19
18
0
计算一下再赋数
取到DLL的默认基址和现在的基址,就能算出来了,就是你在自己的代码里也进行一下重定位
雪    币: 10760
活跃值: (2619)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
menglv 2008-10-17 19:28
19
0
已经解决!非常感谢各位的回答。顺便说一下解决的办法。

动态恢复代码:

pushad
call ;下一句指令重定位前的内存地址
pop eax
sub eax, ;上一句指令重定位前的内存地址
add eax, ;重定位前的ASCII字符串 原 内存地址
mov dword ptr ds:[ 重定位后的 ASCII字符串内存地址], ASCII值
popad
jmp 原入口点
游客
登录 | 注册 方可回帖
返回