首页
社区
课程
招聘
[原创]使用TASM编译COFF格式和连接
发表于: 2006-1-11 18:06 9209

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

2006-1-11 18:06
9209

看到网络上流传的一份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

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 7
支持
分享
最新回复 (9)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
2
支持下
2006-1-11 18:19
0
雪    币: 214
活跃值: (230)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习了
2006-1-12 12:02
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
最初由 Anskya 发布
小弟技术菜只能做到640字节的 MessageBox程序


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


哦,真的可以编译出不按照512字节对齐的文件吗?
MASM需要加什么参数?
2006-1-12 18:23
0
雪    币: 1272
活跃值: (746)
能力值: ( LV13,RANK:810 )
在线值:
发帖
回帖
粉丝
8
最初由 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~)

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

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