能力值:
( LV2,RANK:10 )
|
-
-
2 楼
如果实在不行。 试着别用资源呗。 直接动态创建窗口。 有API的。
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
http://bbs.pediy.com/showthread.php?t=104336
这是我以前写的外挂,采用动态代码注入。有些麻烦,但很高效
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
那样创建就是累啊,想通过解单的办法来实现对话框,DialogBoxParam这样创建一个多解单,只是模版的资源不知道怎么弄了
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
不错的文章,谢谢大牛,只是和我问的问题不相关啊,以后想学编写外挂的时候可以参考大牛的作品,很好很强大
|
能力值:
( LV12,RANK:340 )
|
-
-
6 楼
不使用DLL的话,很麻烦的,你创建对话框,肯定要模块基址吧。
这个对话框资源是和模块相关的。没有dll的话,你得在内存用修改主程序的资源。
这样还不如直接api窗口创建的简单呢。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
恩,是这样的,正因为麻烦,所以才会隐蔽,如果DLL注入远进程的话,就不容易找得到。你的意思就是需要将资源重定为,是吧。
我现在都不知道这个资源要怎么将他写入代码中,在将代码连同资源一起注入到远线程中去。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
多是多,但不是我提问的相关内容,只是请远程注入,无程注入我也会啊,就是没有说不通过DLL怎么将资源代码也写到远线程中去。
|
能力值:
( LV5,RANK:70 )
|
-
-
11 楼
我说的不是dll注入。
你可以把rc也读入到内存,作为远程数据来传输。
//远程数据
typedef struct tag_RemoteData
{
LOADlIBRARY fnLoadLibraryA; //LoadLibraryA函数地址
GETPROCADDRESS fnGetProcAddress;
char szUser32Dll[32] ;//"user32.dll"
char szMessageBoxA[32] ;//"MessageBoxA"
char szKernel32Dll[32] ;//"Kernel32.Dll"
char szGetModuleFileName[32] ;//"GetModuleFileName"
}REMOTE_DATA , *PREMOTE_DATA ;
#pragma check_stack (off)
//远程线程函数
static void WINAPI RemoteThread(LPVOID pParam)
{
PREMOTE_DATA pData = (PREMOTE_DATA)pParam ;
//加载dll
HMODULE hUser32Dll = (pData->fnLoadLibraryA)(pData->szUser32Dll);
HMODULE hKernel32Dll =(pData->fnLoadLibraryA)(pData->szKernel32Dll);
//查找函数地址
MESSAGEBOX fnMessageBox = (MESSAGEBOX)(pData->fnGetProcAddress)(hUser32Dll, pData->szMessageBoxA);
GETMODULEFILENAME fnGetModuleFileName = (GETMODULEFILENAME)(pData->fnGetProcAddress)(hKernel32Dll , pData->szGetModuleFileName);
char pBuffer[256];
//char* pBuffer = new char[256];
//函数调用
fnGetModuleFileName(0 , pBuffer , 256);
fnMessageBox(0, pBuffer ,pData->szMessageBoxA,MB_OK);
}
static void AfterRemoteThread(){}
#pragma check_stack
DWORD dwSizeOfCode = (BYTE*)AfterRemoteThread - (BYTE*)RemoteThread;
//封装函数:向指定进程注入指定代码
bool InjectCode(DWORD dwProcessId , DWORD pThreadFunction , PREMOTE_DATA pParam , DWORD dwSizeOfCode)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_CREATE_THREAD
|PROCESS_VM_OPERATION |PROCESS_VM_WRITE, FALSE, dwProcessId);
if(hProcess == INVALID_HANDLE_VALUE){
MessageBox(0,"无效的进程句柄",0,0);
return false;
}
//在远程进程中分配内存(shellcode)
HANDLE pMemOfCode = VirtualAllocEx(hProcess , 0 , dwSizeOfCode ,
MEM_COMMIT , PAGE_EXECUTE_READWRITE); //属性:可执行PAGE_EXECUTE);
if(pMemOfCode == NULL ){
MessageBox(0,"内存分配失败",0,0);
return FALSE;
}
//在远程进程内存中写入 被注入代码
bool bWritten = WriteProcessMemory(hProcess , pMemOfCode, //进程和buffer地址
(LPVOID)(DWORD)pThreadFunction , dwSizeOfCode ,0);//原始数据地址和size
if(!bWritten){
MessageBox(0,"写入代码失败",0,0);
return FALSE;
}
//在远程进程中分配内存(data)
HANDLE pMemOfData = VirtualAllocEx(hProcess , 0 , dwSizeOfCode ,
MEM_COMMIT , PAGE_EXECUTE_READWRITE); //属性:可读写
if(pMemOfCode == NULL ){
MessageBox(0,"内存分配失败",0,0);
return FALSE;
}
//在远程进程内存中写入参数
bWritten = WriteProcessMemory(hProcess , pMemOfData , //进程和buffer地址
pParam, sizeof(REMOTE_DATA) ,0);//原始数据地址和size
if(!bWritten){
MessageBox(0,"写入失败",0,0);
return FALSE;
}
//创建远程线程,使其加载dll(线程函数为LoadLibrary)
DWORD dwThreadId ;
HANDLE hRemoteThread = CreateRemoteThread(hProcess , 0,0, //远程进程
(LPTHREAD_START_ROUTINE)pMemOfCode,//线程函数地址
(LPVOID)pMemOfData , //线程函数参数
0 , &dwThreadId) ;
if(hRemoteThread ==INVALID_HANDLE_VALUE){
MessageBox(0,"创建远程线程失败",0,0);
return FALSE;
}
//等待线程退出(dll加载完毕)
// WaitForSingleObject(hRemoteThread , INFINITE) ;
// VirtualFreeEx(hProcess , pMemOfData , 0 , MEM_RELEASE);
// VirtualFreeEx(hProcess , pMemOfCode , 0 , MEM_RELEASE);
CloseHandle(hProcess);
CloseHandle(hRemoteThread);
return TRUE;
}
|
能力值:
( LV3,RANK:20 )
|
-
-
17 楼
我给你的代码,确实是动态注入的,并不是Dll注入。
|