首页
论坛
课程
招聘
[原创]使用TASM编译COFF格式和连接
2006-1-11 18:06 7337

[原创]使用TASM编译COFF格式和连接

2006-1-11 18:06
7337
看到网络上流传的一份Drocon的mercury的代码
程序源码使用TASM32编译使用MASM32来连接...关键的地方就在这里
为什么要使用TASM编译。。。正常情况下TASM连接出来的程序代码体积
远远大于MASM32连接出来的。。

其实具体看一下就不难发现.TASM编译出来的obj体积很小,连接出来以后体积增
加了,既然编译器原理差不多为什么不可以这样使用(我是以FASM来对比的)
使用MASM32编译出来的OBJ体积和连接出来后的程序没有什么区别.
即使你编译一个MessageBox的程序还是会生成一个1.9k的obj,相对来说TASM体积
就小巧多了.....

回头来说说mercury吧
先说说大概的代码情况,首先他是TASM32编译的源代码(编译成*.obj)然后用
MASM32的link(连接器)来连接EXE的.(看他的make.bat就知道了)连接库路径是
TASM的。。所以有的人就用。tasm5plus里面的implib.exe来生成lib,但是发现
还是不能编译...

这里翻翻MASM32的link说明就知道。link.exe只能连接COFF格式的obj,TASM32编
译出来的obj是OMF格式的,想要让link可以正常连接只有让TASM32编译出COFF格
式的obj,.

如何做到?一些汇编语言编译器自带的例程中都有教如何编译COFF格式的例子。
暂时我只看到FASM有这个 ,好了下面说说如何编译吧

首先看看他的代码(drocon删除了几段代码--这里鄙视他一下!!!),首先参数
传递方式和COFF的导入表调用方式..举个例子MessageBoxA的导入表正常就是
MessageBoxA.等,但是用记事本打开文件看看你就会发现他的格式
是"__imp__MessageBoxA@16"这样的格式(大多数都是这样的)于是我们就写个宏
前面添加__imp__就可以了,drocon的代码中也有不过他删除了。。
其实如何发现是使用__imp__MessageBoxA@16
打开VC写个MessageBox的程序
调试->反汇编:就而已看到了
编译的时候到把代码入口点定位在Start上
下面写个简单的例子
callw	macro   x
	extern  C _imp__&x:DWORD
	call _imp__&x
endm

.586
.model flat

public C Start

.code

  Start:
  	push 0
  	push 0
  	push 0
  	push 0
  	callw MessageBoxA
   RET

end Start


bin\tasm32 /mx /m4 /z MsgBox.asm
bin\link /subsystem:windows lib\kernel32.lib lib\user32.lib /ignore:4033,4078  /nologo /entry:Start /FILEALIGN:0x200 
/MERGE:.data=.text /MERGE:.rdata=.text /SECTION:.text,RWX MsgBox.obj
Del MsgBox.obj
pause


编译小程序不会发现什么特别的地方但是编译一个稍微大一点的程序就可以发现了,mercury代码13k但是编译出来以后只有3.5k(不加壳)
如果API函数全部采用内存搜索的话(和写病毒差不多),编译后体积2k(不加壳)

怎么说好呢~..TASM的编译器优秀?MASM连接器优秀?
许多资料可以从29A的一些电子杂志中找到....

Delphi编译出来的OBJ也可以使用此方法~采用MASM来连接
小弟技术菜只能做到640字节的 MessageBox程序

2022 KCTF春季赛【最佳人气奖】火热评选中!快来投票吧~

收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 1613
活跃值: 活跃值 (33)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 活跃值 25 2006-1-11 18:19
2
0
支持下
雪    币: 214
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
E=mc^2 活跃值 2006-1-12 12:02
3
0
学习了
雪    币: 201
活跃值: 活跃值 (34)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 活跃值 1 2006-1-12 14:09
4
0
最初由 Anskya 发布
小弟技术菜只能做到640字节的 MessageBox程序


我自己DIY的204字节MessageBox+HelloWorld程序.
附件:hello204.rar
雪    币: 1120
活跃值: 活跃值 (262)
能力值: ( LV13,RANK:810 )
在线值:
发帖
回帖
粉丝
Anskya 活跃值 20 2006-1-12 14:16
5
0
呵呵~~老大误解我的意思了
我是说编译出来就640字节
不是~DIY后~。。。。。
雪    币: 123
活跃值: 活跃值 (29)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
xzchina 活跃值 1 2006-1-12 17:44
6
0
学习了,大小的问题实在是没有注意过,试试...
雪    币: 201
活跃值: 活跃值 (34)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 活跃值 1 2006-1-12 18:23
7
0
最初由 Anskya 发布
呵呵~~老大误解我的意思了
我是说编译出来就640字节
不是~DIY后~。。。。。


哦,真的可以编译出不按照512字节对齐的文件吗?
MASM需要加什么参数?
雪    币: 1120
活跃值: 活跃值 (262)
能力值: ( LV13,RANK:810 )
在线值:
发帖
回帖
粉丝
Anskya 活跃值 20 2006-1-14 13:35
8
0
最初由 dwing 发布


哦,真的可以编译出不按照512字节对齐的文件吗?
MASM需要加什么参数?


可以!
bin\tasm32 /mx /m4 /z a.asm

bin\link /ALIGN:32 /FORCE:UNRESOLVED /subsystem:windows lib\kernel32.lib lib\user32.lib /ignore:4033,4078  /nologo 
/entry:Start /FILEALIGN:0x200 /MERGE:.data=.text /MERGE:.rdata=.text 
/SECTION:.text,RWX a.obj

Del a.obj
pause

加参数:/ALIGN:32 /FORCE:UNRESOLVED
就可以了~原代码可以编译出604字节的EXE
(忘记在那个代码里看到的了~感谢那个被人们遗忘的Hero~)

不过这样编译以后加壳就会出问题了~估计是加壳软件无法修改这种对齐方式了
雪    币: 201
活跃值: 活跃值 (34)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 活跃值 1 2006-1-15 10:20
9
0
最初由 Anskya 发布
加参数:/ALIGN:32 /FORCE:UNRESOLVED

align设置为32可能会有兼容性问题,如Win9x中可能无法运行.WinXP的兼容性就比较好了(因为要合并Win2000和Win9x/ME).
雪    币: 302
活跃值: 活跃值 (45)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
HSQ 活跃值 8 2006-1-16 20:07
10
0
原来从未想到这样编译,有收获。。。
游客
登录 | 注册 方可回帖
返回