首页
社区
课程
招聘
[求助]用JMP将CALL命令移动另一段执行后的返回问题?程序不能正常运行,是怎么回事呢?
发表于: 2007-11-1 10:57 4044

[求助]用JMP将CALL命令移动另一段执行后的返回问题?程序不能正常运行,是怎么回事呢?

2007-11-1 10:57
4044
有一个程序,结构如下:

序号   段名   文件中偏移   文件中大小
0001  CODE  00000400   00095400
0002  DATA   00095800   00002A00
0003  .idata  00098200   00003000
.....

在CODE段中有一句代码:
0049509F:  E8 28FFFFFF              CALL    00494FCC

需要移动到CODE段空白处再跳回来,但CODE段的空处大小不够,仅几个字节。因此只好JMP到DATA段的空白处再跳回CODE段。

原代码如下:
《CODE段处要移的代码是下面第一句:--》
0049509F:  E8 28FFFFFF              CALL    00494FCC
004950A4:  83C0 44                    ADD     EAX, 44

《DATA段的空白处:--》
00498063:  0000                       ADD     [BYTE DS:EAX], AL
00498065:  0000                       ADD     [BYTE DS:EAX], AL

修改的结果如下:
《CODE段处要移的代码修改为:--》
0049509F:  E9 BF2F0000                JMP     00498063
004950A4:  83C0 44                    ADD     EAX, 44

《DATA段的空白处代码修改为:--》
00498063:  E8 64CFFFFF                CALL    00494FCC
00498068:  E9 37D0FFFF                JMP     004950A4

可是为什么会运行不正常呢?
1、是不是JMP不能跨段运行呢?
2、是不是CALL命令跨段运行不能正常返回?

求高手指导和解答:
1、上面2个问题的疑问?
2、增加CODE段大小的具体方法。

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
可能原因
DATA段是可写的,你选的地址太过于靠前,可能某些全局变量 或 缓存 要有到这块数据。
你可以将补丁放到其他段,如rdata

另外,你程序不能运行,看看是不是有自校验。
2007-11-1 11:05
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢kanxue版主的热心解答。我试试看将代码移到其他段!

另:
1、该程序是没有自校验的,我试过其他什么也不改,只是将空白处修改了一下代码,程序是正常运行的。

2、有什么工具可以自动增加段的大小?或手工改段大小的方法?
2007-11-1 11:29
0
雪    币: 299
活跃值: (25)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
4
在做免杀哇?
data段可能有全局变量,程序装进去看上去是0,结果运行一会儿就变了。
手工增加最后一个段的大小不难,就在段名后面不远。但要增加中间的那些段,那就要高科技了。
2007-11-1 11:40
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
呵呵,被zjjmjtoot兄发现了。
那.idata 可能有全局变量吗?我得找一个不会在运行中被程序修改的段来改代码?或者有什么段可推荐?
2007-11-1 12:02
0
雪    币: 299
活跃值: (25)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
6
可以在文件最后新建一个节。
2007-11-1 14:44
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
zjjmjtoot兄:
若我将代码移到.text或CODE段的空白处,这两个段的内容在程序运行中应该不会被改吧?
2007-11-1 15:39
0
游客
登录 | 注册 方可回帖
返回
//