2009-05-02, 20:45 【原创】[TX][XX],密码输入窗口的一点分析
--------------------------------------------------------------------------------
[软件][XX]2009 bate 2
[工具]OD
[目的]搞到明文的wm_keydown点,告诉一些发帖的同志,窗口是存在的。
2008年的时候,我把[XX]的破了,写了个基于键盘的记录xxx,但是没搞完,就是特征骂定位的什么,由于以前工作原因,朋友叫我不要在这发[TX]的xxx。所以发了就,立刻删除了。恩2009了,lv up了,我也不存在工作上的一些原因了。我决定再发一篇搞[XX]的。
我就喜欢在pediy搞[TX]。
今天下午花了4个钟头的样子,分析了下[TX][XX]。的缺修补了我2008年的时候找到的那个地方。不过也不咋的。我们就再来搞盘它。
没搞完,等我哪天心情再不好的时候,再把它搞完。这时候,我喜欢的电视就要开播了。痞子英雄。不错。
首先,我们要观察程序。
傻[TX],由于软件大了,所以要找的点也很多。当然切入点多了,要记录密码也不是啥子难事了。
首先在CreateWindowExA下点
0012F340 03572DEC /CALL 到 CreateWindowExA 来自 TSSafeEd.03572DE9
0012F344 00000000 |ExtStyle = 0
0012F348 0012F38C |Class = "EDIT"
0012F34C 0012F39E |WindowName = "S"
0012F350 40010020 |Style = WS_CHILD|WS_TABSTOP|20
0012F354 00000005 |X = 5
0012F358 00000005 |Y = 5
0012F35C 000000A0 |Width = A0 (160.)
0012F360 00000010 |Height = 10 (16.)
0012F364 00180338 |hParent = 00180338 ('[XX]2009 Beta2',class='TXGuiFoundation',parent=001B01C0)
0012F368 00000000 |hMenu = NULL
0012F36C 00400000 |hInst = 00400000
0012F370 00000000 \lParam = NULL
恩,那个TSSafeEd.dll就是它那个密码输入筐筐的保护dll.该dll,大量挂接操作,主要针对user32.dll.
user32.dll本质就是窗口的一些xxx.
然后我们跳到那个dll去。
在esp点下断,也就是03572DEC 这个地方下断,然后F9
一般情况createwindow后,就showwindow了,然后我们一路f8跟过去。
做这些事,是要想快速找到该窗口的消息处理函数,找到了消息过程函数后,我们才可以xxxx。拿到wm_keydown.
一路f7.
为什么要f7而不f8.是因为写这个保护的人,可能用了些汇编。用了汇编,你就不能保证它的写法和正常的call法是平衡或者一枝的了。简单点说,堆栈不平衡了。
create windows的返回数据是窗口的handle.用你的大脑记下来。
依次的执行过程是
先send message WM_SETFOSE一个
再show window 一个
然后就getwindowLog,取窗口过程了。
[TX]真好,连窗口过程都帮我们取出来了。位置在这里。
03572E5C 8989 596AFC57 mov dword ptr [ecx+57FC6A59], ecx
03572E62 FF56 1C call dword ptr [esi+1C]
03572E65 8945 08 mov dword ptr [ebp+8], eax ; USER32.77D3B3B4
03572E68 8D45 E0 lea eax, dword ptr [ebp-20]
03572E6B 68 30905703 push 03579030
03572E70 50 push eax
03572E71 E8 D3E7FFFF call 03571649
03572E76 59 pop ecx
03572E77 59 pop ecx
03572E78 68 94285703 push 03572894
03572E7D 6A FC push -4
03572E7F FFB6 70010000 push dword ptr [esi+170]
03572E85 FF56 14 call dword ptr [esi+14]
03572E88 51 push ecx
03572E89 E8 04000000 call 03572E92
03572E8E - 0F88 EB1059EB js EEB03F7F
03572E94 0250 33 add dl, byte ptr [eax+33]
03572E97 83C1 02 add ecx, 2
03572E9A EB 02 jmp short 03572E9E
03572E9C ^ 76 90 jbe short 03572E2E
03572E9E 51 push ecx
03572E9F C3 retn
03572EA0 8989 598B8678 mov dword ptr [ecx+78868B59], ecx
03572EA6 0100 add dword ptr [eax], eax
取的是一个user32.dll里的窗口过程。
好的,那我们斗切做第一个测试,在那下条件断点拦截wm_keydown.消息。0x77d3b3b4下条件断点
dword ptr [esp+0x08] == 0x100
100h斗是wm_keydown了。
77D3B3B4 > 8BFF mov edi, edi
77D3B3B6 . 55 push ebp
77D3B3B7 . 8BEC mov ebp, esp
77D3B3B9 . 8B4D 08 mov ecx, dword ptr [ebp+8]
77D3B3BC . 56 push esi
77D3B3BD . E8 0ED1FDFF call 77D184D0
77D3B3C2 . 8BF0 mov esi, eax
77D3B3C4 . 85F6 test esi, esi
77D3B3C6 . 74 40 je short 77D3B408
77D3B3C8 . 8B55 0C mov edx, dword ptr [ebp+C]
77D3B3CB . 3B15 0801D777 cmp edx, dword ptr [77D70108]
77D3B3D1 . 0F87 A3000000 ja 77D3B47A
77D3B3D7 . 33C0 xor eax, eax
77D3B3D9 . 8BCA mov ecx, edx
77D3B3DB . 83E1 07 and ecx, 7
77D3B3DE . 40 inc eax
77D3B3DF . D3E0 shl eax, cl
77D3B3E1 . 57 push edi
77D3B3E2 . 8B3D 0C01D777 mov edi, dword ptr [77D7010C]
然后,我们来看它的wparam.正常的wparam应该是,一个hex数据,这个hex数据是键盘上按的字符的asc2码对照。
OK,很不幸运的是,在每次那个wm_keydown的数据,都无法正常的对照键盘。
这个时候,我们就要做点回硕跟踪了。
这里,谈谈键盘。要想从本质级,改变键盘的编码,当然是r0下。但是我觉得2009的[XX]应该和2008的[XX]一样,不会存在r0下的一些修改。
大概就是通过串改user32实现键盘的编码变换。
既然知道了是串改user32进行编码变换。那我们用od就足够了。
好,我们继续来看定位点。
我们明白了这点后,我们又知道TSSafeEd.dll是那个保护的的xxx,那我们就想办法跳到那个TSSafeEd.dll里去看在wm_keydown之前,它搞了啥。
我这里使用的方法是,在multibytetowidechar这个地方下点。,因为每次输入一个字符的时候,[XX]它斗会切转换一次。
断下来后,一路ctrl加F9,就来到了这里
03572C50 0FBF45 16 movsx eax, word ptr [ebp+16]
03572C54 8B8E A4915703 mov ecx, dword ptr [esi+35791A4]
03572C5A 50 push eax
03572C5B 0FBF45 14 movsx eax, word ptr [ebp+14]
03572C5F 50 push eax
03572C60 E8 A00B0000 call 03573805
03572C65 FF75 14 push dword ptr [ebp+14]
03572C68 FF75 10 push dword ptr [ebp+10]
03572C6B 57 push edi
03572C6C FF75 08 push dword ptr [ebp+8]
03572C6F FFB6 9C915703 push dword ptr [esi+357919C]
03572C75 > FF96 A0915703 call dword ptr [esi+35791A0] ; USER32.CallWindowProcA----在这里怎个条件断点,还是断0x100,这个消息
03572C7B 5F pop edi
03572C7C 5E pop esi
03572C7D 5B pop ebx
03572C7E C9 leave
03572C7F C2 1000 retn 10
恩,这时候,我们就知道了。先是xxx处理正常的wm_keydown消息,然后变换了过后,再切发到那个窗口的处理过程里头切。大概就是用函数CallWindowProcA
回硕,回硕。。。。。
想搞[XX]的,大家,就自己切研究了哈。:)
祝大家51快乐。