使用TASM编译COFF格式和连接
看到网络上流传的一份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__&xendm.586.model flatpublic C Start.code Start: push 0 push 0 push 0 push 0 callw MessageBoxA RETend Start |
|
1
2
3
4
5
|
bin\tasm32 /mx /m4 /z MsgBox.asmbin\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.objDel MsgBox.objpause |
编译小程序不会发现什么特别的地方但是编译一个稍微大一点的程序就可以发现了,mercury代码13k但是编译出来以后只有3.5k(不加壳)
如果API函数全部采用内存搜索的话(和写病毒差不多),编译后体积2k(不加壳)
怎么说好呢~..TASM的编译器优秀?MASM连接器优秀?
许多资料可以从29A的一些电子杂志中找到....
Delphi编译出来的OBJ也可以使用此方法~采用MASM来连接
小弟技术菜只能做到640字节的 MessageBox程序
https://bbs.pediy.com/thread-20279.htm
使用TASM编译COFF格式和连接的更多相关文章
- (转)Excel的 OleDb 连接串的格式(连接Excel 2003-2013)
string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;data source=" + filePath + ";Exten ...
- C语言真正的编译过程(4个步骤~~预编译,编译,汇编,连接)
转载自:https://www.cnblogs.com/wuyouxiaocai/p/5701088.html#commentform 说实话,很多人做了很久的C/C++,也用了很多IDE,但是对于可 ...
- 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 ...
- 原创 C++应用程序在Windows下的编译、链接:第二部分COFF/PE文件结构
2.1概述 在windows操作系统下,可执行文件的存储格式是PE格式:在Linux操作系统下,可执行文件的存储格式的WLF格式.它们都是COFF格式文件的变种,都是从COFF格式的文件演化而来的. ...
- VS2010安装与测试编译问题(fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt)
由于第三方库的各种原因,与编译冲突问题,公司又决定把整个项目都统一改用VS2010来编译.所以我把我开发机上的VS2008卸载了,又重新安装了VS2010.无奈出现了COFF格式转换问题.搜索了下.完 ...
- C编译: 动态连接库 (.so文件)(转摘)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在“纸上谈兵: 算法与数据结构”中,我在每一篇都会有一个C程序,用于实现算法和数据 ...
- C编译: 动态连接库 (.so文件)
转自:http://www.cnblogs.com/vamei/archive/2013/04/04/2998850.html 在“纸上谈兵: 算法与数据结构”中,我在每一篇都会有一个C程序,用于实现 ...
- Windows 编程,程序编译使用的命令行工具。
Windows 编程,程序编译使用的命令行工具. 1.cl.exe文件是Visual C\C++的编译器,它将程序源代码文件编译为obj文件. 2.rc.exe文件是资源编译器.工程项目中的.rc文件 ...
- GCC编译器原理(二)------编译原理一:ELF文件(2)
四. ELF 文件格式分析 ELF文件(目标文件)格式主要四种: 可重定向文件: 文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件.(目标文件或者静态库文 ...
随机推荐
- [BZOJ2393] Cirno的完美算数教室(dfs+容斥原理)
传送门 先通过dfs预处理出来所有只有2和9的数,也就大概2000多个. 想在[L,R]中找到是这些数的倍数的数,可以通过容斥原理 那么如果a % b == 0,那么便可以把 a 去掉,因为 b 的倍 ...
- KS求有向图强连通分量模板
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m; ; *maxn; struct no ...
- bzoj2286 (sdoi2011)消耗战(虚树)
[Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4052 Solved: 1463[Submit][Status][Dis ...
- EC++学习笔记(四) 设计与声明
条款18:让接口容易被正确使用,不易被误用 必须考虑客户可能做出什么样的错误(防御式编程)std:shared_ptr会自动使用它的"每个指针专属的删除器",消除了"cr ...
- BZOJ [P2124] 等差子序列
线段树维护哈希值 要求出现长度大于三的等差子序列,我们只要找到长度等于三的就可以了 初看本题没有思路,只能暴力枚举,O(n^4) 后来发现,这个序列是n的一个排列,那么每个数字都只会出现一次 我们可以 ...
- 集合 Properties 的 简单例子(Spring)
Java代码: package com.ioc; import java.util.Properties; public class Student { private String name; pr ...
- COdevs 2823 锁妖塔
2823 锁妖塔 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 琐妖塔会在一会儿后倒塌.大量妖魔涌出塔去,塔内的楼梯都挤满了人(哦 ...
- 【Codevs1227】方格取数2(费用流)
题意:给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000) 现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成 ...
- Objective-C NSString的常用用法
//1.创建常量字符串. NSString *astring = @"This is a String!"; //2.创建空字符串,给予赋值. NSString *astrin ...
- golang测试框架--smartystreets/goconvey
视频教程和配套博客:goconvey - 课时 1:优雅的单元测试 Go 语言虽然自带单元测试功能,在 GoConvey 诞生之前也出现了许多第三方辅助库.但没有一个辅助库能够像 GoConvey 这 ...