baronG 发表于 2010-10-28 20:45

Win32Asm 第十一章笔记+反汇编分析~~~

OK - - 前几天再看 罗大侠的win32asm,
看到第11章使用SetWindowsHookex全局钩子,挂键盘的时候
对共享变量有了一些疑问,
觉得消息 窗口句柄这些不需要做成共享变量,所以祭起OD~分析了一下。
然后就明白了。
废话不多说,有XX有真相

start:

.data
hInstance dd ?
szDllmsg db '进入DLL中...',0
.data?
hWnd dd ?;同样 需要窗口具备句柄
dwMessage dd ? ;必须共享的参数,不然传送的时候发不过去,不是一个进程的。。a
hHook dd ?
szAscii db 4 dup (?);预留四字节
.code

这是在DLL中定义的变量,当然了/section:bss,s选项开启了。。
此时我先按照正常的编译一下。我们来看看代码~~~
首先是 安装挂钩的程序,我们先分析他是如何获得 句柄 消息以及如何传递的


00401000                     /.55               push ebp                                                ;解码为 <WinProc>
00401001                     |.8BEC               mov ebp,esp
00401003                     |.83C4 FC            add esp,-4
00401006                     |.53               push ebx
00401007                     |.57               push edi
00401008                     |.56               push esi
00401009                     |.8B45 0C            mov eax,dword ptr ss:
0040100C                     |.83F8 10            cmp eax,10                                                ;Switch (cases 10..500)
0040100F                     |.75 11            jnz short Main.00401022
00401011                     |.E8 BE000000      call <jmp.&Hookdll.UninstallHook>                         ;Case 10 of switch 0040100C
00401016                     |.6A 00            push 0                                                    ; /Result = 0
00401018                     |.FF75 08            push dword ptr ss:                                 ; |hWnd
0040101B                     |.E8 96000000      call <jmp.&USER32.EndDialog>                              ; \EndDialog
00401020                     |.EB 60            jmp short Main.00401082
00401022                     |>3D 10010000      cmp eax,110
00401027                     |.75 1D            jnz short Main.00401046
00401029                     |.68 00050000      push 500                                                ;Case 110 of switch 0040100C 自定义的消息WM_HOOK ==WM_USER+100
0040102E                     |.FF75 08            push dword ptr ss:
00401031                     |.E8 98000000      call <jmp.&Hookdll.InstallHook>    ;这些是安装挂钩
00401036                     |.0BC0               or eax,eax
00401038                     |.75 48            jnz short Main.00401082
0040103A                     |.6A 00            push 0                                                    ; /Result = 0
0040103C                     |.FF75 08            push dword ptr ss:                                 ; |hWnd
0040103F                     |.E8 72000000      call <jmp.&USER32.EndDialog>                              ; \EndDialog
00401044                     |.EB 3C            jmp short Main.00401082
00401046                     |>3D 00050000      cmp eax,500
0040104B                     |.75 29            jnz short Main.00401076
0040104D                     |.8B45 10            mov eax,dword ptr ss:                           ;Case 500 of switch 0040100C
00401050                     |.3C 0D            cmp al,0D
00401052                     |.75 05            jnz short Main.00401059
00401054                     |.B8 0D0A0000      mov eax,0A0D
00401059                     |>8945 FC            mov dword ptr ss:,eax
0040105C                     |.8D45 FC            lea eax,dword ptr ss:
0040105F                     |.50               push eax                                                ; /lParam
00401060                     |.6A 00            push 0                                                    ; |wParam = 0
00401062                     |.68 C2000000      push 0C2                                                ; |Message = EM_REPLACESEL
00401067                     |.68 E9030000      push 3E9                                                ; |ControlID = 3E9 (1001.)
0040106C                     |.FF75 08            push dword ptr ss:                                 ; |hWnd
0040106F                     |.E8 48000000      call <jmp.&USER32.SendDlgItemMessageA>                  ; \SendDlgItemMessageA
00401074                     |.EB 0C            jmp short Main.00401082
00401076                     |>B8 00000000      mov eax,0                                                 ;Default case of switch 0040100C
0040107B                     |.5E               pop esi
0040107C                     |.5F               pop edi
0040107D                     |.5B               pop ebx
0040107E                     |.C9               leave
0040107F                     |.C2 1000            retn 10




DLL 代码————————————————————————————

