一个DLL中包含hook,怎样才能靠CreateRemoteThread注入到其他进程,也就是说让hook安装到另一进程中,或者安装到DLL中..
只要不是我的进程就可以~~ 希望各位大侠帮忙~我实在没分了.. 不想再沉了... 两个贴一共120分,我肯定都会给~
只要不是我的进程就可以~~ 希望各位大侠帮忙~我实在没分了.. 不想再沉了... 两个贴一共120分,我肯定都会给~
解决方案 »
- 求各位指导下小弟- -
- DBgrid Adoquery 分页
- 能否告知一下从pardox7.0导入到mssql的方法?用代码!
- Delphi7报表问题
- VisiBroker 是干什么用的东西。我死活装不上。
- 创建一个TTreeNodes,不是通过TTreeView,也就是说它不属于哪个TTreeView,那么执行Clear方法就会出错,怎么办?
- 两个找不出错误的错误。请大虾们指点。
- 如何取数据集中一个记录的某一个字段的值?
- 用dcomconnect时rpc不在监听状态如何解决
- 一个SQL语句的问题
- DELPHI 怎么把数据写到txt和Excel特定的位置 而其它数据不变!!
- 学习没多久请问一个菜鸟问题 谢谢大家
如果是这样SetWindowsHookEx的HOOKPROC 参数要重新修正,简单的方法是你用CreateRemoteThread把你取得的新HOOKPROC 地址作为参数传过去你那一贴发贴人叫c8923704,别怕嘛,你可以
for i=e8923704 to z8923704 do
begin
发帖
end;
for i=e8923704 to z8923704 do
begin
发帖
end; 哈哈 ... 您真的很幽默!
我这么做是因为我没有分..我没有时间泡论坛,我没有技术来回答他人的问题,没有更多的可用分,只能依靠号多和系统给的分,来提问~ 请谅解!
你是让别的程序来执行你的SetWindowsHookEx函数吗??
如果是这样SetWindowsHookEx的HOOKPROC 参数要重新修正,简单的方法是你用CreateRemoteThread把你取得的新HOOKPROC 地址作为参数传过去
您的意思我听懂些了... 不过可以给我个具体点的例子吗... 我不怎么开窍
你在调用CreateRemoteThread不是先要先VirtualAllocEx分配内存,然后WriteProcessMemory把你的目标代码写进去嘛,照你上一贴,你要分配2块空间给2个函数(当然可以一次性分配,我这里为了说清楚分开来讲),你就有2个分配的地址,把你的HOOKPROC 分配的那一块地址,作为CreateRemoteThread的参数来传给InstallHook,,那你就可以使用传入的这个参数来设置SetWindowsHookEx的hookproc参数了。
老实讲,你为什么要让别的程序来执行你的SetWindowsHookEx, 如果只要别的程序来执行代码的话,SetWindowsHookEx或者CreateRemoteThread 单独使用任何一个函数都可以达到要求,你是为了什么躲避这样做????
代码例子我就不写了,现在网上有很多例子,稍微改一下就可以了,况且我也不建议copy代码直接使用。
地址我想不用通过传递..因为他们本是一个DLL,是不是我的思维哪里出了混乱?
hRemoteThread := CreateRemoteThread(hRemoteProcess, nil, 0,
pfnStartAddr, pszLibFileRemote, 0, lpThreadId);
WriteProcessMemory(hRemoteProcess, pszLibFileRemote,
pChar('0'), memSize, WriteSize); pfnStartAddr := GetProcAddress(LoadLibrary('Hook.dll'), 'InstallHook');
hRemoteThread := CreateRemoteThread(hRemoteProcess, nil, 0,
pfnStartAddr, pszLibFileRemote, 0, lpThreadId);
我现在是通过CreateRemoteThread,来调用InstallHook, 你这样一说,我倒看出来.. 这是两个线程~~,,
hRemoteThread := CreateRemoteThread(hRemoteProcess, nil, 0,
pfnStartAddr, pszLibFileRemote, 0, lpThreadId);
WriteProcessMemory(hRemoteProcess, pszLibFileRemote,
pChar('0'), memSize, WriteSize); pfnStartAddr := GetProcAddress(LoadLibrary('Hook.dll'), 'InstallHook');
hRemoteThread := CreateRemoteThread(hRemoteProcess, nil, 0,
pfnStartAddr, pszLibFileRemote, 0, lpThreadId);
我现在是通过CreateRemoteThread,来调用InstallHook, 你这样一说,我倒看出来.. 这是两个线程~~,,
刚刚有些卡..怎么点都不回复... 一回复一堆~~
begin
DLLProc := @MyDLLHandler;
MyDLLHandler(DLL_PROCESS_ATTACH);
Bol := False;
InstallHook(0);这是在DLL begin中写的 也就是loadlibrary就会执行.我用CreateRemoteThread来loadlibraryW('Hook.dll'),应该直接执行InstallHook的呀..
而InstallHook和HookProc 是一个DLL中的, 传参把地址传去 貌似没太大意义!这是我的个人观点,本人菜鸟一只,逻辑错误请指正~
那发你代码来我看看吧,exe
SysUtils,
windows,
Messages,
APIHook in 'APIHook.pas';var
DLLHook: HHOOK;
Bol: Boolean = False;procedure HookProc(nCode, wParam, lParam: LongWORD); stdcall;
begin
if not Bol then CallNextHookEx(DLLHook, nCode, wParam, lParam);
end;function InstallHook(MainHandle: THandle): Boolean ; stdcall;
//MainHandle: THandle 参数在函数里没有调用, 没什么用
begin
DLLHook := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, Hinstance, 0);
Result := DLLHook <> 0;
end;exports
InstallHook;begin
HookAPI; //APIHook.pas 中, 改API函数的函数,可以忽略.
Bol := False;
InstallHook(0); //在LoadLibraryW直接调用hook.
end.
exe代码:
procedure TForm3.Button4Click(Sender: TObject); //exe中LoadLibraryW.
var
ModuleHandle: THandle;
begin
ModuleHandle := LoadLibraryW('Hook.dll');
end;注入代码太多太乱..网上有大比资料,而且我测试过很多次,没有错~
dll中这段代码执行了吗
begin
HookAPI; //APIHook.pas 中, 改API函数的函数,可以忽略.
Bol := False;
InstallHook(0); //在LoadLibraryW直接调用hook.
end.
exe中CreateRemoteThread的代码,发整个调用函数,不要发片段,
我很想说抱歉,,刚刚试了下,,莫名其妙居然好用了~
不过我是注入非系统进程内才可以,,比如explorer,还有我自己的exe
不过我是想注入winlogon, icesword查看模块,我已经成功注入winlogon,但是我的hook并没有生效
难道这是传说中的,winlogon不具备与用户交互的功能?
winlogon我代码可以注入进去,OpenProcessToken,LookupPrivilegeValue,AdjustTokenPrivileges结合起来调整进程权限..但是注入后hook就不生效了... 完全超出我的能力范围~
现在是WH_GETMESSAGE, 该换什么参数呢...
1.首先你说winlogon你已经注入了,按你的意思是SetWindowsHookEx已经执行,没有效果,你可以使用getlasterror()放在SetWindowsHookEx函数后,使用其结果看看(输出文件或弹出对话框)是否成功(成功为0),如有错(不为0)根据数字判断是什么问题。
2。SetWindowsHookEx调用成功,但是不起效果,说明此类型钩子在这里效果不大,你可以换其他的试试,你不知道的话,一个一个的试把。3. 我记得好像对winlogon要提升权限才能使用(AdjustTokenPrivileges函数)
一般系统程序(比如winlogon)运行在LocalSystem帐户下,它拥有的windows station和desktop不具有交互能力。也就是说:不能显示窗口、菜单,不能接受鼠标、键盘等。我先去getlasterror~
function InstallHook(MainHandle: THandle): Boolean ; stdcall;
var
i : DWORD;
begin
DLLHook := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, Hinstance, 0);
i := GetLastError();
mq := TmemoryStream.Create;
mq.loadFromFile('C:\1.exe');
mq.loadFromFile('C:\'+IntToStr(i)+'.GetLastError');
Result := DLLHook <> 0;
end;
你哪来的这个文件,
这个函数是从文件读取,你连这个文件都没有,
应该使用
var
mq: TFileStream;mq := TFileStream.Create('C:\'+IntToStr(i)+'.GetLastError',fmCreate );
我的dll卡在winlogon里了... 现在没办法调试, 你加完我Q, 我重启下试试~ 看看lasterror
勾住winlogon是很不明智的,微软在gina和winlogon做了很多功夫,而且里面的函数基本不公开的大多都因为安全问题,实现起来有难度,gina桌面不同普通桌面,而且里面的数据段是随机的。
注入一般进程已经实现,但是注入winlogon lsass 都会有问题
问题终于解决~