⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 artic.asm

📁 一个增加记事本软件功能的教程
💻 ASM
📖 第 1 页 / 共 3 页
字号:
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 + -