10001000 Hookdll.<模块入口点>   /$55               push ebp
10001001                     |.8BEC               mov ebp,esp
10001003                     |.FF75 08            push dword ptr ss:
10001006 <Hookdll.DLL_handel>|.8F05 00400010      pop dword ptr ds:                               ;Hookdll.10000000
1000100C                     |.B8 01000000      mov eax,1
10001011                     |.C9               leave
10001012                     \.C2 0C00            retn 0C
10001015 Hookdll.HookProc    /$55               push ebp
10001016                     |.8BEC               mov ebp,esp
10001018                     |.81C4 00FFFFFF      add esp,-100
1000101E                     |.FF75 10            push dword ptr ss:                              ; /lParam
10001021                     |.FF75 0C            push dword ptr ss:                                 ; |wParam
10001024                     |.FF75 08            push dword ptr ss:                                 ; |HookCode
10001027                     |.FF35 08200010      push dword ptr ds:                              ; |hHook = NULL
1000102D                     |.E8 9A000000      call <jmp.&user32.CallNextHookEx>                         ; \CallNextHookEx
10001032                     |.8D85 00FFFFFF      lea eax,dword ptr ss:
10001038                     |.50               push eax                                                ; /pState
10001039                     |.E8 9A000000      call <jmp.&user32.GetKeyboardState>                     ; \GetKeyboardState
1000103E                     |.6A 10            push 10                                                   ; /Key = VK_SHIFT
10001040                     |.E8 8D000000      call <jmp.&user32.GetKeyState>                            ; \GetKeyState
10001045                     |.8885 10FFFFFF      mov byte ptr ss:,al                               ;按下为81 释放为80 没按 为1
1000104B                     |.8B4D 10            mov ecx,dword ptr ss:
1000104E                     |.C1E9 10            shr ecx,10
10001051                     |.6A 00            push 0                                                    ; /MenuActive = 0
10001053                     |.68 0C200010      push Hookdll.1000200C                                     ; |szascii
10001058                     |.8D85 00FFFFFF      lea eax,dword ptr ss:                            ; |
1000105E                     |.50               push eax                                                ; |szKeyState
1000105F                     |.51               push ecx                                                ; |ScanCode
10001060                     |.FF75 0C            push dword ptr ss:                                 ; |Key
10001063                     |.E8 82000000      call <jmp.&user32.ToAscii>                              ; \ToAscii
10001068                     |.C680 0C200010 00   mov byte ptr ds:,0
1000106F                     |.6A 00            push 0                                                    ; /lParam = 0
10001071                     |.FF35 0C200010      push dword ptr ds:                              ; |wParam = 0
10001077                     |.FF35 04200010      push dword ptr ds:                              ; |Message = MSG(500)
1000107D                     |.FF35 00200010      push dword ptr ds:                              ; |hWnd = 4802FC
10001083                     |.E8 56000000      call <jmp.&user32.SendMessageA>                           ; \SendMessageA
10001088                     |.33C0               xor eax,eax
1000108A                     |.C9               leave
1000108B                     \.C2 0C00            retn 0C
1000108E Hookdll.InstallHook /$55               push ebp
1000108F                     |.8BEC               mov ebp,esp
10001091                     |.FF75 08            push dword ptr ss:
10001094                     |.8F05 00200010      pop dword ptr ds:                               ;窗口句柄
1000109A                     |.FF75 0C            push dword ptr ss:
1000109D                     |.8F05 04200010      pop dword ptr ds:                               ;消息ID
100010A3                     |.6A 00            push 0                                                    ; /ThreadID = 0
100010A5                     |.FF35 00400010      push dword ptr ds:                              ; |hModule = 10000000 (Hookdll)
100010AB                     |.68 15100010      push Hookdll.HookProc                                     ; |Hookproc = Hookdll.HookProc
100010B0                     |.6A 02            push 2                                                    ; |HookType = WH_KEYBOARD
100010B2                     |.E8 2D000000      call <jmp.&user32.SetWindowsHookExA>                     



; \这里一定要注意 从这里,一定要开始使用鼠标,点击工具栏的“步入 OR 步过”来实现键盘的F7 F8。我也不知道为什么挂钩这个函数执行后,再次F7 F8 OD就会卡死,我觉得可能是因为是全局键盘钩子原因,但是具体原因,我也不是很清楚,如果哪位大侠调试过后,知道怎么回事了。还望告知一二~~这里把断点下再 被挂钩的程序中,不再OD中的HOOK dll下断就不会卡死,我也不知道为什么
当然这样以来 就分析 不到 安装钩子的过程了, 所以 我再分析怎样 得到句柄 和消息的时候还是再 主程序中分析的,分析程序的流程是再被挂钩的程序分析的~~~
这一点请大家注意一下~~~


