能力值:
( LV9,RANK:220 )
|
-
-
151 楼
NtDeviceIoControlFile返回后不一定传输完毕了吧。如果是异步的要如何取得recv的数据呢?
|
能力值:
( LV6,RANK:90 )
|
-
-
152 楼
为什么用CPP生成dll,注入失败呢?delphi版本的没问题
==>
dllmain()return true才能加载成功,此cpp的dllmain返回true,因此与这无关。
跟踪调试后找到原因如下:
把函数SuperHookDeviceIoControl中的这一句char* functionname = (char*)((ULONG)hMod + ThunkData->u1.AddressOfData + 2);
改为char* functionname = (char*)((ULONG)hMod + (ULONG)ThunkData->u1.AddressOfData + 2);
调试时使用这个注入工具, dll注入辅助工具[带源码],注入进程选择这个工具进程。
也可以自己写个测试程序,只需LoadLibrary加载一下dll即可。测试程序中LoadLibrary跟不进去,需要从dll工程中使用测试程序才能调试跟踪。
抓包时需把dll注入到firefox或者ieexplore等网络进程。
|
能力值:
( LV2,RANK:10 )
|
-
-
153 楼
hao hao xue xi~!
|
能力值:
( LV2,RANK:10 )
|
-
-
154 楼
学习学习!
|
能力值:
( LV2,RANK:10 )
|
-
-
155 楼
做个记号。慢慢学习大牛的作品
|
能力值:
( LV13,RANK:220 )
|
-
-
156 楼
占座继续看,MJ,教主,老V。。强人
|
能力值:
( LV2,RANK:10 )
|
-
-
157 楼
标记一下 虽然我来的很晚
|
能力值:
( LV4,RANK:40 )
|
-
-
158 楼
可以做的还有很多啊,加上对afd_send_info,afd_recv_info的拦截,就能做出非常好玩的东西~
|
能力值:
( LV2,RANK:10 )
|
-
-
159 楼
__asm
{
push OutputBufferLength
push OutputBuffer
push InputBufferLength
push InputBuffer
push IoControlCode
push IoStatusBlock
push ApcContext
push ApcRoutine
push Event
push FileHandle
call pNtDeviceIoControl
mov stat ,eax
}
这种写法,有啥好处?
|
能力值:
( LV2,RANK:10 )
|
-
-
160 楼
马克一下
|
能力值:
( LV2,RANK:10 )
|
-
-
161 楼
收藏之...............
|
能力值:
( LV2,RANK:10 )
|
-
-
162 楼
看起来确实很直观,只能膜拜。MJ的强大...唉
|
能力值:
( LV2,RANK:10 )
|
-
-
163 楼
[QUOTE=木桩;571841] 这个还真没见过,立即改个Delphi的去瞧瞧。
果然好用,膜拜一下!明天试试修改数据包内容
翻译的Delphi版源码见附件,这是我GET百度的数据。[/QUOTE] 这个代码有个问题,只检查和修改了FirstThunk而没有处理CharacteristicsOrOriginalFirstThunk,所以并不通用,我改了一下..
function SuperHook(HookPro,DllName,ApiName:PAnsiChar;NewHookAdderss:Pointer;var OldNtDeviceIoControl:Pointer):Boolean;
var
hMod: HMODULE;
pDosHeader: PImageDosHeader;
pNtHeaders: PImageNtHeaders;
ImportDescriptor: PImageImportDescriptor;
ThunkData: PImageThunkData;
dll_name, func_name: PAnsiChar;
iNum: Integer;
lpAddr: Pointer;
myaddr :DWORD;
btw:SIZE_T;
Ordinal:DWORD;
begin
Result := False;
//得到目标的模块基址
hMod := GetModuleHandleA(HookPro);
if (hMod = 0) then
begin
Exit;
end;
//得到DOS头
pDosHeader := PImageDosHeader(hMod);
//如果DOS头无效
if ( pDosHeader^.e_magic <> IMAGE_DOS_SIGNATURE ) then
begin
Exit;
end;
//得到NT头
pNtHeaders := PImageNtHeaders(hMod + DWORD(pDosHeader^._lfanew));
//如果NT头无效
if ( pNtHeaders^.Signature <> IMAGE_NT_SIGNATURE ) then
begin
Exit;
end;
//检查输入表数据目录是否存在
if (pNtHeaders^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = 0)
or (pNtHeaders^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size = 0) then
begin
Exit;
end;
//得到输入表描述指针
ImportDescriptor := PImageImportDescriptor(hMod + pNtHeaders^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
//检查每个输入项
while (ImportDescriptor^.FirstThunk <> 0) do
begin
// 检查输入表项是否为ntdll.dll
dll_name := PAnsiChar(hMod + ImportDescriptor^.Name);
// 如果不是,则跳到下一个处理
if (StrIComp(dll_name, DllName) <> 0) then
begin
ImportDescriptor := PImageImportDescriptor(DWORD(ImportDescriptor) + SizeOf(_IMAGE_IMPORT_DESCRIPTOR));
Continue;
end;
ThunkData := PImageThunkData(hMod + ImportDescriptor^.CharacteristicsOrOriginalFirstThunk);
iNum := 1;
while (ThunkData^.Function_ <> 0) do
begin
Ordinal := (ThunkData^.Ordinal and $80000000);
func_name := PAnsiChar(hMod + ThunkData^.AddressOfData + 2);
if (StrIComp(func_name , ApiName) = 0) then
begin
OutputDebugString(PChar(Format('[HOOK] Lock "%s" for HOOK.', [StrPas(func_name)])));
myaddr := dword(NewHookAdderss);
lpAddr := Pointer(hMod + ImportDescriptor^.FirstThunk + DWORD(iNum-1)*4);
DWORD(OldNtDeviceIoControl) := Pdword(lpAddr)^;
OutputDebugString(PChar(Format('[HOOK] Base=%0.8X, Thunk=%0.8X, ID=%X', [hMod, ImportDescriptor^.FirstThunk, iNum-1])));
OutputDebugString(PChar(Format('[HOOK] Orign[0x%0.8X]=0x%0.8X, new Addr=0x%0.8X', [DWORD(lpAddr), PDWORD(lpAddr)^, myaddr])));
WriteProcessMemory(GetCurrentProcess(), lpAddr, @myaddr, 4, btw);
//需要处理一下 CharacteristicsOrOriginalFirstThunk
lpAddr := Pointer(hMod + ImportDescriptor^.CharacteristicsOrOriginalFirstThunk + DWORD(iNum-1)*4);
//如果FirstThunk无效则使用CharacteristicsOrOriginalFirstThunk作为返回地址
if ImportDescriptor^.FirstThunk = 0 then DWORD(OldNtDeviceIoControl) := Pdword(lpAddr)^;
WriteProcessMemory(GetCurrentProcess(), lpAddr, @myaddr, 4, btw);
Result := True;
// Exit;
end;
Inc(iNum);
ThunkData := PImageThunkData(DWORD(ThunkData) + SizeOf(_IMAGE_THUNK_DATA));
end;
Inc(ImportDescriptor);
end;
end;
|
能力值:
( LV2,RANK:10 )
|
-
-
164 楼
靠,收藏了,学习了,看雪就是这一点好,
永远雪藏着国内顶尖技术。
|
能力值:
( LV2,RANK:10 )
|
-
-
165 楼
MJ最近怎么没有现身哈?去哪了?
|
能力值:
( LV2,RANK:10 )
|
-
-
166 楼
我不觉得用spi有什么问题!!!
|
能力值:
( LV3,RANK:20 )
|
-
-
167 楼
另类挂钩 RING3数据包监视 不错
|
能力值:
( LV2,RANK:10 )
|
-
-
168 楼
弱弱的请教一下,这种方法HOOK了一个程序,退出时需要还原吗,谢谢啦~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
169 楼
看不懂。。。。努力学习
|
能力值:
( LV2,RANK:10 )
|
-
-
170 楼
高手啊,但愿这种帖子多一些
|
能力值:
( LV2,RANK:10 )
|
-
-
171 楼
网络抓包,思路另类~~~
|
能力值:
( LV13,RANK:290 )
|
-
-
172 楼
"网上的方法都非常挫"
既然非常挫,那你去看什么? 无意义
|
能力值:
( LV2,RANK:10 )
|
-
-
173 楼
收藏了~~~~~~
|
能力值:
( LV4,RANK:40 )
|
-
-
174 楼
也不是什么高深莫测的技术啊....
逆向下afd.sys,就什么都有了
原以为是一片处女地啊,不想那马早就被开发了...
|
能力值:
( LV4,RANK:40 )
|
-
-
175 楼
也不是什么高深莫测的技术啊....
逆向下afd.sys,就什么都有了
原以为是一片处女地啊,看来已被开发了...
|
|
|