首页
社区
课程
招聘
[原创]在源代码中插入另一个程序,然后再输出为exe文件(C/C++、Win32Asm)
发表于: 2007-7-9 13:20 18021

[原创]在源代码中插入另一个程序,然后再输出为exe文件(C/C++、Win32Asm)

2007-7-9 13:20
18021
在源代码中插入另一个程序,然后再输出为exe文件(C/C++、Win32Asm)

作者:jhkdiy

主页:http://jhkdiy.icpcn.com

邮件:[email=jhkdiy_gzb@21cn.net]jhkdiy_gzb@21cn.net[/email]

日期:2007-07-09

毕业证拿到了,毕业聚餐也吃了,可是工作却不怎么如意,搞到现在要转行卖东西了···,但不管怎样,编程始终是我的兴趣所在,

所以我希望一直编程下去。

前些天看到有朋友说有没有不必操作资源就可以将一个程序加入到自己的程序中,我刚好想起masm32里有个bintodb.exe可以将一

整个程序转换为byte数组,但是自己也没实际试过,这几天有时间就研究了一下,发现原来操作很简单比起操作资源也来更容易理解,

所以用win32asm做了个示例,同时也在Vc中做了测试,都是一样简单。本来想在VB中也试试的,但发现没那么简单,当我将整个数

组定义为VB格式的数组时VB竟然崩溃了···,可能是因为VB编程环境容不下这么多的数据,因为我定义了一个有2560个字节元素的

字节数组,每当复制到VB代码编辑窗口中的时候就崩溃了,所以我没有在VB中实现,但这并不代表VB一定不能实现,因为可以将这

一个数组分成好几个数组,然后在写文件的时候在一一写入,但考虑到将原本好好的数组自己拆开来就已经很繁琐了,而又要在写文件

的时候重新组合也很麻烦,所以这里就留给VB高手解决了。我宣布投降···

    整个操作过程很简单,打开bintodb程序,然后打开一个你要转换的程序,程序会自动将整个程序转换为字节数组,数组的大小对应

转换程序的文件大小。如下图就是我用来做测试用的程序,已经转换为字节数组格式了:



    我们只要稍微改一下就可以直接加到源代码的数据段中了,事实上只是加个数组名:



    之后的操作就简单了,我们只要创建一个写方式的文件,然后将这个数组作为WriteFile的写

Buffer就可以将这个字节数组还原为exe文件,如下所示:
            ;创建一个写文件,同名文件不提示直接覆盖

            invoke  CreateFile, addr szSaveFileName, GENERIC_WRITE, FILE_SHARE_READ, 0, \

            CREATE_ALWAYS or FILE_ATTRIBUTE_NORMAL \

            or FILE_ATTRIBUTE_SYSTEM, 0

            mov @hFile, eax

            ;真正将数据段的字节定义写为文件

            invoke  WriteFile, @hFile, addr ExeFile, ExeFileLength, addr dwBytesWritten, 0

            ;关闭文件句柄,提示成功写入。

            invoke  CloseHandle, @hFile 
当然,在我做的示例中加入了错误处理,因为毕竟是示例,不是想无声无息地将文件写入到C:\windows\system32

下,然后CreateProcess运行进程。这里确实给病毒制作者开了另一条路,假如我加入的是一个真正有害程序,而这个

程序本身又是一个很正常的程序,用户在完全不知情的情况下就会中招,如病毒加上自删除、远程线程注入、双进程守

护等等。事实上程序可以做任何想做的事。

        VC中的操作也一样简单,只是将汇编格式的定义转换为C/C++类型的定义可能会繁琐一点,其它的操作都是一样的

在示例中我将字节数组作为全局变量,因为考虑到在函数中定义如此大的一个数组在运行时可能会出现堆栈溢出。但实际

情况我没有测试过,有兴趣的朋友可以试试。

请使用下载工具下载,下载时引用页为:http://www.3326.com

