如何写一个简单的无窗体无进程,插入DLL到进程的DELPHI程序??

DLL已经写好,5K左右

要写一个程序,包含这个这个DLL,运行后无窗体无进程,并把这个DLL生成出来,并插入到一个进程中(例如:smss.exe)
要DELPHI代码~~~~
请高手指教~~~ 不是写病毒之类的

即便是delphi,也是调用api实现功能,你可以参考下面的c代码,写出delphi的功能来

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
MEMORY_BASIC_INFORMATION mbi;
PBYTE ptr = NULL;
DWORD dwBytesReturn = sizeof(MEMORY_BASIC_INFORMATION);

char szBuffer[256*100] = "";
char szModuFile[240] = "";
char szThis[256] = "";
char szProcess[256] = "";
char szTmpBuffer[256] = "";

GetModuleFileName((HINSTANCE)hModule, szThis, 256);
GetModuleFileName(GetModuleHandle(NULL), szProcess,256);

while( dwBytesReturn == sizeof(MEMORY_BASIC_INFORMATION) )
{
dwBytesReturn = VirtualQuery( ptr,&mbi,sizeof(MEMORY_BASIC_INFORMATION) );

if( mbi.Type == MEM_FREE )
{
mbi.AllocationBase = mbi.BaseAddress;
}

GetModuleFileName( (HINSTANCE)mbi.AllocationBase, szModuFile,240 );

sprintf(szTmpBuffer,"\t[ Module: 0x%x - %s ] \r\n",mbi.AllocationBase,szModuFile);

if(mbi.AllocationBase == mbi.BaseAddress &&
mbi.AllocationBase != NULL &&
strcmp(szThis,szModuFile) !=0 &&
strcmp(szProcess,szModuFile) != 0 )strcat(szBuffer , szTmpBuffer);

ptr += mbi.RegionSize;

}
}
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

编译生成ImageWalk.dll

这个函数用来列举系统的进程(为了简化,生成一个字符串)
void EnumProcess(char * szBuffer)//由你提供的字符串缓冲区,此处为了简化,假定这一缓冲区足够大
{
char szCurrentProcessInfo[512] = "" ;
char szExeName[256] = "" ;
char szAllProcessInfo[512*256] = "" ;
HANDLE hCurrentProcess = NULL ;
HMODULE hCurrentModule = NULL ;

HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPALL , 0 );
PROCESSENTRY32 ppe;

ppe.dwSize = sizeof(ppe);

Process32First(hSnapshot,&ppe);

hCurrentProcess = OpenProcess( PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_VM_READ|PROCESS_VM_OPERATION , FALSE, ppe.th32ProcessID);

GetModuleFileName( hCurrentModule , szExeName , 256 );

sprintf(szCurrentProcessInfo,"[ExeFileName:%s; Process ID:0x%x(%d); Thread Count:%d; Usage:%d]\r\n",
ppe.szExeFile, ppe.th32ProcessID ,ppe.th32ProcessID , ppe.cntThreads, ppe.cntUsage);

strcat(szAllProcessInfo,szCurrentProcessInfo);

while( Process32Next(hSnapshot , &ppe) )
{
hCurrentProcess = OpenProcess( PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_VM_READ|PROCESS_VM_OPERATION, FALSE, ppe.th32ProcessID);

GetModuleFileName( (HINSTANCE)hCurrentProcess , szExeName , 256 );

sprintf(szCurrentProcessInfo,"[ExeFileName:%s; Process ID:0x%x(%d); Thread Count:%d; Usage:%d]\r\n",
ppe.szExeFile , ppe.th32ProcessID ,ppe.th32ProcessID, ppe.cntThreads, ppe.cntUsage );

strcat(szAllProcessInfo,szCurrentProcessInfo);
}

CloseHandle(hSnapshot);
hSnapshot = NULL;
strcpy(szBuffer,szAllProcessInfo);
}

//这个函数将ImageWalk.dll插入指定的线程,为了简化,假定ImageWalk.dll就在d:\
void InjectDll(DWORD m_ProcessID, char * szBuffer)//通过上面的EnumProcess可以获得Process ID
{//szBuffer,储存了被插入线程加载Dll的信息(不会出现ImageWalk.dll)为了简化,假定其足够大
char szTmp[256] = "";
size_t bytesread = 0;

HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,m_ProcessID);//打开进程,获取进程Handle
PSTR pszLibName = (PSTR)VirtualAllocEx(hProcess,NULL,64,MEM_COMMIT,PAGE_READWRITE);
//我们要在远程进程中运行一个新的线程,所传入的参数的内容必须放入远程进程的地址空间,
//使用VirtualAllocEx分配远程进程的内存
WriteProcessMemory(hProcess,pszLibName,(PVOID)"D:\\ImageWalk.dll",17,NULL);
//将参数写入刚才分配好的空间

PTHREAD_START_ROUTINE pfnLoadLib = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
//获取LoadLibraryA在内村中的地址

if(pfnLoadLib && hProcess)
{
HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,pfnLoadLib,pszLibName,0,NULL);
//创建一个线程,让远程进程执行 LoadLibraryA("D:\\ImageWalk.dll")
//注意pfnLoadLib不能换成LoadLibraryA
WaitForSingleObject(hThread,INFINITE);
//等待线程结束

HANDLE hDll;

GetExitCodeThread(hThread, (DWORD*)&hDll);//获取LoadLibraryA("d:\\imagewalk.dll")所返回的hModule

