能力值:
( LV9,RANK:170 )
2 楼
可能有些版本,或者打过补丁之后,api的地址不同了!
兼容考虑!
好像没有这个选项吧!
能力值:
( LV2,RANK:10 )
3 楼
手动修改,嘎嘎
能力值:
( LV2,RANK:10 )
4 楼
应该不是,因为jmp的还是立即数地址,messagebox是od给出了的而已。 本来是打算手动改,但比如你一个程序改了之后能达到1K的话,编译的时候因为这些内容导致超过1K了,不好看.
能力值:
( LV9,RANK:170 )
5 楼
哦,楼主可以看看导入表相关的内容!
能力值:
( LV9,RANK:330 )
6 楼
use modified include files
I will post modified user32.inc tomorrow, if I don't forget it
能力值:
( 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
能力值:
( LV9,RANK:170 )
8 楼
那我大概的和你讲讲吧
FF25 08104000 JMP DWORD PTR DS:[<&USER32.MessageBoxA>] ;
因为可能因为平台等各种关系,api的地址可能会有所不同,但是如何保证这个程序在不同的平台上面都可以运行呢,然后这里就用了一个间接地址,这里jmp到那个间接地址,间接地址放的是api的地址,然后每次程序跑之前,操作系统去帮你把这里面填上运行平台上那个api的地址值!
这样明白了吧!
能力值:
( LV2,RANK:10 )
9 楼
嗯,ls真相帝,如果改成原地call了,那就只能硬编码了。
能力值:
( 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
上传的附件:
能力值:
( LV2,RANK:10 )
11 楼
看了一下ls给出的inc文件,都是用的这种形式的:
EXTERN _imp__LoadLibraryA@4 : PTR pr1 LoadLibrary EQU <_imp__LoadLibraryA@4>
确实可以原地call,看来我还是把概念弄混了……
能力值:
( LV2,RANK:10 )
12 楼
call jmp user.messageboxa
得了,
call jmp也不错
一排的jmp很工整
能力值:
( LV9,RANK:170 )
13 楼
嗯,昨晚回去时发现问东答西了,谢谢提醒!
能力值:
( LV2,RANK:10 )
14 楼
lz你还可以直接把vc里的ml.exe link.exe拷过来
能力值:
( 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
能力值:
( LV9,RANK:330 )
16 楼
或许你的MASM版本太旧了?
用这个lib试试
上传的附件:
能力值:
( LV2,RANK:10 )
17 楼
LZ 你可疑看看PE结构 导入导出表 就明白了
能力值:
( 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尽量缩小也行,呵呵,反正我的目的是缩小文件。
能力值:
( 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发上来,我帮你转换一下
能力值:
( LV2,RANK:10 )
20 楼
两个版本都给你看看,呵呵
我暂时看不大懂,等我这个事情完了找点资料看看。
我的拿来主义太严重了
上传的附件:
能力值:
( LV9,RANK:330 )
21 楼
能力值:
( 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就可以了。
能力值:
( LV2,RANK:10 )
23 楼
试试下面的可以不
db 0e8h;call的二进制
dd user32.messageA;引用导入表中的user32.messageA的地址
能力值:
( LV2,RANK:10 )
24 楼
上传的附件:
能力值:
( 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