发现XP的自动换行功能和状态栏功能就像鱼和熊掌一样不可兼得,于是用初学的知识试着改了一下,改了两晚上,也未成功。今天刚看了EnableMenuItem的结构定义。于是试着改了一下,居然成功了。嘿嘿。

    关于XP记事本,状态栏的无法选中 的修改,论坛好像没有,论坛只有Win7的记事本。希望不算重复。

可以在EnableMenuItem下断修改。

EnableMenuItem函数的结构如下: 

BOOL EnableMenuItem ( 
        HMENU hMenu            // handle to menu resource 
        UINT uIDEnableItem      // menu item to enable, disable or gray 
        UINT uEnable            // menu item flags 
        ); 

在ASM中调用的格式是: 

PUSH    uEnable 
PUSH    uIDEnableItem 
PUSH    hMenu 
CALL    [KERNEL32!EnableMenuItem] 

对于我们来说,重要的是找到那个激活菜单项的标志 


用ResHacker得知状态栏的ID为0x1b

去掉无关的EnableMenuItem调用后。只剩下两个EnableMenuItem
然后,运行全速OD。然后,就要确定是哪个EnableMenuItem了。当我们选中“自动换行”功能后,OD会停在
01002F1E  |> /50            push    eax                              ; |hMenu
01002F1F  |. |FF15 5C120001 call    dword ptr [<&USER32.EnableMenuIt>; \EnableMenuItem
01002F25  |. |E9 3D040000   jmp     notepadx.01003367

跳转来自 010031DA


来到
010031CC  |.  FF15 48120001 call    dword ptr [<&USER32.CheckMenuIte>; \CheckMenuItem
010031D2  |.  6A 01         push    1
010031D4  |.  90            push ebx
010031D5  |.  6A 03         push    3                                ; /Pos = 3
010031D7  |.  57            push    edi                              ; |hMenu
010031D8  |.  FFD6          call    esi                              ; \GetSubMenu
010031DA  |.^ E9 3FFDFFFF   jmp     notepadx.01002F1E

根据enablemenuitem的结构可知。只要Nop掉push ebx即可以让EnableMenuItem 失效。

即010031d4 改为nop 再另存修改。

试验即成功。


小心打击我。我很脆弱。