S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

 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快乐。


 

Feedback

# re: 2009-05-02, 20:45 【原创】[TX][XX],密码输入窗口的一点分析  回复  更多评论   

2010-01-29 23:22 by cnlamb
呼。。。很强的文章

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理