东风地区网站建设价格低深圳网站建设服务商
- 作者: 五速梦信息网
- 时间: 2026年03月21日 11:21
当前位置: 首页 > news >正文
东风地区网站建设价格低,深圳网站建设服务商,社区营销模式,做效果图比较好的模型网站文本编辑器/文本编辑框是应用层常见的键盘处理程序。微软泄露的WinXP源码下有文本编辑器Notepad的实现#xff1a;Microsoft_leaked_source_code\nt5src\Source\XPSP1\NT\shell\osshell\accesory\notepad文本编辑器的实现并不复杂#xff0c;微软又(被迫)提供了Sample#x…文本编辑器/文本编辑框是应用层常见的键盘处理程序。微软泄露的WinXP源码下有文本编辑器Notepad的实现Microsoft_leaked_source_code\nt5src\Source\XPSP1\NT\shell\osshell\accesory\notepad 文本编辑器的实现并不复杂微软又(被迫)提供了Sample因此本文就不重复造轮子了。本文从调试器的角度观察Notepad.exe如何消费键盘按键.Notepad接收WM_CHAR首先评估一下调试Notepad.exe的难易程度(虽然有源码我还是装作没有):无壳且看着像是C编译器生成Notepad.exe属于标准的Windows窗口程序 既然猜测Notepad.exe是标准的窗口程序那它一定按窗口程序的模板(如下)处理窗口消息而作为键盘按键的消费者WM_CHAR等按键消息亦包含其中: while (GetMessage((LPMSG)msg, (HWND)NULL, 0, 0)){if (TranslateAccelerator(hwndNP, hAccel, (LPMSG)msg) 0){TranslateMessage ((LPMSG)msg);DispatchMessage ((LPMSG)msg);}}在跟踪消费者WM_CHAR的行为前先要从茫茫众消息(窗体消息中有大量的鼠标移动的消息干扰分析)中筛选出WM_CHAR思路如下:定位GetMessage API分析GetMessage返回的消息筛选出WM_CHAR消息下面看我分步实现上述思路定位GetMessage API。先用IDA和windbg查找并定位Notepad.exe调用GetMessage API的身影:根据IDA分析,Notepad.exe在WinMain中进行消息循环0:001 x notepad!main ;先找符号winMain,再找GetMessage调用处
00007ff7e4d0ad6c NOTEPAD!wWinMain (no parameter info)0:001 uf NOTEPAD!wWinMain
00007ff7e4d0b010 488d4d0f lea rcx,[rbp0Fh] ;–获得窗体消息msg变量的地址
00007ff7e4d0b014 4533c0 xor r8d,r8d
00007ff7e4d0b017 33d2 xor edx,edx
00007ff7e4d0b019 48ff1500bc0100 call qword ptr [NOTEPAD!_imp_GetMessageW (00007ff7e4d26c20)]
00007ff7e4d0b020 0f1f440000 nop dword ptr [raxrax]
00007ff7e4d0b025 85c0 test eax,eax
简单说明上面windbg的输出:L5处:GetMessage需要4个参数参数1传入窗体消息MSG msg的地址。而我的OS是64位系统所以Notepad.exe也是64位程序。64位程序依次通过rcx/rdx/r8/r9传入函数的前4个参数;L9处GetMessage已经返回在此处下断点查看MSG msg栈变量就可以获得窗体消息。分析GetMessage返回的消息消息筛选出WM_CHAR消息为了使windbg能正确解析各个成员变量需要明确告知windbg从GetMessage返回的窗体消息是个MSG结构体。MSG定义在combase.dll中0:001 dt combase!MSG0x000 hwnd : Ptr64 HWND0x008 message : Uint4B0x010 wParam : Uint8B0x018 lParam : Int8B0x020 time : Uint4B0x024 pt : tagPOINT
在GetMessage返回处下断点windbg停下后解析MSG内容:0:001 bp 00007ff7e4d0b020
0:001 g
Breakpoint 0 hit0:000 dt combase!MSG [rbpf]0x000 hwnd : 0x00000000001001fe HWND0x008 message : 0xf0x010 wParam : 00x018 lParam : 0n00x020 time : 0xaa1dbe0x024 pt : tagPOINT
其中:L6处为窗口句柄这和前面Spy获得的窗口句柄值一致L7处为消息类型值0x0f对应WM_PAINT#define WM_SETTEXT 0x000C
#define WM_GETTEXT 0x000D
#define WM_GETTEXTLENGTH 0x000E
#define WM_PAINT 0x000F
#define WM_CLOSE 0x0010修改一下前面的断点让它变为条件断点(条件断点略复杂请移步windbg设置条件断点)每当Notepad.exe中按键windbg打印WM_CHAR0:001 bp 00007ff7e4d0b020 .block{r \(t0poi(rbp0xf0x08);.if(\)t00x102){.printf \WM_CHAR enter\;gc;};.else{gc;}}
0:000 g
WM_CHAR enterWM_CHAR enter随手在Notepad上输入几个字母windbg艰难的吐出几个日志。效果挺好就是挺卡的Notepad处理WM_CHAR/显示输出 Notepad.exe以文件映射的方式实现文本读写它会将收到的按键内容暂存在所映射内存中通过某种机制将这段内存内容显示在文本(文本编辑框)上。提一个问题如果修改这段内存是否导致最终文本内容被修改以下面文本为例:测试文本内容验证Notepad是以文件映射的方式更新文本内容用Cheat Engine附加到Notepad进程Memory view–Search–Find memory–在Find对话框中输入要查找的文本同时勾选Unicode复选框输即可在Cheat Engine中找到acpi.h中部分内容:左框为文本的部分内容;右框为相应的内存映射的内容至此可以确定Notepad.exe的内容被映射的内存块。PS:其实用windbg在内存映射中搜索指定字符串也可以取得相同结果。然而第一次尝试搜索时我以ansi字符串的方式搜索没有找到该字符疑惑中改用Cheat Engine0:003 s -u 0x20181900000 L?100000 State #windbg 搜索指定Unicode stringwindbg的搜索结果借用前面搜索指定字符串的输出结果可以确定文本内容被映射到内存地址:0000020181967050。#搜索acpi.h文件中第一行文字确定所在的内存起始地址:
0:001 s -u 0x20181900000 L?100000 typedef struct _GAS_20 {
0000020181967050 0074 0079 0070 0065 0064 0065 0066 0020 t.y.p.e.d.e.f. .
#以Unicode字符串形式打印起始地址的内容:
0:001 du 0000020181967050
0000020181967050 typedef struct _GAS_20 {.. UI
0000020181967090 NT8…AddrSpcID; //The
00000201819670d0 address space where the data str
0000020181967110 ucture or register exists…
0000020181967150
0000020181967190 //Defined values are above
00000201819671d0
0000020181967210 .. UINT8…RegBitWidth;
0000020181967250 ..//The size in bits of the give
0000020181967290 n register. ………..//When ad
00000201819672d0 dressing a data structure, this
0000020181967310 field must be zero… UINT8..
我们尝试修改该内存块如果修改内存后直接会反应到文本上那么可以证明Notepad确实通过内存映射的方式访问文件。修改前我们再核对一下acpi.h的面貌因为待会马上要整容了:测试文本原始内容#以Unicode string方式修改内存
0:004 eu 0x20181967050 I dont know what to write
#查看修改结果
0:004 du 0x20181967050
0000020181967050 I dont know what to write UI
0000020181967090 NT8…AddrSpcID; //The
00000201819670d0 address space where the data str
0000020181967110 ucture or register exists…
测试文本修改后的内容由此证明了我的猜想。链接键盘输入和显示输出过程 上一节提出了一个问题:Notepad通过某种机制将这段内存内容显示在文本(文本编辑框)上。这一节简单的回答这个问题。a.输入端:Notepad接收到WM_CHAR消息后通过DispatchMessage将消息传给文本编辑框句柄hwndEdit(为什么hwndEdit就是文本编辑框的句柄?这个可以参考张银奎老师的《格蠹汇编》一书)b.hwndEdit所在窗体的Callback处理WM_CHAR将键盘消息插入到内存映射所对应的Unicode String的恰当位置;c.输出端:由hwndEdit调用SetDlgItemText将Unicode String显示到Notepad.exe对应的文本编辑框。Notepad源码通过下列方式从hwndEdit窗口句柄获得文本内容: hEText (HANDLE) SendMessage( hwndEdit, EM_GETHANDLE, 0, 0 ); //获得文本句柄if( !hEText ) // silently return if we cant get it{return( bStatus );}pStart LocalLock( hEText ); //获得文本本文完下一篇将从应用层进入驱动层看下i8042.sys怎么处理键盘按键
- 上一篇: 东风地区网站建设价格it人力外包
- 下一篇: 东风地区网站建设价格低云南火电建设有限公司网站
相关文章
-
东风地区网站建设价格it人力外包
东风地区网站建设价格it人力外包
- 技术栈
- 2026年03月21日
-
东道设计报价seo营销技巧
东道设计报价seo营销技巧
- 技术栈
- 2026年03月21日
-
东城响应式网站建设邯郸最新通知今天
东城响应式网站建设邯郸最新通知今天
- 技术栈
- 2026年03月21日
-
东风地区网站建设价格低云南火电建设有限公司网站
东风地区网站建设价格低云南火电建设有限公司网站
- 技术栈
- 2026年03月21日
-
东莞 企业网站建设电脑浏览器打不开网页
东莞 企业网站建设电脑浏览器打不开网页
- 技术栈
- 2026年03月21日
-
东莞 网站 建设 雕塑太平洋手机官方网站
东莞 网站 建设 雕塑太平洋手机官方网站
- 技术栈
- 2026年03月21日






