如何通过调试进程来注入DLL

如何通过调试进程来注入DLL,第1张

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这一项。在后面的选项中手动指向你的主类。试一下。原来我也遇到过这样的问题,按照上面的设置后可以正常使用了。

希望对你有点帮助!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12163553.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存