免费杀毒软件,全面病毒解决方案

投递文章  投稿指南 金山毒霸非官方通告:
搜索: 您的位置毒霸首页>毒霸资讯>黑客动态>阅读资讯:在这里添加Edit控件密码窗口的秘密--一种全新的通用密码记录技术

在这里添加Edit控件密码窗口的秘密--一种全新的通用密码记录技术

2008-05-08 03:38:22   来源:   作者:   【 评论:0

*目前的各类密码记录技术* 目前各类密码记录程序多如牛毛,但实现原理无非有以下六个:

 一:调用CreateRemoteThread函数远程DLL或代码注入. 二:调用SetWindowsHookEx安装键盘钩子记录按键,或是键盘驱动记录按键.(注五) 三:伪造登陆界面. 四:登录信息在网络传输过程中被嗅探. 五:分析目标程序流层,文件补丁技术(注一). 六:分析目标程序流层,搜索并读取存放在内存中(比如:全局变量)的密码. 由于后四个技术都要对目标程序进行专门的分析所以更多的用在专用游戏盗号程序中.这样目前通用的获取目标主机各类程序登录密码的技术还是紧紧局限于前两个. *两大主流密码记录技术的局限性* 对于键盘记录技术由于用户可能会不按顺序输入密码所以正确率有限,要是安装键盘驱动还要Admin权限同时更难以区分用户是输密码还是其它输入(在驱动下可没有GetActiveWindow函数呵呵). 对于第一种技术前面所说的问题都不存在,并且用各种语言编写的源代码广为流传,所以水平高一点点的黑客都会使用,但也正因为这个远线程注入技术实在太流行, 所以很多杀毒软件一但发现有程序调用了CreateRemoteThread这个API就会提示并拦截(比如江民公司的"木马一扫光").同样安装键盘钩子比如调用SetWindowsHookEx有些杀毒软件也会提示. 难道就没有通用性相对较好,记录正确率高,不容易被杀毒软件查杀的技术了吗?

请看下文. *目前的思路* 对于WINDOWS程序中的密码窗口通常是具有ES_PASSWORD风格的EDIT控件(通常输入内容显示为*号),在WINDOWS 98下要记录密码,只用给这种窗体发送一个WM_GETTEXT消息就可以了没有任何限制,在WIN2000以后的操作系统中,微软也意识到这样太不安全,所以限制为进程只可以给自已的具有ES_PASSWORD风格的EDIT控件窗口发送WM_GETTEXT消息并正确得到窗口内容(注二).这样也就很好理解为什么目前的两大主流技术要么是建一个远程线程,要么HOOK键盘了.现在的程序和WIN98时代很明显的区别就是都要多一个DLL. (直接代码注入的可以不要DLL但还是会调用可能引起杀毒软件提示的API函数) *新的思路* 在EDIT控件输入字符以后,这些字符当然是被记录在EDIT控件所在的进程可以仿问的内存中的.可不可以直接从内存中读取内容呢? 也就是写了一个自已的不受微软限制的GetWindowText函数,或是叫GetWindowPass函数.读内存可以调用OpenProcess和ReadProcessMemory 或是集成这两个函数的Toolhelp32ReadProcessMemory.怎么读的问题解决了,现在就是读哪个位置的问题.另外OpenProcess 不代写内存的参数一般杀毒软件不会提示(注三). *读哪儿?*

解决这个问题首先我们还是看看微软是怎么读的吧.大家都知道要取得EDIT控件的内容可以发WM_GETTEXT消息或是调用USER32.DLL中 的GetWindowTextA函数.打开WIN32DASM和SOFTICE.一路跟踪后总算基本明白了其中的原理,重要代码反汇编如下:

