逆向初步,增加XP记事本功能,使用背景色,文字颜色,下划线,删除线
;====================保存选择的颜色到clText(RVA==AF94)========================
010030E0 |. 85C0 TEST EAX, EAX
010030E2 |. 0F84 7F020000 JE 01003367
0101301F FF35 84AB0001 PUSH DWORD PTR DS:[100AB84] ; 更新这一句跳到自己的保存代码
;0101301F更改为010030E8,多余字节用NOP填充
010030E8 - E9 32FF0000 JMP 01013000 ; 上一句更改后的代码
010030ED 90 NOP ; 多余字节用NOP填充
010030EE |. 8B1D 8C110001 MOV EBX, DWORD PTR DS:[<&USER32.SetCursor>] ; 自己的代码最后必须跳回此处.
;................
;................
;010030E8跳到此处,自己的代码
01013000 FF35 84AB0001 PUSH DWORD PTR DS:[100AB84] ; 还原0101301F被修改后的代码
01013006 A3 FCAF0001 MOV DWORD PTR DS:[100AFFC], EAX ; 保存EAX现场
0101300B 8B4424 28 MOV EAX, DWORD PTR SS:[ESP+28] ; EAX=pCHOOSEFONT.rgbColor
; 保存选择的颜色到EAX
0101300F A3 94AF0001 MOV DWORD PTR DS:[100AF94], EAX ; 保存到crText(RVA==AF94)
01013014 A1 FCAF0001 MOV EAX, DWORD PTR DS:[100AFFC] ; 还原EAX
01013019 - E9 D000FFFF JMP 010030EE ; 跳回原程序处
;====================在中处理"背景色"菜单(==1C)的WM_COMMAND(==111)消息======================
;首先用RegisterClass(Ex)函数定位WndProc(主窗口的消息处理函数)
RegisterClassEx只有一个参数WNDCLASSEX,此结构体定义如下
typedef struct {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX
一共12个成员,其中第3个成员就是窗口的消息处理函数.在堆栈中它们的顺序是反的,应该倒着数,也就是第10个成员
在OD中用 RegisterClassEx 函数找到以下初始化 WNDCLASSEX 结构体的代码
;RegisterClassEx注册窗口类
010044E2 |. C745 D0 30000000 MOV [LOCAL.12], 30 ; |成员cbSize=30
010044E9 |. FF15 1C120001 CALL DWORD PTR DS:[<&USER32.GetSystemMetrics>; \GetSystemMetrics
010044EF |. F7D8 NEG EAX
010044F1 |. 1BC0 SBB EAX, EAX
010044F3 |. 05 017F0000 ADD EAX, 7F01
010044F8 |. 50 PUSH EAX ; /RsrcName=EAX
010044F9 |. 33FF XOR EDI, EDI ; |
010044FB |. 57 PUSH EDI ; |hInst=NULL
010044FC |. FF15 D8110001 CALL DWORD PTR DS:[<&USER32.LoadCursorW>] ; \EAX=LoadCursorW(NULL,RsrcName);
01004502 |. 6A 02 PUSH 2 ; /RsrcName = 2.
01004504 |. 56 PUSH ESI ; |hInst
01004505 |. 8945 EC MOV [LOCAL.5], EAX ; |hCursor=EAX;
01004508 |. FF15 EC110001 CALL DWORD PTR DS:[<&USER32.LoadIconW>] ; \EAX=LoadIconW(hInst,RsrcName);
0100450E |. 57 PUSH EDI ; /Options => LR_DEFAULTCOLOR
0100450F |. 6A 10 PUSH 10 ; |Height = 10 (16.)
01004511 |. 6A 10 PUSH 10 ; |Width = 10 (16.)
01004513 |. 6A 01 PUSH 1 ; |Type = IMAGE_ICON
01004515 |. 6A 02 PUSH 2 ; |ResourceName = 2
01004517 |. 56 PUSH ESI ; |hInst
01004518 |. 8945 E8 MOV [LOCAL.6], EAX ; |成员hIcon(大图标)
0100451B |. FF15 D4110001 CALL DWORD PTR DS:[<&USER32.LoadImageW>] ; \LoadImageW
01004521 |. 8945 FC MOV [LOCAL.1], EAX ; 成员hIconSm(小图标)
01004524 |. 8D45 D0 LEA EAX, [LOCAL.12]
01004527 |. 50 PUSH EAX ; /参数pWndClassEx入栈
01004528 |. C745 F4 01000000 MOV [LOCAL.3], 1 ; 成员lpszMenuName;
0100452F |. 8975 E4 MOV [LOCAL.7], ESI ; |hInstance=hInst;
01004532 |. C745 F8 20900001 MOV [LOCAL.2], 01009020 ; 成员lpszClassName="Notepad"
01004539 |. C745 D8 29340001 MOV [LOCAL.10], 01003429 ; |lpfnWndProc=01003429
; 窗口处理函数01003429
01004540 |. C745 F0 06000000 MOV [LOCAL.4], 6 ; 成员hbrBackground
01004547 |. 897D D4 MOV [LOCAL.11], EDI ; 成员style
0100454A |. 897D DC MOV [LOCAL.9], EDI ; 成员cbClsExtra;
0100454D |. 897D E0 MOV [LOCAL.8], EDI ; |成员cbWndExtra;
01004550 |. FF15 D0110001 CALL DWORD PTR DS:[<&USER32.RegisterClassExW>; \RegisterClassExW
;................
;................