CloseHandle(hThread);

pfnLoadLib = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"),"FreeLibrary");

FILE * fp;
while( (fp = fopen("d:\\image.txt","rt") ) == NULL)
{
Sleep(50);
}//等待ImageWalk.dll将信息写入交换文件

while( !feof(fp) )
{
bytesread=fread(szTmp,1,255,fp);
szTmp[bytesread] = '\0';
strcat(szBuffer,szTmp);

}

fclose(fp);

if(pfnLoadLib)
{//将ImageWalk卸载

hThread = CreateRemoteThread(hProcess,NULL,0,pfnLoadLib,hDll,0,NULL);
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
}

}

VirtualFreeEx(hProcess,pszLibName,0,MEM_RELEASE);//释放刚才分配的远程进程的内存
CloseHandle(hProcess);
}
温馨提示:内容为网友见解,仅供参考
无其他回答

如何写一个简单的无窗体无进程,插入DLL到进程的DELPHI程序??
\/\/这个函数将ImageWalk.dll插入指定的线程,为了简化,假定ImageWalk.dll就在d:\\ void InjectDll(DWORD m_ProcessID, char * szBuffer)\/\/通过上面的EnumProcess可以获得Process ID {\/\/szBuffer,储存了被插入线程加载Dll的信息(不会出现ImageWalk.dll)为了简化,假定其足够大 char szTmp[256] = ""...

求教在delphi中如何把一个exe做为res加入到dll中并在运行时生成exe文件...
先说那个怎么把EXE做成.res,举个例子也就是把1.exe文件加到2.exe里。然后2.exe运行的时候,按你说的判断这个1.exe是否在运行,是否存在,不存在就释放,没运行就运行。(你应该是这个意思吧?)你在编译2.exe的时候,在你源码的目录下新建建一个txt文件,里面写:CrnExeFile RC_DATA 1....

...的不依赖.Net运行环境的可执行程序。类似Delphi生成的EXE文件。要 ...
飞信安装目录下有个文件夹VMDotNet,就是所谓的虚拟机了,进去,找到FetionVM.exe,这个就是虚拟机的主程序。由于飞信是用C#2.0编写的,所以C#2.0编写的程序可以直接使用这个虚拟机脱离框架运行而不用做任何额外的工作。方法是用FetionVM.exe运行要运行的程序。有条件可以这样试验一下虚拟机的作用:把VMDo...

delphi编程序如何注入其它程序?
dll注入( 钩子注入 , 远程线程注入)shellcode直接注入 (远程线程注入)还有通过explorer的ShellExecuteHooks注入 QueueUserAPC 注入 方法多的一塌糊涂,我也不好一一列举 给你个简单的远程线程注入dll的代码 procedure InjectDllToProcess(hProcess:DWORD;lpDllName:PCHar);var dwWritten : DWORD;dwThread...

delphi创建一个进程并返回进程的PID
首先,利用WIN API函数 Createpipe 建立两个管道(Pipe),然后建立利用CreateProcess函数创建一个控制台程序的进程(这里使用的是Win2000的Dos控制台 cmd.exe),并且在StartUpInfo参数中指定用刚才建立的三个管道替换标准的输入hStdOutput、输出hStdInput以及错误输出设备hStdError。代码如下:procedure TForm1....

Delphi注入进程代码
可以注入的, 只要先找到进程的句柄,注意OpenProcess时的权限,然后用VirtualAllocEx 远程分配内存保存代码块, 再用CreateRemoteThread 建远程执行并WaitForSingleObject等待运行完毕返回就OK了,这里有一个远程注入代码块, 并卸载目标进程已加载的DLL的代码,贴给你吧: 卸载非本进程的DLL模块 - Pascal 编辑 | 删除...

delphi中怎么把窗体放到dll中去啊?
1, 打开DELPHI,新建一个Dll Wizard 2, 在新建的Dll里新建一个Form 3, 在新建的Form里uses stdctrls 4, 在var下面写:Procedure synapp(App:THandle);stdcall;Procedure showform;stdcall;5, 然后在implementation 下面uses math 6, 在{$R *.dfm}下面写 Procedure synapp(App:THandle);...

Delphi注入DLL 如何获取当前进程名
比如你想注入的进程是QQ.EXE 那么首先判断进程是否存在,判断方法如下:在USES 中加入TLhelp32单元 function Tform1.CheckTask(ExeFileName: string): Boolean;\\\\判断进程是否存在 const PROCESS_TERMINATE=$0001;var ContinueLoop: BOOL;FSnapshotHandle: THandle;FProcessEntry32: TProcessEntry32;begin...

delphi中如何枚举一个进程中已经注入的dll
DWORD th32ProcessID );第一个参数 TH32CS_SNAPMODULE 第二个参数 进程PID 然后用 BOOL WINAPI Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme );和 BOOL WINAPI Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme );进行遍历,最后判断模块的扩展名是不是dll就可以了.记得uses TlHelp32;

DLL与EXE程序问题,DELPHI高手进
1、EXE是独立的程序,有主动的目的,最常见的模式就是“输入+处理+输出”,运行它总会做点儿什么实际的事儿。事毕是否有能让人一眼看到的事件发生,则要看程序的输出设计了:显性的事件有在屏幕上输出计算结果,隐性的事件有在磁盘上创建一些文件,或者干预系统中的一些对象,例如关闭另外一个程序。追...

相似回答