共有三部分 (USER32.DLL 5.1.2600.2180,XPSP2 PRO CN) 第一部分: GetWindowText函数执行后很快就会调用如下代码:重要的地方会有注解:) :77D184D0 8BFF mov edi, edi :77D184D2 55 push ebp :77D184D3 8BEC mov ebp, esp :77D184D5 51 push ecx :77D184D6 53 push ebx :77D184D7 56 push esi :77D184D8 57 push edi :77D184D9 8855FC mov byte ptr [ebp-04], dl :77D184DC 8BF9 mov edi, ecx ;edi中为密码窗口句柄 :77D184DE 33F6 xor esi, esi :77D184E0 64A118000000 mov eax, dword ptr fs:[00000018] ;得到当前线程的TEB :77D184E6 8B0D6000D777 mov ecx, dword ptr [77D70060] :77D184EC 8D98CC060000 lea ebx, dword ptr [eax 000006CC] ;当前线程TEB的基地址 6CCH放入EBX中 :77D184F2 8BC7 mov eax, edi :77D184F4 25FFFF0000 and eax, 0000FFFF ;eax中为密码窗口句柄的低16位 :77D184F9 3B4108 cmp eax, dword ptr [ecx 08] :77D184FC 734D jnb 77D1854B :77D184FE 8B0D8400D777 mov ecx, dword ptr [77D70084] ;77D70084是USER32.DLL中的一个全局变量的地址,重要! :77D18504 8D0440 lea eax, dword ptr [eax 2*eax] :77D18507 8D0C81 lea ecx, dword ptr [ecx 4*eax] ;ecx为(密码窗口句柄低16位x12) 一个未知全局变量 --------------------------无关代码省略之------------- :77D1852F 8B31 mov esi, dword ptr [ecx] ;ecx的值没变,取里面的值给esi :77D18531 0F8471A40100 je 77D329A8 :77D18537 3B30 cmp esi, dword ptr [eax] :77D18539 0F8269A40100 jb 77D329A8 :77D1853F 3B7004 cmp esi, dword ptr [eax 04] :77D18542 0F8360A40100 jnb 77D329A8 :77D18548 2B731C sub esi, dword ptr [ebx 1C] ;刚才的值-RealClientID,EBX 1C接合上面的代码看就是当前线程TEB的基地址 6CCH 1CH,取得的值也就是当前线程的RealClientID 第二部分 经过一些跳转后会调用EditWndProc,其中的关键代码如下: Exported fn(): EditWndProc - ord:00C1h ;函数入口 :77D2C538 8BFF mov edi, edi :77D2C53A 55 push ebp :77D2C53B 8BEC mov ebp, esp :77D2C53D 83EC1C sub esp, 0000001C :77D2C540 8B550C mov edx, dword ptr [ebp 0C] ;如果EDX为0Dh说明是取得窗口的内容 :77D2C543 53 push ebx :77D2C544 56 push esi :77D2C545 57 push edi :77D2C546 8B7D08 mov edi, dword ptr [ebp 08] :77D2C549 8B07 mov eax, dword ptr [edi] :77D2C54B 8BB7A4000000 mov esi, dword ptr [edi 000000A4] ;这儿的EDI和前面代码最后的ESI是同一个值,重要! :77D2C551 33C9 xor ecx, ecx ;计算后ESI就是一个指向窗口内容结构的指针 :77D2C553 8945F4 mov dword ptr [ebp-0C], eax :77D2C556 41 inc ecx ---------------------无关代码省略之--------------- :77D2C5B9 51 push ecx :77D2C5BA FF7514 push [ebp 14] :77D2C5BD FF7510 push [ebp 10] :77D2C5C0 56 push esi :77D2C5C1 E88E040000 call 77D2CA54 ;得到窗口内容 第三部分: * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:77D2C665(C) | :77D41496 837E0C00 cmp dword ptr [esi 0C], 00000000 :77D4149A 7427 je 77D414C3 :77D4149C 668B466A mov ax, word ptr [esi 6A] :77D414A0 660FAF460C imul ax, word ptr [esi 0C] ;esi和上面的一样指向窗口结构,ESI 0C是取得密码长度 :77D414A5 668945FA mov word ptr [ebp-06], ax :77D414A9 668945F8 mov word ptr [ebp-08], ax :77D414AD 8D45F8 lea eax, dword ptr [ebp-08] :77D414B0 50 push eax :77D414B1 33C0 xor eax, eax :77D414B3 8A86EC000000 mov al, byte ptr [esi 000000EC] ;ESI EC解码密码的变量,总是一个字节 :77D414B9 897DFC mov dword ptr [ebp-04], edi :77D414BC 50 push eax * Reference T ntdll.RtlRunDecodeUnicodeString, ord:0304h | 1 2 3 4 5 6 7 8 9 10 下一页



Tags:  
责任编辑:
  • 请文明参与讨论,禁止漫骂攻击。 用户名:新注册) 密码: 匿名:
    评论总数:0 [ 查看全部 ] 网友评论
    关于我们 - 联系我们 - 广告服务 - 法律声明 - RSS订阅 - 网站地图 - 返回顶部 -