看到网络上流传的一份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日志常用的命令总结

    1. 利用grep ,wc命令统计某个请求或字符串出现的次数 比如统计GET /app/kevinContent接口在某天的调用次数,则可以使用如下命令: cat /usr/local/nginx/l ...

  2. LINUX远程强制重启/proc/sys/kernel/sysrq /proc/sysrq-trigger

    1.     # echo 1 > /proc/sys/kernel/sysrq 2.     # echo b > /proc/sysrq-trigger 1. /proc/sys/ke ...

  3. 刷题总结——选课(ssoj树形dp+记忆化搜索+多叉树转二叉树)

    题目: 题目描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了 N(N<300)门的选修课程,每个学生可选课程的数量 M 是给定的.学生选修了这M门课 ...

  4. 刷题总结——拦截导弹(ssoj)

    题目: 题目背景 NOIP1999 提高组试题 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都 ...

  5. noip2017爆炸记——题解&总结&反省(普及组+提高组)

    相关链接: noip2018总结 noip2017是我见过的有史以来最坑爹的一场考试了. 今年北京市考点有一个是我们学校,我还恰好被分到了自己学校(还是自己天天上课的那个教室),于是我同时报了普及提高 ...

  6. mongo安装-docker

    拉取官方镜像(可以自己使用dockerFile构建): docker search mongo //查询Docker Hub 上的mongo镜像 docker pull mongo // 拉取官方镜像 ...

  7. Codeforces 713D Animals and Puzzle(二维ST表+二分答案)

    题目链接 Animals and Puzzle 题意  给出一个1e3 * 1e3的01矩阵,给出t个询问,每个询问形如x1,y1,x2,y2 你需要回答在以$(x1, y1)$为左上角,$(x1, ...

  8. 多个ajax执行混乱问题

    多个ajax执行混乱问题,之前拿ajax取代iframe做响应布局(左侧点击,右侧展示),当执行多个点击事件时会造成一个页面的初始化触发另一个页面的on click的function, 将ajax调为 ...

  9. codevs——2693 上学路线(施工)

    2693 上学路线(施工)  时间限制: 2 s  空间限制: 16000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 问题描述 你所在的城市街道好像一个 ...

  10. 大整数类BIGN的设计与实现 C++高精度模板

    首先感谢刘汝佳所著的<算法竞赛入门经典>. 众所周知,C++中储存能力最大的unsigned long long 也是有着一个上限,如果我们想计算非常大的整数时,就不知所措了,所以,我写了 ...