源代码下载(win32asm):
         http://jhkdiy.go3.icpcn.com/code/download/InsertExeFile_win32asm.rar      

源代码下载(VC):
         http://jhkdiy.go3.icpcn.com/code/download/InsertExeFileToApp_VC.rar

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (21)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好文~~可否传个BINTODB.EXE上来?
2007-7-9 14:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
bintodb.exe 包含在 MASM 软件包中. 网上可以下载
2007-7-9 16:46
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
太强了
[字数破解补丁~]
2007-7-9 21:24
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
用工具也没法下啊!
直接去作者主页下了,汗!
2007-7-10 10:37
0
雪    币: 2899
活跃值: (1753)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
6
IDM是超强下载工具,没有办法时,请用IDM!!Internet Download Manager---->IDM
2007-7-10 12:41
0
雪    币: 2899
活跃值: (1753)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
7
并且记住这个名字:申志远
呵呵。
2007-7-10 12:45
0
雪    币: 262
活跃值: (56)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
8
我用FlashGet可以下载啊,只要引用页为:http://www.3326.com就可以,唉,免费的空间就是诸多限制了,请原谅!

[QUOTE='wofan[OCN];332983']并且记住这个名字:申志远
呵呵。[/QUOTE]

···兄弟,你怎么知道的???
2007-7-10 12:57
0
雪    币: 196
活跃值: (96)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
char filebuff[4] = {0x4d,0x5a,0x90,0x00}; // MZ , exe前4个字节
HANDLE file;
DWORD bWritten =0;

int main(int argc, char* argv[])
{
	file = CreateFile("aa.exe", 
             GENERIC_WRITE,
             FILE_SHARE_READ,
             0,
             CREATE_ALWAYS,
             FILE_ATTRIBUTE_NORMAL,
             0);

	WriteFile(file, filebuff, sizeof(filebuff), &bWritten, 0);
	printf("%d bytes written\n",bWritten);
	return 0;
}


c++里是这样吧?用UltraEdit读取exe然后把整个exe的十六进制数据复制出来,放到 一个char数组里,然后用writefile写到新文件
2007-7-10 18:57
0
雪    币: 262
活跃值: (56)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
10
嗯,你这也是一种方法,都可以的。
2007-7-10 22:00
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
11
兄弟正解

我用世界之窗浏览器就可下载了
2007-7-11 12:20
0
雪    币: 268
活跃值: (40)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
12
不错啊,又学到东西了,这里总能给我知识 哈
2007-7-11 18:08
0
雪    币: 209
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
麻烦了,直接放自定义资源里面好了
2007-7-12 14:08
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
14
go3.icpcn.com可以上传RAR后辍的文件吗,
不可以吧
2007-7-12 15:52
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
15
学习了...
没用过CreateProcessEx
CreateProcessEx怎么用,注意哪些方面?
2007-7-12 17:32
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
16
我用这个WinExec('xx.exe', SW_SHOW);
2007-7-12 17:36
0
雪    币: 262
活跃值: (56)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
17
真的非常抱歉,函数名应该是CreateProcess,没有Ex后缀的,是我的笔误。
2007-7-13 13:20
0
雪    币: 208
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
呵呵UPX加壳时不是这么做的,现在的加壳软件好像都是这么干的,都是在运行前加入一段代码
2007-7-13 18:33
0
雪    币: 7922
活跃值: (3633)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
几年前用过此方法,VC不太合适,楼主的才2.5KB,编译没问题,如果包含文件大于640KB(一般要包含的文件不会就几KB,少说几十KB),大家可以用VC编译试试,不是卡死,就是报错!
2007-7-14 03:27
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
你那个网址是不是做广告阿???
2007-7-14 11:05
0
雪    币: 262
活跃值: (56)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
21
没有啊,网站空间是免费的,不过主页也没有广告啊!
2007-7-14 14:19
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
22
这个办法隐蔽性强
2007-7-26 17:35
0
游客
登录 | 注册 方可回帖
返回
//