首页
社区
课程
招聘
[转帖]从一个程序中生成另一个程序(资源法)
发表于: 2007-10-2 09:16 4862

[转帖]从一个程序中生成另一个程序(资源法)

2007-10-2 09:16
4862
前不久大家都在讨论怎样通过一个程序来生成另一个程序,我提出了将另一个程序当资源文件包含在程序中一起编译,然后在程序运行时根据需要再重新生成出来,下面是我的一个例子, 在这里,我将windows自带的写字板(writer.exe)当资源.

下面是源代码

//资源文件writer.exe长度为204800,在资源文件中定义为"CUSTOM"资源,编号为1111

  HRSRC   hMyRes;     //resource handle
  HGLOBAL   hgpt;       //resource pointer
  LPVOID    lpBuff;     //resource buffer pointer
  DWORD     rcSize=204800;    //resource size
  HANDLE    hFile;//file to write
  LPDWORD  dwByte;//byte size had been write
  dwByte=&rcSize; //locate the resource and load the resource to memory and lock it
  hMyRes=FindResource((HMODULE)GetWindowLong(Handle,GWL_HINSTANCE),MAKEINTRE SOURCE(1111),"CUSTOM");
  if(hMyRes==NULL)
    ShowMessage(SysErrorMessage(GetLastError()));
  hgpt=LoadResource(NULL,hMyRes);
  if(hgpt==NULL)
    ShowMessage(SysErrorMessage(GetLastError()));
  lpBuff=LockResource(hgpt);

//now i will read the resource and write it to an file

  try
    {
    hFile=CreateFile("e:\\mywriter.exe",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    WriteFile(hFile,lpBuff,rcSize,dwByte,NULL);
    if(*dwByte!=204800)
      ShowMessage("Failed to write to file");
    }
   __finally
    {
    CloseHandle(hFile);
    }

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 200
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个太落后了吧``远控程序生成客户端都能够自定义图标什么的...
2007-10-2 10:13
0
雪    币: 332
活跃值: (30)
能力值: ( LV12,RANK:460 )
在线值:
发帖
回帖
粉丝
3
未经楼组同意在此发布一个汇编版的源代码:
;MASMPlus 代码模板 - 以对话框做为主窗口的程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming >
; by 罗云彬, http://asm.yeah.net
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Test.asm
; 编程环境测试代码
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff Test.asm
; rc Test.rc
; Link /subsystem:windows Test.obj Test.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .386
                .model flat,stdcall
                option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
                .const
EXEFILE                equ        10000
ID_MYRES        equ        10
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .data
szCaption        db        '恭喜',0
szText                db        '当您看到这个信息的时候,已经导出资源中的EXE文件了!',0
szOutFile        db        'myfile.exe',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .data?
hInstance        dd        ?
hRes                dd        ?
dwSize                dd        ?
lpRes                dd        ?
h_File                dd        ?
dwWritten        dd        ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .code
start:
        invoke GetModuleHandle,NULL
        mov                hInstance,eax

invoke FindResource,hInstance,ID_MYRES,EXEFILE
.if eax
  mov hRes,eax
  invoke SizeofResource,hInstance,eax;获得资源大小
  mov dwSize,eax
  invoke LoadResource,hInstance,hRes
  .if eax
    invoke LockResource,eax
    .if eax
       mov lpRes,eax
   invoke   CreateFile,addr szOutFile,GENERIC_WRITE,\
       FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
   mov   h_File,eax
   invoke   WriteFile,h_File,lpRes,dwSize,addr dwWritten,0
   invoke   CloseHandle,h_File
       ;现在lpRes指向资源,dwSize是资源长度,然后只要
       ;把资源内容写入文件就可以了
       ;CreateFile+WriteFile+CloseHandle就可以搞定
    .endif
  .endif
.endif
                invoke        MessageBox,NULL,offset szText,offset szCaption,MB_OK
                invoke        ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                end        start
在资源文件中添加EXE文件的办法:

在程序中生成(exe等)文件(献给新手)     --------------------------------------------------------------------------------
最近研究了一下这个问题
以C++ Builder 6.0为例
首先准备好你想放到程序中的exe文件
然后用C++ Builder新建一个工程
在记事本中输入以下内容
oneexe EXEFILE yourexename
保存为myres.rc
project- >Add to Project 中,加入写好的 myres.rc 文件
在程序的窗体上添加一个按纽
在Click事件中写入下面的代码
TResourceStream *myres;

myres = new TResourceStream(int(HInstance), AnsiString("oneexe"),"EXEFILE");

myres->SaveToFile("myexe.exe") ;

运行程序,单击按纽,在程序目录下就会产生myexe.exe
(最好把工程,准备的exe文件,myres.rc放在同一目录下)
原理应该是使用自定义资源吧
在MASM或者是C++中可以这么弄:
在资源文件中:
#define EXEFILE 10000
#define ID_MYRES 10
//两个数值随便,只要不和已经定义的冲突就可以了
ID_MYRES EXEFILE "oneexe.exe"//你的文件名
如果是MASM,在汇编代码中:
EXEFILE EQU 10000
ID_MYRES EQU 10
VC++也类似,各位自己去做吧
2007-10-2 11:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
有点晕了,谢谢分享,慢慢分析。
2007-10-3 09:18
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
5
汗, 木马病毒也用这点伎俩.

偶一般就是把DLL放到资源中,然后在释放调用的,方便啊
2007-10-3 20:56
0
雪    币: 257
活跃值: (56)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
请问:怎样创造资源?
我一般都写控制台程序。
2007-10-3 22:34
0
游客
登录 | 注册 方可回帖
返回
//