看到网络上流传的一份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上
下面写个简单的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
1
2
3
4
5
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程序

https://bbs.pediy.com/thread-20279.htm

使用TASM编译COFF格式和连接的更多相关文章

  1. (转)Excel的 OleDb 连接串的格式(连接Excel 2003-2013)

    string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;data source=" + filePath + ";Exten ...

  2. C语言真正的编译过程(4个步骤~~预编译,编译,汇编,连接)

    转载自:https://www.cnblogs.com/wuyouxiaocai/p/5701088.html#commentform 说实话,很多人做了很久的C/C++,也用了很多IDE,但是对于可 ...

  3. GCC 预处理,汇编,编译,链接,连接静态库,动态库

    gcc Record gcc -E file1.c > output gcc -E file1.c -o file1.i gcc -S file1.i -o file1.s gcc -S fil ...

  4. 原创 C++应用程序在Windows下的编译、链接:第二部分COFF/PE文件结构

    2.1概述 在windows操作系统下,可执行文件的存储格式是PE格式:在Linux操作系统下,可执行文件的存储格式的WLF格式.它们都是COFF格式文件的变种,都是从COFF格式的文件演化而来的. ...

  5. VS2010安装与测试编译问题(fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt)

    由于第三方库的各种原因,与编译冲突问题,公司又决定把整个项目都统一改用VS2010来编译.所以我把我开发机上的VS2008卸载了,又重新安装了VS2010.无奈出现了COFF格式转换问题.搜索了下.完 ...

  6. C编译: 动态连接库 (.so文件)(转摘)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在“纸上谈兵: 算法与数据结构”中,我在每一篇都会有一个C程序,用于实现算法和数据 ...

  7. C编译: 动态连接库 (.so文件)

    转自:http://www.cnblogs.com/vamei/archive/2013/04/04/2998850.html 在“纸上谈兵: 算法与数据结构”中,我在每一篇都会有一个C程序,用于实现 ...

  8. Windows 编程,程序编译使用的命令行工具。

    Windows 编程,程序编译使用的命令行工具. 1.cl.exe文件是Visual C\C++的编译器,它将程序源代码文件编译为obj文件. 2.rc.exe文件是资源编译器.工程项目中的.rc文件 ...

  9. GCC编译器原理(二)------编译原理一:ELF文件(2)

    四. ELF 文件格式分析 ELF文件(目标文件)格式主要四种: 可重定向文件: 文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件.(目标文件或者静态库文 ...

随机推荐

  1. nginx进程属主问题讨论

    文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/6107096.html 转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点,如 ...

  2. xml和数组互转

    /** * 输出xml字符 * @param $params 参数名称 * return string 返回组装的xml **/ public function data_to_xml( $param ...

  3. Spring Boot 集成spring security4

    项目GitHub地址 : https://github.com/FrameReserve/TrainingBoot Spring Boot (三)集成spring security,标记地址: htt ...

  4. R语言入门视频笔记--3--列表list

    list <- (stud.id = 1234,stud.name="Tom",stud,marks=c(18,3,14,25,19)) #生成一个列表,里面有学生id,学生 ...

  5. codevs——1049 棋盘染色

    1049 棋盘染色  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 有一个5×5的棋盘,上面有一 ...

  6. 【paddle学习】词向量

    http://spaces.ac.cn/archives/4122/   关于词向量讲的很好 上边的形式表明,这是一个以2x6的one hot矩阵的为输入.中间层节点数为3的全连接神经网络层,但你看右 ...

  7. 转:Twemproxy——针对MemCached与Redis的代理

    转自: http://www.infoq.com/cn/news/2012/12/twemproxy Twemproxy是一个代理服务器,可以通过它减少Memcached或Redis服务器所打开的连接 ...

  8. 谷歌訪问之直接输入ip地址

    废话啥说.直接上IP: 173.194.121.51 173.194.43.19 173.194.65.147 74.125.235.148

  9. Version和Build的差别

    [1]概念 iOS的版本号号.一个叫做Version,一个叫做Build,这两个值都能够在Xcode 中选中target,点击"Summary"后看到. Version在plist ...

  10. (转) SYSTEM_HANDLE_INFORMATION中ObjectTypeIndex的定义

    typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO{ USHORT UniqueProcessId; USHORT CreatorBackTraceIndex ...