首页
社区
课程
招聘
masmv32编译的时候怎么才能不生成类似JMP DWORD PTR DS:[<&USER32.MessageBoxA>] 的东西
发表于: 2010-8-17 09:13 10951

masmv32编译的时候怎么才能不生成类似JMP DWORD PTR DS:[<&USER32.MessageBoxA>] 的东西

2010-8-17 09:13
10951
收藏
免费 0
支持
分享
最新回复 (34)
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
然后我修改了生成的EXE文件,直接修改为
call dword ptr user32.messageA
2010-8-20 10:23
0
雪    币: 87
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
用V7有4个错,用V10有170个错-_-
都是类似Test.obj : error LNK2001: unresolved external symbol __imp__VerifyVersionInfoA@1
6

to aait:
start:       
                db 0e8h
                dd MessageBoxA
end        start
我这边编译出来是:
00401000 > $  E8 06104000          CALL 0080200B
00401005      CC                   INT3
00401006   .- FF25 00204000        JMP DWORD PTR DS:[<&USER32.MessageBoxA>]   ;  USER32.MessageBoxA

不能运行也罢了,照样生成了FF25 00204000这6个字节,呵呵
我的初衷就是不要生成这6个字节
2010-8-20 10:36
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
让我疑惑的是,开始地址为什么是401005,而不是401000,而且第一条指令是jmp xxx
而不是我程序中的第一指令call xxxxxx,而且还填充了那么多的cc,cc,cc,太不好看了。
请问这个问题怎么解决呢 ?
上传的附件:
2010-8-20 10:42
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
我编译出来的结果和你是一样的,
然后我人为在EXE文件中修改了
00401000 > $  E8 06104000          CALL 0080200B
00401005      CC                   INT3
00401006   .- FF25 00204000        JMP DWORD PTR DS:[<&USER32.MessageBoxA>]   ;  USER32.MessageBoxA
我把401000 call 0080200b
改为401000 FF15 00204000
反汇编出来,就是call dword ptr user32.messagea
2010-8-20 10:45
0
雪    币: 87
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
噢,知道你的意思了
如果说是生产exe之后再改,也好改,但文件总大小就不会变了,我原来想法跟你28楼一样,直接在原地call目标而不是转一下,想尽量小一点的

不过我也发现这个的好处了
因为call后边其实是相对位置的差值
所以首先肯定不能call 77D5xxxx(msgbox的绝对地址?)
一般都是“间接寻址”来call
原地call :
总字节数total=nx6
masm32的calll
total=6+n*5
调用同一个函数的次数大于6的时候,优势已经体现出来了
2010-8-20 11:27
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
是的,call不能call 7XXX绝对地址的。
这个7XXX的绝对地址是windows 把pe装入内存的时候,在pe的导入表中找到相应单元,在把
内存中的 user32.dll的messageboxa的地址填入,
所以这个7XXX是动态的。和pe文件的导入表相关。
但是生成jmp xxxx以后,jmp后面的xxx就是存放7xxx地址的内存单元。
所以只要call xxxx(这个xxx是jmp后的xxx),就call到user32.massageboxa了。
你要消除jmp xxxx,试下这样。

还是可以通过修改EXE文件覆盖掉jmp messageboxA的。
我一下讲不清楚。
2010-8-20 11:50
0
雪    币: 87
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
暂时不管了,这个以后再慢慢看看
2010-8-20 15:15
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
我已经做到了,消除jmp user32.messageboxa
2010-8-21 09:05
0
雪    币: 87
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
怎么出来的?别说不清楚啊,慢慢说,又不赶飞机
2010-8-22 12:48
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
楼主开新贴给我20kx我就慢慢说啊。
2010-8-23 09:38
0
游客
登录 | 注册 方可回帖
返回
//