【精品贴】在内存中运行已编译资源EXE文件。(您会吗?) (0分)

  • 主题发起人 主题发起人 wjp888
  • 开始时间 开始时间
像王寒松、左轻候等大侠级人太少了!
 
你不就是一个吗? 怎么还往别处找
 
to lich:
您别抬举我,我现在只研究出:
内存映射文件的使用可以分为以下4步:
1.CreateFileMapping // 创建一个文件映射内核对象
2.MapViewOfFile // 将文件数据映射进进程地址空间
3.怎么运行(击活)映射文件 // 我不知道用什么函数,用WinExec()肯定不行
4.UnmapViewOfFile // 从进程地址空间解除这个映射
 
补充一点:如上述条件,使用createRemoteThread可实现.
另请问各位谁知道如何把qreport的预览结果保存为BMP文件? 似乎也是没人能懂...
 
to dazzling:
用createRemoteThread()后,能像WinExec()运行磁盘文件一样运行映射文件吗?
 
看到一片不知真假。你试一试
步骤1:首先在你的进程中创建函数MyFunc,我们将把它放在另一个进程中运行,这里以windows
计算器为目标进程。
static DWORD WINAPI MyFunc (LPVOID pData)
{
//do something
//...
//pData输入项可以是任何类型值
//这里我们会传入一个DWORD的值做示例,并且简单返回
return *(DWORD*)pData;
}
static void AfterMyFunc (void) {
}
这里有个小技巧,定义了一个static void AfterMyFunc (void);为了下面确定我们的代码大小
步骤2:定位目标进程,这里是一个计算器
HWND hStart = ::FindWindow (TEXT("SciCalc"),NULL);

步骤3:获得目标进程句柄,这里用到两个不太常用的函数(当然如果经常做线程/进程等方面的 项目的话,就很面熟了),但及有用
DWORD PID, TID;
TID = ::GetWindowThreadProcessId (hStart, &PID);
HANDLE hProcess;
hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,PID);

步骤4:在目标进程中配变量地址空间,这里我们分配10个字节,并且设定为可以读
写PAGE_READWRITE,当然也可设为只读等其它标志,这里就不一一说明了。
char szBuffer[10];
*(DWORD*)szBuffer=1000;//for test
void *pDataRemote =(char*) VirtualAllocEx( hProcess, 0, sizeof(szBuffer), MEM_COMMIT,
PAGE_READWRITE );
步骤5:写内容到目标进程中分配的变量空间
::WriteProcessMemory( hProcess, pDataRemote, szBuffer,(sizeof(szBuffer),NULL);
步骤6:在目标进程中分配代码地址空间
计算代码大小
DWORD cbCodeSize=((LPBYTE) AfterMyFunc - (LPBYTE) MyFunc);
分配代码地址空间
PDWORD pCodeRemote = (PDWORD) VirtualAllocEx( hProcess, 0, cbCodeSize, MEM_COMMIT,
PAGE_EXECUTE_READWRITE );
步骤7:写内容到目标进程中分配的代码地址空间
WriteProcessMemory( hProcess, pCodeRemote, &MyFunc, cbCodeSize, NULL);
步骤8:在目标进程中执行代码
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE) pCodeRemote,
pDataRemote, 0 , NULL);
DWORD h;
if (hThread)
{
::WaitForSingleObject( hThread, INFINITE );
::GetExitCodeThread( hThread, &h );
TRACE("run and return %d/n",h);
::CloseHandle( hThread );
}
这里有几个值得说明的地方:
使用WaitForSingleObject等待线程结束;
使用GetExitCodeThread获得返回值;
最后关闭句柄CloseHandle。
步骤9:清理现场
释放空间
::VirtualFreeEx( hProcess, pCodeRemote,
cbCodeSize,MEM_RELEASE );
::VirtualFreeEx( hProcess, pDataRemote,
cbParamSize,MEM_RELEASE );
关闭进程句柄
::CloseHandle( hProcess );
 
想看delphi的例子。
 
那位高人用Delphi做过,请来谈谈...
 
技术方案(初步设想,模拟操作系统创建进程的过程):
分配虚拟内存,将程序中的各个段放入内存,
进行重定位,修改各个段的虚拟内存的属性,
代码段修改为可读,可执行,
数据段修改为可读可写,
只读数据段修改为只读,
最后,创建一个线程指向程序的代码入口
可以研究一下upx将各个数据段的内容解压缩出来,
并设置其属性的过程,
研究一下pe文件的结构会有很大帮助,
最后,调试操作系统,研究CreateProcess系统函数的工作过程
后来,写一本书,介绍一下,肯定能卖不少的钱
 
to lich:
 把您想的方案,请用Delphi代码实现出来,不知您实现了没有?
 
我如果会的话,早写出来了,
我只是提供一种方法和思路,
upx中有相关的代码,
还有实现API,HOOK的Delphi中也有类似的代码
他们需要修改虚拟程序,代码段的属性,
网上有一些源码,
关于pe的结构的文档,网上很多的
想想看,如果什么都是现成的,那多没意思啊
我也不用辛辛苦苦写程序养家糊口了
 
看样也没人做过,不过思想
 
wjp888:你是不是王江鹏?
 
不用张口就代码,毕竟不是所以的东西都是现成的
 
来自:dazzling, 时间:2004-4-5 11:08:04, ID:2540582
wjp888:你是不是王江鹏?
对不起!我不是
 
除源码空间外,upx的源码在那里能下载?
 
谁知道createRemoteThread函数的详细用法,主要是参数说明。
 
请好心人把下面的UPX1.9源代码发到的邮箱里:wjp8@163.com,我将不胜感激!
http://www.playicq.com/dispdocnew.php?id=14089
 
请好心人把下面的UPX1.9源代码发到的邮箱里:wjp8@163.com,我将不胜感激!
http://www.playicq.com/dispdocnew.php?id=14089
我想研究此代码,看能不能改成delphi的。
 
请好心人把下面的UPX1.9源代码发到的邮箱里:wjp8@163.com,我将不胜感激!
http://www.playicq.com/dispdocnew.php?id=14089
我想研究此代码,看能不能改成delphi的。
或者粘贴到这也行!

 
后退
顶部