📄 artic.asm
字号:
01002BBE |. 83FF 40 CMP EDI, 40 ; 这里开始比较控件/菜单ID了,
01002BC1 |. 8995 F0FDFFFF MOV DWORD PTR SS:[EBP-210], EDX ; 所以更改此处跳到自己的代码
01002BC7 |. 0F8F F9060000 JG 010032C6 ; 自己的代码最后必须跳回此处
;................
;................
;01002BBE与01002BC1改为,多余字节以NOP填充
01002BBE .- E9 5B040100 JMP 0101301E ; 跳到自己的代码处
01002BC3 90 NOP
01002BC4 90 NOP
01002BC5 90 NOP
01002BC6 90 NOP ; 多余字节以NOP填充
;01002BBE跳到此处,自己的代码,用于响应"背景色"菜单,弹出颜色对话框,保存颜色,创建画刷
0101301E 83FF 1C CMP EDI, 1C ; 比较控件ID
01013021 0F85 A3000000 JNZ 010130CA ; 如果wParam!=1C(不是"背景色"菜单)
01013027 90 NOP ; 则跳到010130CA,让给程序处理
01013028 A1 38980001 MOV EAX, DWORD PTR DS:[1009838] ; EAX=hEdit
; 以下几行初始化CHOOSECOLOR各成员
0101302D A3 A4AF0001 MOV DWORD PTR DS:[100AFA4], EAX ; /cc.hwndOwner=hEdit
01013032 C705 A0AF0001 24000>MOV DWORD PTR DS:[100AFA0], 24 ; |cc.lStructSize=24
0101303C C705 A8AF0001 00000>MOV DWORD PTR DS:[100AFA8], 0 ; |cc.hInstance=NULL
01013046 C705 ACAF0001 0000F>MOV DWORD PTR DS:[100AFAC], 0FF0000 ; |cc.rgbResult=蓝色
01013050 C705 B0AF0001 00AE0>MOV DWORD PTR DS:[100AFB0], 0100AE00 ; |cc.lpCustColors=0100AE00
0101305A C705 B4AF0001 01000>MOV DWORD PTR DS:[100AFB4], 1 ; |cc.Flags=CC_RGBINIT
01013064 C705 B8AF0001 00000>MOV DWORD PTR DS:[100AFB8], 0 ; |cc.lCustData=0
0101306E C705 BCAF0001 00000>MOV DWORD PTR DS:[100AFBC], 0 ; |cc.lpfnHook=0
01013078 C705 C0AF0001 00000>MOV DWORD PTR DS:[100AFC0], 0 ; |cc.lpTemplateName=NULL
01013082 50 PUSH EAX ; |保存EAX现场
01013083 68 A0AF0001 PUSH 0100AFA0 ; |参数&cc入栈
01013088 FF15 1C400101 CALL DWORD PTR DS:[<&comdlg32.ChooseColorW>] ; \ChooseColorW(&cc)
0101308E 09C0 OR EAX, EAX
01013090 74 37 JE SHORT 010130C9 ; if(EAX==0) 说明用户取消或出错
; 则不保存选择的颜色,交给程序处理
01013092 A1 ACAF0001 MOV EAX, DWORD PTR DS:[100AFAC]
01013097 A3 98AF0001 MOV DWORD PTR DS:[100AF98], EAX ; crBkgnd(RVA=AF98)=cc.rgbResult
; 保存颜色到crBkgnd
0101309C FF35 9CAF0001 PUSH DWORD PTR DS:[100AF9C] ; /参数hBrBkgnd(RVA==AF9C)画刷句柄入栈
010130A2 FF15 68100001 CALL DWORD PTR DS:[<&GDI32.DeleteObject>] ; \DeleteObject(hBrBkgnd)
; 删除原画刷防止内存泄漏
010130A8 FF35 98AF0001 PUSH DWORD PTR DS:[100AF98] ; /参数crBkgnd入栈
010130AE FF15 5D400101 CALL DWORD PTR DS:[101405D] ; \EAX=CreateSolidBrush(crBkgnd)
; 根据选择的颜色创建画刷
010130B4 A3 9CAF0001 MOV DWORD PTR DS:[100AF9C], EAX ; 画刷句柄保存到hBrBkgnd(RVA==AF9C)
010130B9 6A 01 PUSH 1 ; /
010130BB 6A 00 PUSH 0 ; |
010130BD FF35 38980001 PUSH DWORD PTR DS:[1009838] ; |参数hEdit入栈
010130C3 FF15 24120001 CALL DWORD PTR DS:[<&USER32.InvalidateRect>] ; \InvalidateRect(hEdit,NULL,TRUE)
; 强制更新编辑框使画刷与背景色生效
010130C9 58 POP EAX ; 还原EAX
010130CA 83FF 40 CMP EDI, 40 ; 原来的代码
010130CD 8995 F0FDFFFF MOV DWORD PTR SS:[EBP-210], EDX ; 原来的代码
010130D3 - E9 EBFAFEFF JMP 01002BC3 ; 跳回01002BC7继续执行.
;====================处理WM_DESTORY(==2)删除画刷对象以免内存泄漏======================
;WNDPROC
01003429 8BFF MOV EDI, EDI
0100342B . 55 PUSH EBP
0100342C . 8BEC MOV EBP, ESP
0100342E . 51 PUSH ECX
0100342F . 51 PUSH ECX
01003430 . 56 PUSH ESI
01003431 . 8B75 0C MOV ESI, DWORD PTR SS:[EBP+C] ; ESI=message;
01003434 .- E9 A7FC0000 JMP 010130E0
01003439 90 NOP
0100343A . 5A POP EDX
0100343B . 0F87 41020000 JA 01003682
01003441 . 0F84 B7010000 JE 010035FE
01003447 . 3BF2 CMP ESI, EDX
01003449 . 0F87 ED000000 JA 0100353C
0100344F . 0F84 DB000000 JE 01003530
01003455 . 8BC6 MOV EAX, ESI ; EAX=message;
01003457 . 48 DEC EAX ; message--;
01003458 . 48 DEC EAX ; message--;
01003459 . 0F84 C7000000 JE 01003526 ; if(message==WM_DESTORY) goto 1003526
;................
;................
01003526 > \6A 00 PUSH 0 ; 修改此句跳到自己的代码
01003528 . FF15 F4110001 CALL DWORD PTR DS:[010011F4] ; 此句被修改
0100352E .^ EB 8D JMP SHORT 010034BD ; 此句被修改
;................
;................
;修改后的代码01003526-01003528-0100352E,多余字节用NOP填充
01003526 >-\E9 25FC0000 JMP 01013150 ; Case 2 of switch 01003457
0100352B 90 NOP
0100352C 90 NOP
0100352D 90 NOP
0100352E 90 NOP
0100352F 90 NOP
01003530 > FF75 14 PUSH DWORD PTR SS:[EBP+14]
;................
;................
;自己的代码,删除画刷句柄hBrBkgdn(RVA==AF9C)
01013150 FF35 9CAF0001 PUSH DWORD PTR DS:[100AF9C] ; hBrBkgnd(RVA==AF9C)入栈
01013156 FF15 68100001 CALL DWORD PTR DS:[<&GDI32.DeleteObject>] ; DeleteObject(hBrBkgnd)删除画刷
; 释放内存,防止泄漏
0101315C 6A 00 PUSH 0 ; 原来的代码
0101315E FF15 F4110001 CALL DWORD PTR DS:[<&USER32.PostQuitMessage>>; USER32.PostQuitMessage
01013164 - E9 5403FFFF JMP 010034BD ; 原来的代码
保存更改到文件,然后运行修改过的程序,点击"背景色"菜单,就能弹出颜色对话框了,但是现在选择的颜色还不能起作用,因为要给编辑框设背景色或者文字色,必须处理WM_CTLCOLOREDIT消息.
;====================处理WM_CTLCOLOREDIT(==133)消息设置颜色画刷======================
因为程序原来是不处理WM_CTLCOLOREDIT的消息的,所以处理WM_CTLCOLOREDIT消息的过程与WM_COMMND及WM_DESTORY稍有不同,必须自己添加判断代码,再次来到WNDPROC:
;WNDPROC
01003429 8BFF MOV EDI, EDI ;
0100342B /. 55 PUSH EBP ; ESP-4
0100342C |. 8BEC MOV EBP, ESP ; EBP=ESP
0100342E |. 51 PUSH ECX ; ESP-4
0100342F |. 51 PUSH ECX ; ESP-4
01003430 |. 56 PUSH ESI ; ESP-4
01003431 |. 8B75 0C MOV ESI, DWORD PTR SS:[EBP+C] ; ESI=message
01003434 |. 83FE 1C CMP ESI, 1C ; =====修改这里跳到自己的代码====
01003437 |. 57 PUSH EDI ; =======此句被修改ESP-4=========
01003438 |. 6A 08 PUSH 8 ; =======此句被修改==============
0100343A |. 5A POP EDX ; EDX=8;; 如果不是WM_CTLCOLOREDIT消息
;................ ; 则最后必须跳回到此处
;................ ; 如果是WM_CTLCOLOREDIT消息则最后
; 必须返回函数值,结束WNDPROC,
; 而不再顺到这里,原因请见伪代码
;修改后的01003434-01003437-01003438,多余字节以NOP填充
01003434 .- E9 A7FC0000 JMP 010130E0
01003439 90 NOP
;................
;................
;01003434跳到此处,自己的代码,判断及处理WM_CTLCOLOREDIT消息
010130E0 81FE 33010000 CMP ESI, 133
010130E6 75 2B JNZ SHORT 01013113 ; 假如不是WM_CTLCOLOREDIT消息则
; 自己不处理,跳回原处,交给程序处理
010130E8 50 PUSH EAX ; 保存EAX现场
010130E9 FF35 94AF0001 PUSH DWORD PTR DS:[100AF94] ; /参数crText(RVA==AF94)入栈
010130EF FF75 10 PUSH DWORD PTR SS:[EBP+10] ; |参数wParam入栈
010130F2 FF15 61400101 CALL DWORD PTR DS:[1014061] ; \SetTextColor(wParam,crText)
010130F8 FF35 98AF0001 PUSH DWORD PTR DS:[100AF98] ; /参数crBkgnd(RVA==AF98)入栈
010130FE FF75 10 PUSH DWORD PTR SS:[EBP+10] ; |参数wParam入栈
01013101 FF15 65400101 CALL DWORD PTR DS:[1014065] ; \SetBkColor(wParam,crBkgnd)
01013107 58 POP EAX ; 恢复EAX
01013108 A1 9CAF0001 MOV EAX, DWORD PTR DS:[100AF9C] ; EAX=hBrBkgnd(RVA==AF9C)准备返回画刷
0101310D 5F POP EDI
0101310E 5E POP ESI
0101310F C9 LEAVE
01013110 C2 1000 RET 10 ; 平衡堆栈并返回画刷(eax),结束WNDPROC
01013113 83FE 1C CMP ESI, 1C ; 原来的代码
01013116 57 PUSH EDI ; 原来的代码
01013117 6A 08 PUSH 8 ; 原来的代码
01013119 - E9 1C03FFFF JMP 0100343A ; 0100343A
保存修改到文件,运行修改过的文件,现在可以设置文字色,背景色了,并且设置可以反应到编辑框了,但是程序刚启动的时候,默认的背景色和文字色都是黑色的,并且在有文字行才有背景色,显示不正常,并且看不到文字
默认背景色是黑色是因为,程序启动的时候开始WM_CTLCOLOREDIT消息中的SetBkColor和SetTextColor都在起作用了,但是这时候,crText(RVA==AF94)和crBkgnd(RVA==AF98)在内存中的值都是00000000,改变它们就能改变默认背景色和文字色.
在有文字的行才有背景色是因为,此时的hBrBkgnd(RVA==AF9C)是个无效的画刷句柄,程序不能用此画刷画背景,导致显示不正常.
所以也需要初始化hBrBkgnd.
初始化他们的最好地方是编辑框刚被创建还没有显示的时候.再次来到创建编辑框的地方
;创建编辑框:
01004765 |. 50 PUSH EAX ; |Style
01004766 |. 56 PUSH ESI ; |WindowName
01004767 |. 68 94170001 PUSH 01001794 ; |Class="Edit"
0100476C |. 68 00020000 PUSH 200 ; |ExtStyle=WS_EX_CLIENTEDGE
01004771 |. FF15 E0110001 CALL DWORD PTR DS:[<&USER32.CreateWindowExW>] ; \CreateWindowExW
01004777 |. 3BC3 CMP EAX, EBX ; 修改此然跳到自己的代码
01004779 |. A3 38980001 MOV DWORD PTR DS:[1009838], EAX ; 改这一句跳到0101311E
0100477E |. 0F84 2A020000 JE 010049AE ; 最后必须返回到这里
;................
;................
;修改后的代码01004777-01004779修改为
01004777 . 90 NOP
01004778 . 90 NOP
01004779 - E9 A1E90000 JMP 0101311E ; 跳到自己的代码0101311E
;自己的代码初始化crText,crBkgnd,hBrBkgnd
0101311E A3 38980001 MOV DWORD PTR DS:[1009838], EAX ; 原来的代码
01013123 68 FFFFFF00 PUSH 0FFFFFF ; RGB(FF,FF,FF)白色入栈
01013128 FF15 5D400101 CALL DWORD PTR DS:[101405D] ; CreateSolidBrush创建白色画刷
0101312E A3 9CAF0001 MOV DWORD PTR DS:[100AF9C], EAX ; 画刷句柄保存到hBrBkgnd(RVA==AF9C)
01013133 C705 98AF0001 FFFFF>MOV DWORD PTR DS:[100AF98], 0FFFFFF ; crBkgnd(RVA==AF98)=白色
0101313D A1 38980001 MOV EAX, DWORD PTR DS:[1009838] ; 原来的代码
01013142 3BC3 CMP EAX, EBX ; 原来的代码
01013144 - E9 3516FFFF JMP 0100477E ; 跳回原处交给程序处理
=======THE END!=========
;===============================================QQ:41086722=========================================
欢迎交流
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -