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

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

2010-8-17 09:13
10988
00401066  - FF25 08104000   JMP DWORD PTR DS:[<&USER32.MessageBoxA>] ;
0040106C  - FF25 00104000   JMP DWORD PTR DS:[<&KERNEL32.ExitProcess>;

每一个api都会生产一个6字节的,用api多的话很占空间的,为什么不原地call呢?
请问编译的时候能有选项吗?

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

收藏
免费 0
支持
分享
最新回复 (34)
雪    币: 378
活跃值: (702)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
可能有些版本,或者打过补丁之后,api的地址不同了!
兼容考虑!

好像没有这个选项吧!
2010-8-17 09:16
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
手动修改,嘎嘎
2010-8-17 09:50
0
雪    币: 87
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
应该不是,因为jmp的还是立即数地址,messagebox是od给出了的而已。

本来是打算手动改,但比如你一个程序改了之后能达到1K的话,编译的时候因为这些内容导致超过1K了,不好看.
2010-8-17 12:41
0
雪    币: 378
活跃值: (702)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
哦,楼主可以看看导入表相关的内容!
2010-8-17 17:06
0
雪    币: 452
活跃值: (72)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
6
use modified include files
I will post modified user32.inc tomorrow, if I don't forget it
2010-8-18 01:57
0
雪    币: 87
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
usage: LINK [options] [files] [@commandfile]

   options:

      /ALIGN:#
      /BASE:{address|@filename,key}
      /COMMENT:comment
      /DEBUG
      /DEBUGTYPE:{CV|COFF}
      /DEF:filename
      /DEFAULTLIB:library
      /DLL
      /DRIVER[:{UPONLY|WDM}]
      /ENTRY:symbol
      /EXETYPE:DYNAMIC
      /EXPORT:symbol
      /FIXED[:NO]
      /FORCE[:{MULTIPLE|UNRESOLVED}]
      /GPSIZE:#
      /HEAP:reserve[,commit]
      /IMPLIB:filename
      /INCLUDE:symbol
      /INCREMENTAL:{YES|NO}
      /LARGEADDRESSAWARE[:NO]
      /LIBPATH:dir
      /MACHINE:{ALPHA|ARM|IX86|MIPS|MIPS16|MIPSR41XX|PPC
      /MAP[:filename]
      /MAPINFO:{EXPORTS|FIXUPS|LINES}
      /MERGE:from=to
      /NODEFAULTLIB[:library]
      /NOENTRY
      /NOLOGO
      /OPT:{ICF[,iterations]|NOICF|NOREF|NOWIN98|REF|WIN
      /ORDER:@filename
      /OUT:filename
      /PDB:{filename|NONE}
      /PDBTYPE:{CON[SOLIDATE]|SEPT[YPES]}
      /PROFILE
      /RELEASE
      /SECTION:name,[E][R][W][S][D][K][L]

[X]
      /STACK:reserve[,commit]
      /STUB:filename
      /SUBSYSTEM:{NATIVE|WINDOWS|CONSOLE|WINDOWSCE|POSIX
      /SWAPRUN:{CD|NET}
      /VERBOSE[:LIB]
      /VERSION:#[.#]
      /VXD
      /WARN[:warninglevel]
      /WINDOWSCE:{CONVERT|EMULATION}
      /WS:AGGRESSIVE

好像不怎么有啊


改过的就可以了?那期待ing

2010-8-18 17:11
0
雪    币: 378
活跃值: (702)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
8

那我大概的和你讲讲吧
FF25 08104000   JMP DWORD PTR DS:[<&USER32.MessageBoxA>] ;

因为可能因为平台等各种关系,api的地址可能会有所不同,但是如何保证这个程序在不同的平台上面都可以运行呢,然后这里就用了一个间接地址,这里jmp到那个间接地址,间接地址放的是api的地址,然后每次程序跑之前,操作系统去帮你把这里面填上运行平台上那个api的地址值!

这样明白了吧!
2010-8-18 18:50
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
嗯,ls真相帝,如果改成原地call了,那就只能硬编码了。
2010-8-18 19:11
0
雪    币: 452
活跃值: (72)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
10
azul,

I uploaded kernel32.inc and user32.inc
Please include windows.inc ahead of all other inc files.
I hope it will work.

EvalKnight,

I think you might misunderstand the question. The question is, in MASM, for example, we want to call MessageBox at 00401000, but MSAM generates a call to 00401066, then from 00401066 jump to real MessageBox address. This call-jmp thunk wastes 6 bytes for each API.
If you disasm C++ application (release version), you won't observe this, because C++ compiler is highly optimized.
There are two ways to remove this thunk in MASM, one is to modify lib file, which is difficult. The other is to modify the inc file, which is simple.

Sorry I can't type Chinese on this machine. I hope you can read English
上传的附件:
2010-8-18 21:57
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
看了一下ls给出的inc文件,都是用的这种形式的:
EXTERN _imp__LoadLibraryA@4 : PTR pr1
LoadLibrary EQU <_imp__LoadLibraryA@4>

确实可以原地call,看来我还是把概念弄混了……
2010-8-18 23:14
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
call jmp user.messageboxa
得了,
call jmp也不错
一排的jmp很工整
2010-8-19 09:25
0
雪    币: 378
活跃值: (702)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
13
嗯,昨晚回去时发现问东答西了,谢谢提醒!
2010-8-19 10:15
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
lz你还可以直接把vc里的ml.exe link.exe拷过来
2010-8-19 10:20
0
雪    币: 87
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
xiilin可以用了?我这边有错误:
Assembling: Test.asm
C:\Masm32\Include\user32.inc(12) : error A2008: syntax error : PROTO
C:\Masm32\Include\user32.inc(14) : error A2008: syntax error : PROTO
Test.asm(97) : error A2006: undefined symbol : _imp__wsprintfA
NMAKE : fatal error U1077: 'C:\Masm32\Bin\ml.EXE' : return code '0x1'
Stop.
不替换的时候是可以的,替换了之后wsprintf这个函数就有问题了,奇怪
include部分的顺序:
include                windows.inc
include                kernel32.inc
includelib        kernel32.lib
include                user32.inc
includelib        user32.lib
include                comdlg32.inc
includelib        comdlg32.lib
2010-8-19 12:44
0
雪    币: 452
活跃值: (72)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
16
或许你的MASM版本太旧了?
用这个lib试试
上传的附件:
2010-8-19 13:00
0
雪    币: 235
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
LZ 你可疑看看PE结构 导入导出表 就明白了
2010-8-19 14:00
0
雪    币: 87
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
我比较菜,PE结构我还真不看的太懂,呵呵,只是最近想用asm写几个小工具的时候想尽量让exe小一点,发现除了合并段之外,生成的这个东西也挺占空间的;
还是不行,我手里刚好前几天下了V10,就是最新版的,从masm的主页上下的。
开始没发现合并段的参数/merge:from=to这个是在link.exe里,以为是新版才有的呢,就下了个新的^_^

我现在测试的设置,我的源文件函数太多不方便测试,都删除了:
现在的源文件:
                .386
                .model flat, stdcall
                option casemap :none

include                windows.inc
include                kernel32.inc
includelib        kernel32.lib
include                user32.inc
includelib        user32.lib

                .code
start:
                invoke        ExitProcess,NULL
                end        start
V7里边的错误:
(你给的库比V7的文件小了不少,用你的库和原来的库错误都一样,如下:)
Assembling: Test.asm
C:\Masm32\Include\user32.inc(12) : error A2008: syntax error : PROTO
C:\Masm32\Include\user32.inc(14) : error A2008: syntax error : PROTO
NMAKE : fatal error U1077: 'ml' : return code '0x1'
Stop.
V10(最新版)的错误:
(你给的库和最新版的大小一样,文件比较了一下,有几个位置不一样,但报错一样,如下)
Test.obj : error LNK2001: unresolved external symbol __imp__CancelDeviceWakeupRE
QUest@4
Test.obj : error LNK2001: unresolved external symbol __imp__QueryPerformanceFrEQ
Uency@4
Test.obj : error LNK2001: unresolved external symbol __imp__REQUestDeviceWakeup@
4
Test.obj : error LNK2001: unresolved external symbol __imp__REQUestWakeupLatency
@4
Test.obj : error LNK2001: unresolved external symbol __imp__GetClipboardSEQUence
Number@0
Test.exe : fatal error LNK1120: 5 unresolved externals
NMAKE : fatal error U1077: 'Link' : return code '0x460'
Stop.
奇怪了

或者直接告诉我怎么把exe尽量缩小也行,呵呵,反正我的目的是缩小文件。
2010-8-19 14:34
0
雪    币: 452
活跃值: (72)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
19
至于user32的问题,是我疏忽了
把第12行到第14行改成:

IFNDEF pr1C
pr1C TYPEDEF PROTO C :DWORD,:VARARG
ENDIF
EXTERN _imp__wsprintfA : PTR pr1C
wsprintf EQU <_imp__wsprintfA>
EXTERN _imp__wsprintfW : PTR pr1C
wsprintfW EQU <_imp__wsprintfW>

这样user32应该就不会出错了

lnk2001,是因为头文件和库文件的版本不一致
这样吧,你把你的user32.inc和kernel32.inc发上来,我帮你转换一下
2010-8-19 16:18
0
雪    币: 87
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
两个版本都给你看看,呵呵
我暂时看不大懂,等我这个事情完了找点资料看看。
我的拿来主义太严重了
上传的附件:
2010-8-19 16:47
0
雪    币: 452
活跃值: (72)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
21
试试这个呢,应该可以了
上传的附件:
2010-8-19 20:23
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
实在不行,
就用db啊
比如你原指令为
call 401060
然后
401060:jmp user32.messageA
那么你把call改为二进制代码
call的 二进制为什么?我忘记了,
假设call xxxxx=e8 xx xx xx
你就把call xxxx
改为
dd xx xx xx e8就可以了。
2010-8-20 09:43
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
试试下面的可以不

db 0e8h;call的二进制
dd user32.messageA;引用导入表中的user32.messageA的地址
2010-8-20 09:58
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
上传的附件:
2010-8-20 10:19
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
.386
.model flat, stdcall
option casemap:none
;**************头文件和导入库文件****************************
include                windows.inc
include                user32.inc
include                kernel32.inc
includelib         user32.lib
includelib         kernel32.lib
.code
s:
         ;call MessageBoxA
         db 0e8h
         dd MessageBoxA
         end s
2010-8-20 10:22
0
游客
登录 | 注册 方可回帖
返回
//