experiment : 用OD下消息断点, 捕获按钮操作.
来源:互联网 发布:淘宝客服售后面试问题 编辑:程序博客网 时间:2024/06/06 03:57
实验目的 : 想直接拦截按钮操作的消息处理, 分析按钮操作的逻辑.
实验程序 : <<使用OllyDbg从零开始Cracking 第一章翻译>> 中附带的一个CrackMe.
使用OD加载目标程序, 当程序运行起来后, 暂停OD
经过实验, 点击菜单会触发主窗体WM_COMMAND消息.
如果直接捕获弹出的注册窗口的WM_COMMAND, 捕获不到.
准备捕获主窗体的WM_COMMAND消息, 找到菜单生成注册窗体的处理.
找到注册窗体的创建函数传入的注册窗口处理过程,从而找到注册窗体的所有消息处理实现逻辑.
点击菜单属于WM_COMMAND, 按照消息名称排序, 好找一些.
下完消息断电后, 确认一下是否消息断点已下.
F9, 让程序跑起来. 点击注册菜单. 程序被断在WM_COMMAND消息断点处.
00401128 > $ C8 000000 ENTER 0,0 ; 主窗体消息断点WM_COMMAND0040112C . 56 PUSH ESI0040112D . 57 PUSH EDI0040112E . 53 PUSH EBX0040112F . 837D 0C 02 CMP DWORD PTR SS:[EBP+C],200401133 . 74 5E JE SHORT CRACKME.0040119300401135 . 817D 0C 040200>CMP DWORD PTR SS:[EBP+C],2040040113C . 74 65 JE SHORT CRACKME.004011A3
F8往下走, 找到创建注册窗体的代码.
00401209 > 6A 00 PUSH 0 ; /lParam = NULL0040120B . 68 53124000 PUSH CRACKME.00401253 ; |DlgProc = CRACKME.0040125300401210 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner00401213 . 68 15214000 PUSH CRACKME.00402115 ; |pTemplate = "DLG_REGIS"00401218 . FF35 CA204000 PUSH DWORD PTR DS:[4020CA] ; |hInst = 004000000040121E . E8 7D020000 CALL <JMP.&USER32.DialogBoxParamA> ; \DialogBoxParamA
00401253 /. C8 000000 ENTER 0,0 ; 注册窗体消息处理过程00401257 |. 53 PUSH EBX00401258 |. 56 PUSH ESI00401259 |. 57 PUSH EDI0040125A |. 817D 0C 100100>CMP DWORD PTR SS:[EBP+C],110 ; WM_INITDIALOG00401261 |. 74 34 JE SHORT CRACKME.0040129700401263 |. 817D 0C 110100>CMP DWORD PTR SS:[EBP+C],111 ; WM_COMMAND0040126A |. 74 35 JE SHORT CRACKME.004012A10040126C |. 837D 0C 10 CMP DWORD PTR SS:[EBP+C],10 ; WM_CLOSE00401270 |. 0F84 81000000 JE CRACKME.004012F700401276 |. 817D 0C 010200>CMP DWORD PTR SS:[EBP+C],201 ; WM_LBUTTONDOWN0040127D |. 74 0C JE SHORT CRACKME.0040128B0040127F |. B8 00000000 MOV EAX,000401284 |> 5F POP EDI00401285 |. 5E POP ESI00401286 |. 5B POP EBX00401287 |. C9 LEAVE00401288 |. C2 1000 RETN 10
可以看到 CRACKME.004012A1 是注册窗体WM_COMMAND命令处理函数.
注册窗体一共处理了4种消息(窗体初始化, 退出, 确定, 命令处理)
在 地址 0040126A 上回车, 去看看按钮处理逻辑.
004012A1 |> 33C0 /XOR EAX,EAX ; 注册窗体: 按钮处理逻辑004012A3 |. 817D 10 EB0300>|CMP DWORD PTR SS:[EBP+10],3EB004012AA |. 74 4B |JE SHORT CRACKME.004012F7004012AC |. 817D 10 EA0300>|CMP DWORD PTR SS:[EBP+10],3EA004012B3 |. 75 3B |JNZ SHORT CRACKME.004012F0004012B5 |. 6A 0B |PUSH 0B ; /Count = B (11.)004012B7 |. 68 8E214000 |PUSH CRACKME.0040218E ; |Buffer = CRACKME.0040218E004012BC |. 68 E8030000 |PUSH 3E8 ; |ControlID = 3E8 (1000.)004012C1 |. FF75 08 |PUSH DWORD PTR SS:[EBP+8] ; |hWnd004012C4 |. E8 07020000 |CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA004012C9 |. 83F8 01 |CMP EAX,1004012CC |. C745 10 EB0300>|MOV DWORD PTR SS:[EBP+10],3EB004012D3 |.^72 CC \JB SHORT CRACKME.004012A1004012D5 |. 6A 0B PUSH 0B ; /Count = B (11.)004012D7 |. 68 7E214000 PUSH CRACKME.0040217E ; |Buffer = CRACKME.0040217E004012DC |. 68 E9030000 PUSH 3E9 ; |ControlID = 3E9 (1001.)004012E1 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd004012E4 |. E8 E7010000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA004012E9 |. B8 01000000 MOV EAX,1004012EE |. EB 07 JMP SHORT CRACKME.004012F7004012F0 |> B8 00000000 MOV EAX,0004012F5 |.^EB 8D JMP SHORT CRACKME.00401284004012F7 |> 50 PUSH EAX ; /Result004012F8 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd004012FB |. E8 B2010000 CALL <JMP.&USER32.EndDialog> ; \EndDialog00401300 |. B8 01000000 MOV EAX,100401305 \.^E9 7AFFFFFF JMP CRACKME.00401284如果F2 在地址 004012A1 上下普通代码断点, 已经断住了注册窗体的WM_COMMAND逻辑
为了只断住按钮(OK, Quit)的处理, 将断点下在004012B5
F9, 让程序跑起来. 填入Name, SN, 按下确定按钮
可以看出, 注册窗口消息处理只是得到用户输入
004012A1 |> 33C0 /XOR EAX,EAX ; 注册窗体: 按钮处理逻辑004012A3 |. 817D 10 EB0300>|CMP DWORD PTR SS:[EBP+10],3EB004012AA |. 74 4B |JE SHORT CRACKME.004012F7004012AC |. 817D 10 EA0300>|CMP DWORD PTR SS:[EBP+10],3EA004012B3 |. 75 3B |JNZ SHORT CRACKME.004012F0004012B5 |. 6A 0B |PUSH 0B ; /Count = B (11.)004012B7 |. 68 8E214000 |PUSH CRACKME.0040218E ; |name004012BC |. 68 E8030000 |PUSH 3E8 ; |ControlID = 3E8 (1000.)004012C1 |. FF75 08 |PUSH DWORD PTR SS:[EBP+8] ; |hWnd004012C4 |. E8 07020000 |CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA004012C9 |. 83F8 01 |CMP EAX,1004012CC |. C745 10 EB0300>|MOV DWORD PTR SS:[EBP+10],3EB004012D3 |.^72 CC \JB SHORT CRACKME.004012A1004012D5 |. 6A 0B PUSH 0B ; /Count = B (11.)004012D7 |. 68 7E214000 PUSH CRACKME.0040217E ; |pwd004012DC |. 68 E9030000 PUSH 3E9 ; |ControlID = 3E9 (1001.)004012E1 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd004012E4 |. E8 E7010000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA004012E9 |. B8 01000000 MOV EAX,1004012EE |. EB 07 JMP SHORT CRACKME.004012F7004012F0 |> B8 00000000 MOV EAX,0004012F5 |.^EB 8D JMP SHORT CRACKME.00401284004012F7 |> 50 PUSH EAX ; /Result004012F8 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd004012FB |. E8 B2010000 CALL <JMP.&USER32.EndDialog> ; \EndDialog00401300 |. B8 01000000 MOV EAX,100401305 \.^E9 7AFFFFFF JMP CRACKME.00401284从00401305继续往下走, 进行数据有效性的校验.
总结:通过消息断点, 可以从父窗口WMCOMMAND操作(菜单点击, 按钮点击)得到子窗体的消息处理过程.
- experiment : 用OD下消息断点, 捕获按钮操作.
- OD对按钮下断点的方法
- OD按钮单击事件下断点脚本
- OD下断点的方法
- Win7 od下send断点
- Win7 od下send断点
- Win7 od下send断点
- 【批量下断点】od里查询二进制字串时用
- 学OD -- 消息断点 RUN跟踪
- 学OD -- 消息断点 RUN跟踪
- OD-困难重重的追踪消息断点
- OD根据API下断点调试程序
- experiment : EXE使用UPX加壳后, 用OD查找OEP
- OD条件与消息断点的设置方法
- OD条件与消息断点的设置方法
- OD条件与消息断点的设置方法
- OD条件与消息断点的设置方法 (转)
- 4.OD-调试实例续(消息断点)
- uchome 数据字典详解
- 2013年暑假队内选拔赛题解3
- 2013年暑假队内选拔赛题解4
- ORACLE 11G RAC ASM磁盘全部丢失后的恢复
- 自制X86操作系统(1)-系统引导篇3(保护模式)
- experiment : 用OD下消息断点, 捕获按钮操作.
- 单车到飞船
- button1 cannot be resolved or is not a field
- poj 2653 Pick-up sticks
- Hardcoded string "Button", should use @string resource
- MySQL的concat,concat_ws,group_concat
- VMware vSphere 服务器虚拟化之二十三 桌面虚拟化之创建手动虚拟桌面池
- 【解决办法】ubuntu server 版的 ISO文件,在 Ultra ISO 打开,内容不对,写入到 启动U盘,也不能引导系统
- IOS随笔