首页
社区
课程
招聘
[旧帖] [求助]DELPHI写汇编中JMP的问题 0.00雪花
发表于: 2009-1-7 00:10 4953

[旧帖] [求助]DELPHI写汇编中JMP的问题 0.00雪花

2009-1-7 00:10
4953
各位高手帮帮忙:
我在用DELPHI弄一个程序的时候,需要把原地址处的代码跳转到我新写入的代码处,然后执行完我写的代码再跳回原代码的下一行.
比如这样
原代码:
00427B9E      CMP EAX,0156EB4
00427BA3      ..................

我自己的代码:
procedure MYCODE;
asm
CMP EAX,$0156EB4
JE $00427BA3
MOV EAX,$0156EB4
JMP $00427BA3
end;

上面的代码插入后用OD查看也变成了下面的:
01050000 3D 4E61BC00 cmp eax, 0BC614E
01050005 75 06 jnz short 0105000D
01050007 FF25 E45B4500 jmp dword ptr [455BE4]
0105000D B8 4E61BC00 mov eax, 0BC614E
01050012 3D 4E61BC00 cmp eax, 0BC614E
01050017 FF25 E45B4500 jmp dword ptr [455BE4]
都跟预期要达到的效果不一样


首先用VirtualAllocEx申请的内存地址为01050000,设这个为addr1, 然后把我自己的程序MYCODE写入到ADDR1开始的位置, 那么我在 0043251A那行就应该写成 JMP $01050000(或者是JMP ADDR1 ????  这里我不太清楚),这样原程序执行到43251A的时候就会跳到我自己的代码部分,运行完后再跳回0043251A的下一行

但如果我在DELPHI里写
asm
jmp $01050000 {我想知道这里应该怎么写,是写成jmp addr1呢还是什么}
end
上面的代码写入后就会变成了
00427B9E FF25 E05B457D jmp dword ptr [7D455BE0]
这样的,为什么会这样呢?


还有就是,如果在我的代码里要跳回00427BA3,那在DELPHI的内联汇编应该怎么写呢?JMP后面是一个指针还是什么呢?

麻烦高手帮忙解答一下.

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

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
试试
push 01050000
ret
2009-1-7 00:27
0
雪    币: 357
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
因为只能改一行代码,就是原来的CMP  EAX,****那里,如果先PUSH再JMP就会增加字节了吧?
2009-1-7 09:19
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
4
不知LZ的Code是举例or实例?
若是实例的话, 你的MyCode等于 mov eax, 0156EB4

直接将 00427B9E      CMP EAX,0156EB4
改成  00427B9E      MOV EAX,0156EB4
不就得了?

00427B9E      CMP EAX,0156EB4
00427BA3      ..................
不知这 ....... 是 jz or jnz
若希望的流程是固定的, 改为 jmp 或 nop 掉即可.
否则你写的 MyCode, 将会是2种状况.

若是举例的话,
00427B9E      CMP EAX,0156EB4
00427BA3      ..................
二行加起来够用 push xxxxxxxx ' ret 了
你写的MyCode, 一样, push xxxxxxxx ret 回来看你要到那里.

请问一下你Delphi是几版的?
你DELPHI的内联汇编 写 jmp $01050000 可以Compile过去?
2009-1-7 10:30
0
雪    币: 357
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我是举的实例,我用的D7,如果是写JMP  $1050000是不能编译通过的。如果把$1050000换成指针就可以通过,但是编译后就成了JMP DWORD PTR[********]类似的东西了。

还有MYCODE那里只是我写的个简单的例子,实际上我是要在MYCODE里对EAX进行N多种判断并返回相应的值的。

JMP  后面应该跟POINTER吧?为什么我用JMP  JMPTmp(JMPTmp为pointer类型)还是跳不到我申请的程序段去执行呢?
2009-1-7 11:54
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
6
试试
    mov addr1, $01050000
    jmp addr1

    mov eax, $01050000
    jmp eax

二者皆可
2009-1-7 13:23
0
雪    币: 347
活跃值: (30)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
7
sessiondiy大牛全能啊,膜拜
2009-1-7 13:44
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
8
我...昨天刚学
2009-1-7 13:47
0
雪    币: 347
活跃值: (30)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
9
我。。。无语
2009-1-7 13:56
0
雪    币: 357
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢sessiondiy的热心有助。我用你刚才说的push *****  ret实现并成功了,太感谢你了。

还有一点要请教的就是,因为是通过VirtualAllocEx申请内存,在输入参数“申请空间的大小”的时候,能不能用sizeof(程序名)来取得要写入的程序段的大小呢?因为有可能要经常改动MYCODE的代码,总不可能每次都写入后再用OD去看,计算有多少字节,然后再写入吧?
2009-1-7 14:41
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
11
那就写大一点吧
2009-1-7 17:31
0
雪    币: 357
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
没有一个可以用于计算的吗?
2009-1-8 07:46
0
雪    币: 357
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
sessiondiy:

因为申请的内存空间是不固定的,那怎么才能使push后面的地址随这个变呢?
2009-1-8 14:35
0
游客
登录 | 注册 方可回帖
返回
//