—————————
1000108F                     |.8BEC               mov ebp,esp
10001091                     |.FF75 08            push dword ptr ss:
10001094                     |.8F05 00200010      pop dword ptr ds:                               ;窗口句柄
1000109A                     |.FF75 0C            push dword ptr ss:
1000109D                     |.8F05 04200010      pop dword ptr ds:                               ;消息ID

这里我们可以看到 获得参数存到数据段~~~~
~~
OK,我们的目标达到了。 我们看一下 如果不是共享的会出现什么情况~

————————————————————————————————————————————我是邪恶的分割线,
.data
hInstance dd ?
szDllmsg db '进入DLL中...',0
hWnd dd ?;同样 需要窗口具备句柄
dwMessage dd ? ;必须共享的参数,不然传送的时候发不过去,不是一个进程的。。a
我们把 hWnd 和dwMessage 放到 初始化节区,看看 发生了什么~~~
.data?
hHook dd ?
此时这个 DLL还是我们main.exe里面的hook dll

10001091                     |.FF75 08            push dword ptr ss:
10001094                     |.8F05 11400010      pop dword ptr ds:                               ;窗口句柄
1000109A                     |.FF75 0C            push dword ptr ss:
1000109D                     |.8F05 15400010      pop dword ptr ds:                               ;消息ID

这是没有共享变量时候 句柄和消息存放的地方
————————————————————————————————

1000106F                     |.6A 00            push 0                                                    ; /lParam = 0
10001071                     |.FF35 04200010      push dword ptr ds:                              ; |wParam = 0
10001077                     |.FF35 15400010      push dword ptr ds:                              ; |Message = MSG(500)
1000107D                     |.FF35 11400010      push dword ptr ds:                              ; |hWnd = 830382
10001083                     |.E8 56000000      call <jmp.&user32.SendMessageA>                           ; \SendMessageA


这是 获得 数据 并且通过SendMessage 发送给窗口一个消息~~~
本进程当然没问题。数据段是有数据的~~~
可是 我们跟跟别的进程会发现~~~如下
——————————————————————————————————- 注入到别的进程的hook.dll

1000106F                     |.6A 00            push 0                                                    ; /lParam = 0
10001071                     |.FF35 04200010      push dword ptr ds:                              ; |wParam = 0
10001077                     |.FF35 15400010      push dword ptr ds:                              ; |Message = WM_NULL
1000107D                     |.FF35 11400010      push dword ptr ds:                              ; |hWnd = NULL
10001083                     |.E8 56000000      call <jmp.&user32.SendMessageA>                           ; \SendMessageA


同样也是这个数据段
但是~~~DD一下数据断~~我们可以看到~~
1000401100000000
1000401500000000

这里根本没有数据~~~~ 当然 send也不知道send给谁了~~~~

此时我们明白了,虽然DLL是在同一个物理内存。通过不同的 内存映射,然后再每个进程都有一个HOOK.DLL
但是数据段 如果不共享,那么,每个进程的数据 都是“隔离”的!!!
别的进程的hook.dll自然无法获取 Main.exe里面的DLL得到的 句柄和 消息了~~~

10001091                     |.FF75 08            push dword ptr ss:
10001094                     |.8F05 11400010      pop dword ptr ds:                               ;窗口句柄
1000109A                     |.FF75 0C            push dword ptr ss:
1000109D                     |.8F05 15400010      pop dword ptr ds:                               ;消息ID

就是这里 无法得到了~~也可能是别的DLL根本没有执行到这里,反正我再这里下断 是断不到,不知道大侠们有什么方法~~~
我说完了~~~~~~~~~~
同时,留下两个问题

1,谁能提供一个 支持代码着色的 工具, - - 以后贴代码的时候,就可以是彩色的了~~

2,就是这个卡死问题,哪位大侠能深入讲解一下???

yuenluan 发表于 2010-10-28 20:58

谢谢分享 一大串 的 慢慢看

纯黑色 发表于 2012-5-24 16:12

谢谢你的分享。以后学习
页: [1]
查看完整版本: Win32Asm 第十一章笔记+反汇编分析~~~