1. 用CreateProcess(CREATE_SUSPENDED)启动目标进程。
2. 找到目标进程的入口,用ImageHlp中的函数可以实现。
3. 将目标进程入口的代码保存起来。
4. 在目标进程的入口写入LoadLibrary(MyDll)实现Dll的注入。
5. 用ResumeThread运行目标进程。
6. 目标进程就运行了LoadLibrary(MyDll),实现DLL的注入。
7. 目标进程运行完LoadLibrary(MyDll)后,将原来的代码写回目标进程的入口。
8. 目标进程Jmp至原来的入口,继续运行程序。
从原理上可以看出,DLL的注入在目标进程的开始就运行了,而且不是用Debug的方案,这样,就没有上面方案的局限性了。该方案的关键在6,7,8三步,实现方法需要监视进程和DLL合作。下面,结合代码进行分析。
在监视进程中,创建FileMapping,用来保存目标进程的入口代码,同时保证DLL中可以访问。在第7步实现将原目标代码写回目标进程的入口。
把DLL注入到其它正常程序中这个行为会被杀毒软件视为病毒行为, 被注入的程序不会自动调用DLL中的函数, 只有通过注入后让DLL中的函数自动运行, 在DLL的入口函数dllmain()中自动调用
如何通过注入的DLL来控制还原最小化到任务栏的游戏窗口,在DLL呼出的外挂窗口在游戏窗口最小化的时候一起最小化了 这个时候用ShowWindow(DLL呼出窗口句柄)将DLL呼出窗口还原正常 要还原游戏窗口就崩溃,还原游戏窗口时API函数::ShowWindow()的参数1用的DLL呼出窗口的父窗口句柄,哪位高手能帮忙解决一下,怎么做才能让游戏窗口正常从任务栏还原为激活窗口。
function show:integer;stdcall; //声明函数
external 'sosdll';
procedure InjectFunc(InHWND: HWND; Func: Pointer; Param: Pointer; ParamSize: DWORD);
var
hProcess_N: THandle;
ThreadAdd, ParamAdd: Pointer;
hThread: THandle;
ThreadID: DWORD;
lpNumberOfBytes:DWORD;
begin
GetWindowThreadProcessId(InHWND, @ThreadID);
hProcess_N := OpenProcess(PROCESS_ALL_ACCESS, False, ThreadID);
WriteProcessMemory(hProcess_N, ThreadAdd, Func, 4096, lpNumberOfBytes);
ParamAdd := VirtualAllocEx(hProcess_N, nil, ParamSize, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess_N, ParamAdd, Param, ParamSize, lpNumberOfBytes);
hThread := CreateRemoteThread(hProcess_N, nil, 0, ThreadAdd, ParamAdd, 0, lpNumberOfBytes);
ResumeThread(hThread);
WaitForSingleObject(hThread, INFINITE);
VirtualFreeEx(hProcess_N, ThreadAdd, 4096, MEM_RELEASE);
VirtualFreeEx(hProcess_N, ParamAdd, ParamSize, MEM_RELEASE);
CloseHandle(hThread);
CloseHandle(hProcess_N);
end;
上面的注入函数
procedure TForm1Button2Click(Sender: TObject);
var
inhwnd:Hwnd;
ThreadID: DWORD;
hProcess_N: THandle;
begin
inhwnd:= FindWindow(nil,'shadow');
GetWindowThreadProcessId(InHWND, @ThreadID);
hProcess_N := OpenProcess(PROCESS_ALL_ACCESS, False, ThreadID);
injectfunc(InHWND,@show,nil,0);
end;
这个是调用函数,请大大门看看. injectfunc(InHWND,@show,nil,0);这个句。我第3个和第4个参数不太明白是什么意思.因为我自己写个EXE推测市的时候,那个注入函数并不需要传参的,哪位有这方面的例子最好拿出来了.谢谢
在打包生成exe的时候,native executable builder,在第三步,选择数据库,在选择 include required classes and known resource这一项。在后面的选项中手动指向你的主类。试一下。原来我也遇到过这样的问题,按照上面的设置后可以正常使用了。
希望对你有点帮助!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)