Whew!
I've finally finished porting MS10-071 to Win2k, and I added MS10-081 as well. To say that the first one was a HUGE PITA is an understatement. The changes are definitely extensive. MS10-081 is an extremely minor patch, but it took all day to track down the routine in the 2k version to patch since IDA couldn't find any debugging information.
Now that the IE patch is done, hopefully I can crank out a few easier ones this week before next week's update (and let's all hope that the one for November isn't as massive as this one was).
Here are my notes, in case anyone cares:
;==========================================================================
; MS10-071 patches ported to Windows 2000 SP4
;==========================================================================
;==========================================================================
; browseui.dll
;==========================================================================
; -------------------------------------------------------------------------
; CAutoComplete::_OnKeyDown
;
; Seems to block invalid VK_ keys, most notably VK_LEFT and VK_RIGHT
; -------------------------------------------------------------------------
$71545972: ; E991E60300909090
E991E60300 jmp $71584008
90 nop
90 nop
90 nop
$71584008: ; 8B450853575050E81C00000084C058750F83F81B740A83F8087405E98419FCFF83F824E94A19FCFF
8B4508 mov eax, [ebp+8] ; wParam
53 push ebx
57 push edi
50 push eax ; Save the VK_ code so we can restore it
50 push eax
E81C000000 call $zz ; IsSecureAutoCompleteNavigationKey
84C0 test al,al ; Is the key valid? (0 = no)
58 pop eax ; Restore the VK_ code
750F jnz $yy ; Letting any keys through that were deemed ok
83F81B cmp eax, $1B ; VK_ESCAPE -- allowing VK_ESCAPE
740A jz $yy
83F808 cmp eax, 8 ; VK_BACK -- allowing VK_BACK
7405 jz $yy
E98419FCFF jmp $715459AC ; @Return_One -- disallowing everything else, **including VK_LEFT and VK_RIGHT**
$yy:
83F824 cmp eax, $24 ; VK_HOME
E94A19FCFF jmp $7154597A
; -------------------------------------------------------------------------
; IsSecureAutoCompleteNavigationKey
;
; Validates VK_ codes
; -------------------------------------------------------------------------
$zz: ; 8BFF558BEC518B4D0832C083F909741E83F90D741983F920761683F924760F83F926740A83F928740583F92E7502B001595DC20400
8BFF mov edi, edi
55 push ebp
8BEC mov ebp, esp
51 push ecx ; I added the push ecx/pop ecx because the Win2k code isn't expecting ecx to change
8B4D08 mov ecx, [ebp+8] ; arg_0
32C0 xor al, al ; Default result is that the key is not ok
83F909 cmp ecx, 9 ; VK_TAB
741E jz $ww
83F90D cmp ecx, 0Dh ; VK_RETURN
7419 jz $ww
83F920 cmp ecx, 20h ; VK_SPACE -- letting other code validate everything from 0-$20 except tab and return
7616 jbe $tt
83F924 cmp ecx, 24h ; VK_HOME -- allowing VK_PRIOR, VK_NEXT, VK_END, and VK_HOME
760F jbe $ww
83F926 cmp ecx, 26h ; VK_UP -- allowing VK_UP
740A jz $ww
83F928 cmp ecx, 28h ; VK_DOWN -- allowing VK_DOWN
7405 jz $ww
83F92E cmp ecx, 2Eh ; VK_DELETE -- allowing VK_DELETE and letting other code validate everything else
7502 jnz $tt
$ww:
B001 mov al, 1 ; Key is ok
$tt:
59 pop ecx
5D pop ebp
C20400 ret 4
;==========================================================================
; mshtml.dll
;==========================================================================
; -------------------------------------------------------------------------
; CDoc::ExecHelper
;
; Version bump
; -------------------------------------------------------------------------
$63638409:
6873060000 push $673 ; Version update from 1650 to 1651
; -------------------------------------------------------------------------
; CServer::GetMETAFILEPICT
;
; Zeroes out a pointer after an object is freed
; -------------------------------------------------------------------------
$63686615: ; E8BE1515009090
E8BE151500 call $637D7BD8 ; REMOVE reloc at $63686618
90 nop
90 nop
$637D7BD8: ; 50FF15741258638B4510897804C3
50 push eax
FF1574125863 call ds:$63581274 ; GlobalFree -- ADD reloc at $637D7BDB
8B4510 mov eax, [ebp+$10] ; arg_8
897804 mov [eax+4],edi
C3 ret
; -------------------------------------------------------------------------
; CStyleSheet::OnStyleRuleRemoved
;
; Makes sure to release an object (memory leak fix)
; -------------------------------------------------------------------------
$636C9339: ; 7405
7405 jz $636C9340
; -------------------------------------------------------------------------
; CStyleSheetRule::QueryCreateUndo
;
; Null-pointer check
; -------------------------------------------------------------------------
$636CE5D1:
E912961000 jmp $637D7BE8
90 nop
90 nop
90 nop
$637D7BE8: ; 33C039411474088B49148B01FF605CC20C00
33C0 xor eax, eax
394114 cmp [ecx+$14],eax
7408 jz $637D7BF7
8B4914 mov ecx,[ecx+$14]
8B01 mov eax, [ecx]
FF605C jmp dword ptr [eax+$5C]
$637D7BF7:
C20C00 ret $C
; -------------------------------------------------------------------------
; ___report_gsfailure
;
; Got tired of having to figure out how to strip calls to this, so decided
; to finally add it. This will make porting other routins a lot easier.
; -------------------------------------------------------------------------
$637D7BFC:
mov edi, edi
push ebp
mov ebp, esp
sub esp, $330
push edi
mov [ebp+$228], eax
mov [ebp+$22C], ecx
mov [ebp+$230], edx
mov [ebp+$234], ebx
mov [ebp+$238], esi
mov [ebp+$23C], edi
mov [ebp+$210], ss
mov [ebp+$21C], cs
mov [ebp+$240], ds
mov [ebp+$244], es
mov [ebp+$248], fs
mov [ebp+$24C], gs
pushf
pop [ebp+$218]
mov [ebp+$208], $10001
mov eax, [ebp+4]
mov [ebp+$220], eax
lea eax, [ebp+4]
mov [ebp+$214], eax
lea eax, [ebp+4]
mov eax, [eax-4]
mov [ebp+$224], eax
push $14
pop ecx
xor eax, eax
lea edi, [ebp+$330]
rep stosd
mov [ebp+$330], $C0000409
mov eax, [ebp+4]
mov [ebp+$324], eax
lea eax, [ebp+$330]
mov [ebp-8], eax
lea eax, [ebp+$208]
mov [ebp-4], eax
mov eax, $637D7D10 ; offset ___security_cookie
mov [ebp+$2E0], eax
mov eax, $637D7D14 ; offset ___security_cookie_complement
mov [ebp+$2DC], eax
; Unlike the XP version, this one isn't automatically
; importing SetUnhandledExceptionFilter. Also, there
; isn't room at the beginning to add an import, so we
; have to get it the hard way with calls to
; GetModuleHandleA and GetProcAddress.
push $637D6714 ; offset aKernel32
call ds:$635812C4 ; GetModuleHandleA
test eax, eax
jz @Abort
push $ ; offset aSetUnhandledExceptionFilter
push eax
call ds:$63581298 ; GetProcAddress
test eax, eax
jz @Abort
push 0
call eax ; SetUnhandledExceptionFilter
lea eax, [ebp-8]
push eax
call ds:$63581208 ; UnhandledExceptionFilter
@Abort:
push $502
call ds:$63581204 ; GetCurrentProcess
push eax
call ds:$63581200 ; TerminateProcess
leave
ret
$637D7D10:
___security_cookie dd $0000BB40
$637D7D14:
___security_cookie_complement dd $FFFF44BF
$637D7D18:
aSetUnhandledExceptionFilter db "SetUnhandledExceptionFilter", 0
; -------------------------------------------------------------------------
; __security_check_cookie
; -------------------------------------------------------------------------
$637D7D34:
cmp ecx, [$637D7D10] ; ___security_cookie
jnz $637D7BFC ; ___report_gsfailure
test ecx, $FFFF0000
jnz $637D7BFC ; ___report_gsfailure
ret
; -------------------------------------------------------------------------
; IsCSSContentTypeHeader
; -------------------------------------------------------------------------
$637D7D50: ; Copied routine here, updated addresses, and added relocs
; -------------------------------------------------------------------------
; CDwnBindData::OnProgress
; -------------------------------------------------------------------------
$6377A4E8:
9090909090 nop (5) ; MUST remove reloc to $6377A4E9
push ebx ; same: no change
call $637D7DD0
mov [esi+$108], eax
nop (10)
$6377A525:
9090909090 nop (5) ; MUST remove reloc to $6377A526
$6377A539:
call $637D7DD0
mov [esi+$108], eax
nop (6)
$637D7DD0:
push ebp
mov ebp, esp
push ebx
push ecx
mov ebx,[ebp+8] ; lpString1
push ebx
call ds:wcslen
pop ecx
push eax
push ebx
call $$637D7D50 ; IsCSSContentTypeHeader
movzx eax, al
pop ecx
pop ebx
mov esp, ebp
pop ebp
ret 4
; -------------------------------------------------------------------------
; CDwnBindData::ReportProgress
; -------------------------------------------------------------------------
$6377AC75:
9090909090 nop (5) ; MUST remove reloc to $6377AC76
$6377AC7D:
call $637D7DD0
mov [esi+$DC], eax
nop (10)
; -------------------------------------------------------------------------
; COleSiteEventSink::Invoke
; -------------------------------------------------------------------------
$637B4FBE: ; E9312E020090
E9312E0200 jmp $637D7DF4
90 nop
$637D7DF4: ; F646B0017408897D50E927D3FDFF8D5EA8578BCBE9B7D1FDFF
F646B001 test byte ptr [esi-50h], 1 ; In the XP version this is at -54h
7408 jz $637D7E02
897D50 mov [ebp+$50], edi
E927D3FDFF jmp $637B5129
$637D7E02:
8D5EA8 lea ebx, [esi-$58]
57 push edi
8BCB mov ecx, ebx
E9B7D1FDFF jmp $637B4FC4
; -------------------------------------------------------------------------
; CLinkElement::HandleLinkedObjects
; -------------------------------------------------------------------------
$637B7E7C: ; 9090E98DFF0100
90 nop
90 nop
E98DFF0100 jmp $637D7E10
$637D7E10: ; 391F0F849E00FEFF8BCEE867F8FDFFE95F00FEFF
391F cmp [edi], ebx
0F849E00FEFF jz $637B7EB6
8BCE mov ecx, esi
E867F8FDFF call $637B7686 ; CLinkElement::GetAArel
E95F00FEFF jmp $637B7E83
$637B7D4D: ; E9FA000200
E9FA000200 jmp $637D7E4C
$637D7E4C: ; 53E8D2FFFFFF6A018D45D4E9F6FEFDFF
53 push ebx
E8D2FFFFFF call $637D7E24 ; CStyleSheet::SetIsFromCssSource
6A01 push 1
8D45D4 lea eax, [ebp-$2C]
E9F6FEFDFF jmp $637B7D52
; -------------------------------------------------------------------------
; CStyleSheet::SetIsFromCssSource
;
; Added outright, no conversion necessary
; -------------------------------------------------------------------------
$637D7E24:
mov edi, edi
push ebp
mov ebp, esp
mov edx, [ebp+8]
mov eax, [ecx+5Ch]
shl edx, 7
xor edx, [eax+34h]
and edx, 80h
xor [eax+34h], edx
mov dword ptr [ecx+64h], 1
pop ebp
ret 4
; -------------------------------------------------------------------------
; CLinkElement::ReleaseStyleSheet
;
; Only one instruction is different from the XP version
; -------------------------------------------------------------------------
$637D7E5C:
mov edi, edi
push esi
mov esi, ecx
mov ecx, [esi+20h]
test ecx, ecx
jz $637D7E7C
push 1
call $636CB809 ; CStyleSheet::StopDownloads
mov eax, [esi+20h]
mov ecx, [eax]
push eax
call dword ptr [ecx+74h] ; ecx+84h in the XP version
and dword ptr [esi+20h], 0
$637D7E7C:
pop esi
ret
; -------------------------------------------------------------------------
; CLinkElement::Passivate
;
; No change in functionality; the patch changes it to re-use the new
; CLinkElement::ReleaseStyleSheet routine
; -------------------------------------------------------------------------
$637B7B17:
mov ecx, esi
call $637D7E5C ; CLinkElement::ReleaseStyleSheet
; condesed the rest of the routine and put 20 NOP's at the end
; -------------------------------------------------------------------------
; CLinkElement::RemoveStyleSheet
;
; Copied as-is, only had to fix up CALLs
; -------------------------------------------------------------------------
$637D7E80:
mov edi, edi
push ebp
mov ebp, esp
push esi
mov esi, ecx
mov ecx, [ebp+arg_0]
test ecx, ecx
jz short $637D7EA6
push 6
call $6362EAA7 ; CMarkup::GetLookasidePtr
test eax, eax
jz short loc_7DEB6B64
push 0
push dword ptr [esi+20h]
mov ecx, eax
call $636C2FE3 ; CStyleSheetArray::ReleaseStyleSheet
$637D7EA6:
pop esi
pop ebp
ret 4
; -------------------------------------------------------------------------
; CLinkElement::Notify
;
; The first part reuses CLinkElement::RemoveStyleSheet rather than having
; separate code here (no functionality change). The second part adds a
; null pointer check. The reduction in code size from the first patch
; conveniently leaves more than enough room for the second patch.
; -------------------------------------------------------------------------
$637B7F66: ; F64324027530508BCEE80CFF0100396E200F84C7000000E82D2DE6FFE9AC000000
F6432402 test byte ptr [ebx+24h], 2
7530 jnz $637B7F9C
50 push eax
8BCE mov ecx, esi
E80CFF0100 call $637D7E80 ; CLinkElement::RemoveStyleSheet
EB1C jmp $637B7F92
$637B7F76:
396E20 cmp [esi+$20], ebp
0F84C7000000 jz $637B8046
E82D2DE6FF call $6361ACB1 ; CElement::GetAAdisabled
E9AC000000 jmp $637B8035
nop (9)
$637B8030:
E941FFFFFF jmp $637B7F76
; -------------------------------------------------------------------------
; CStyleSheet::IsInternetOrRestrictedCrossDomainCSSDownload
;
; Added mostly as-is; only one instruction differs and had to fixup CALLs
; -------------------------------------------------------------------------
$637D7EAC:
mov edi, edi
push ebp
mov ebp, esp
sub esp, 0Ch
push ebx
push esi
push edi
mov ebx, ecx
mov [ebp-4], 1
call $636C91E0 ; CStyleSheet::GetMarkup(void)
mov ecx, ebx
mov edi, eax
call $636C91D1 ; CStyleSheet::GetDocument(void)
test edi, edi
mov esi, eax
jz $637D7F28
test esi, esi
jz $637D7F28
push 0
mov ecx, esi
call $63659582 ; CDoc::EnsureSecurityManager(int)
test eax, eax
jl $637D7F28
add esi, 424h ; XP version uses 430h
mov eax, [esi]
mov eax, [eax]
push 0
lea ecx, [ebp-8]
push ecx
mov ecx, edi
mov [ebp-$C], eax
call $635FAB04 ; CMarkup::Url(void)
push eax
push dword ptr [esi]
mov eax, [ebp-$C]
call dword ptr [eax+14h] ; Same offset for 2k and XP
test eax, eax
jl $637D7F28
cmp [ebp-8], 3
jz $637D7F1E
cmp [ebp-8], 4
jz $637D7F1E
and [ebp-4], 0
jmp $637D7F28
$637D7F1E:
mov ecx, ebx
call $636C9E79 ; CStyleSheet::IsSheetAndMarkupCrossDomain(void)
mov [ebp-4], eax
$637D7F28:
mov eax, [ebp-4]
pop edi
pop esi
pop ebx
leave
ret
; -------------------------------------------------------------------------
; CLinkElement::OnDwnChan
; -------------------------------------------------------------------------
$637B77DB:
sub esp, $28 ; Need to make room for another variable
$637B79B1:
nop
nop
nop
jmp $637D7F30
$637D7F30:
mov ecx, [esi+24h] ; Same offset in 2k and XP
mov [ebp-$28], ebx ; var_28 in 2k, var_10 in XP
call $63781CD1 ; CDwnCtx::GetFinalUrl
mov edi, eax
cmp edi, ebx
jz $637D7F6E
push 5
push $63597D28 ; "http:"
push 5
push edi ; Str
call $636A2BB3 ; _7csnipre
test eax, eax
jnz $637D7F67
push 6
push $63597D34 ; "https:"
push 6
push edi ; Str
call $636A2BB3 ; _7csnipre
test eax, eax
jz $637D7F6E
$637D7F67:
mov [ebp-$28], 1 ; var_28 in 2k, var_10 in XP
$637D7F6E:
push dword ptr [esi+24h] ; Same offset in 2k and XP
mov ecx, [esi+20h] ; Same offset in 2k and XP
call $637D7FCC ; CStyleSheet::DetermineIfFromCssSource (old one was at $636C95E2, see below for more info)
cmp [ebp-$28], ebx ; var_28 in 2k, var_10 in XP
jz $637B79B9
mov ecx, [esi+20h] ; Same offset in 2k and XP
call $637D7EAC ; CStyleSheet::IsInternetOrRestrictedCrossDomainCSSDownload
test eax, eax
jz $637B79B9
mov eax, [esi+20h] ; Same offset in 2k and XP
mov eax, [eax+5Ch] ; Same offset in 2k and XP
test byte ptr [eax+34h], 80h ; Same offset in 2k and XP
jnz $637B79B9
push [ebp-$1C] ; var_1C in 2k, var_C in XP
mov ecx, esi
call $637D7E80 ; CLinkElement::RemoveStyleSheet
lea edi, [esi+34h] ; Same offset in 2k and XP
cmp [edi], ebx
jz $637D7FBE
mov ecx, [ebp-$1C] ; var_1C in 2k, var_C in XP
push edi
call $6365B9C9 ; CMarkup::UnblockScriptExecution
mov [edi], ebx
$637D7FBE:
mov ecx, esi
call $637D7E5C ; CLinkElement::ReleaseStyleSheet
jmp $637B7A3E
; -------------------------------------------------------------------------
; CStyleSheet::DetermineIfFromCssSource
;
; Decided to copy the updated routine outright and change the references
; to point to this one instead of to the original (there are only two
; references and one of them is in our CLinkElement::OnDwnChan patch above)
;
; No changes to the new routine were needed beyond fixing up CALLs.
;
; Filled the original with NOPs so we can use it for some purpose later.
; -------------------------------------------------------------------------
$636CB584:
call $637D7FCC ; Change call in CStyleSheet::OnDwnChan to point to our new routine
$637D7FCC:
mov edi, edi
push ebp
mov ebp, esp
push esi
mov esi, ecx
mov ecx, [ebp+8] ; arg_0
call $6379030E ; CCssCtx::IsMimeTypeCss
test eax, eax
jz $637D7FE4
push 1
jmp $637D7FEF
$637D7FE4:
mov eax, [esi+5Ch]
test byte ptr [eax+34h], 80h
jz $637D7FF6
push 0
$637D7FEF:
mov ecx, esi
call $637D7E24 ; CStyleSheet::SetIsFromCssSource(int)
$637D7FF6:
pop esi
pop ebp
ret 4
; -------------------------------------------------------------------------
; CStyleSheet::OnDwnChan
;
; Ran out of slack in the original code section, but luckily there was room for
; additional section entries. Created a new code section called "patch". I can
; grow this section at will, but set its initial size at 16k bytes.
; -------------------------------------------------------------------------
$636CB3D9:
sub esp, $28 ; Need to make room for two more variables
$636CB57F:
mov [ebp-$24], edi
mov [ebp-$28], ebx
jmp $637E6000
$636CB58A:
cmp edi, ebx
jz $636CB5B5
mov edi, [esi+$60]
mov ecx, esi
mov [esi+$64], ebx ; This and the next instruction save us a byte
inc dword ptr [esi+$64] ; This way, the patch is closer to what we have to add from XP.
$637E6000:
mov ecx, [esi+30h] ; Same offset in 2k and XP
call $63781CD1 ; CDwnCtx::GetFinalUrl
mov edi, eax
cmp edi, ebx
jz $637E603B
push 5
push $63597D28 ; "http:"
push 5
push edi ; Str
call $636A2BB3 ; _7csnipre
test eax, eax
jnz $637E6034
push 6
push $63597D34 ; "https:"
push 6
push edi ; Str
call $636A2BB3 ; _7csnipre
test eax, eax
jz $637E603B
$637E6034:
mov [ebp-$28], 1 ; var_28 in 2k, var_14 in XP
$637E603B:
push dword ptr [esi+30h] ; Same offset in 2k and XP
mov ecx, esi
call $637D7FCC ; CStyleSheet::DetermineIfFromCssSource (old one was at $636C95E2, see above for more info)
cmp [ebp-$28], ebx ; var_28 in 2k, var_14 in XP
jz $637E60C9
mov ecx, esi
call $637D7EAC ; CStyleSheet::IsInternetOrRestrictedCrossDomainCSSDownload
test eax, eax
jz $637E60C9
mov eax, [esi+5Ch] ; Same offset in 2k and XP
test byte ptr [eax+34h], 80h ; Same offset in 2k and XP
jnz $637E60C9
mov eax, [esi] ; Get pointer to CStyleSheet VMT
push esi
call dword ptr [eax+4] ; Call to CStyleSheet::PrivateAddRef
mov eax, [esi+20h] ; Same offset in 2k and XP
cmp eax, ebx
mov [ebp-$28], ebx ; var_28 in 2k, var_14 in XP
jz $637E6080
mov eax, [eax+24h] ; Same offset in 2k and XP
cmp eax, ebx
jz $637E6098
push ebx
push esi
mov ecx, eax
call $636C2FE3 ; CStyleSheetArray::ReleaseStyleSheet
jmp $637E6098
$637E6080:
mov ecx, [esi+1Ch] ; Same offset in 2k and XP
cmp ecx, ebx
jz $637E6098
cmp byte ptr [ecx+14h], 3Bh
jnz $637E6098
push [ebp-$C] ; var_C in 2k, var_8 in XP
mov [ebp-$28], ecx ; var_28 in 2k, var_14 in XP
call $637D7E80 ; CLinkElement::RemoveStyleSheet
$637E6098:
lea edi, [esi+38h] ; Same offset in 2k and XP
cmp [edi], ebx
jz $637E60AA
mov ecx, [ebp-$C] ; var_C in 2k, var_8 in XP
push edi
call $6365B9C9 ; CMarkup::UnblockScriptExecution
mov [edi], ebx
$637E60AA:
mov ecx, [ebp-$28] ; var_28 in 2k, var_14 in XP
cmp ecx, ebx
jz $637E60B6
call $637D7E5C ; CLinkElement::ReleaseStyleSheet
$637E60B6:
push ebx
mov ecx, esi
call $636CB658 ; CStyleSheet::SetCssCtx
mov eax, [esi] ; Get pointer to CStyleSheet VMT
push esi
call dword ptr [eax+8] ; Call to CStyleSheet::PrivateRelease
jmp $636CB639
$637E60C9:
mov edi, [ebp-$24]
jmp $636CB58A
;==========================================================================
; shdocvw.dll
;==========================================================================
; -------------------------------------------------------------------------
; CIntelliForms__ActiveElementChanged
; -------------------------------------------------------------------------
$71759EEF:
6A38 push $38 ; Allocating room for one more class member variable
; -------------------------------------------------------------------------
; CIntelliForms::CAutoSuggest::CAutoSuggest
; -------------------------------------------------------------------------
$71759691:
897E34 mov [esi+34h], edi ; Initialize our new member variable to 1
753C jnz $717596D2
893DEC827B71 mov [$717B82EC], edi ; ?s_fRegisteredWndClass@CAutoSuggest@CIntelliForms@@0HA -- needs reloc (REMOVE the one at $7175969D)
33C0 xor eax, eax
8D7DD0 lea edi, [ebp-$30]
B90C000000 mov ecx, $0C ; 12 dwords -- clear the entire structure
F3AB rep stosd
0404 add al, 4
8945E0 mov [ebp-$20], eax ; var_30.cbWndExtra
042C add al, $2C
8945D0 mov [ebp-$30], eax ; var_30.cbSize
A128817B71 mov eax, [$717B8128] ; _g_hinst -- needs reloc (REMOVE the one at $71759694)
8945E4 mov [ebp-$1C], eax ; var_30.hInstance
C745D830937571 mov [ebp-$28], $71759330 ; offset ?WndProc@CAutoSuggest@CIntelliForms@@SGJPAUHWND__@@IIJ@Z -- needs reloc (REMOVE the one at $717596B0)
C745F8C8C57071 mov [ebp-8], $7170C5C8 ; offset aIntelliformcla -- needs reloc (REMOVE the one at $717596CD)
8D45D0 lea eax, [ebp-$30]
50 push eax
FF1550187071 call ds:$71701850 ; RegisterClassExWrapW -- needs reloc (REMOVE the one at $717596DB)
$717596D2:
5F pop edi
8BC6 mov eax, esi
5E pop esi
C9 leave
C20C00 ret $C
nop (2)
; -------------------------------------------------------------------------
; CIntelliForms::CAutoSuggest::DetachFromInput
; -------------------------------------------------------------------------
$717596F0:
57 push edi
33FF xor edi, edi
E8E4FFFFFF call $717596DC
$717596DC:
8D5E18 lea ebx, [esi+18h] ; Same offset in 2k and XP
8B03 mov eax, [ebx]
47 inc edi
897E34 mov [esi+34h], edi
4F dec edi
C3 ret
; -------------------------------------------------------------------------
; MustValidateEventsFromElement
;
; Copied as-is, only had to fix up addresses and add relocs
; -------------------------------------------------------------------------
$717B60A0:
; -------------------------------------------------------------------------
; CIntelliForms::CAutoSuggest::AttachToInput
; -------------------------------------------------------------------------
$71759DD1:
E9CAC30500 jmp $717B61A0
90 nop
$717B61A0:
57 push edi
E8FAFEFFFF call $717B60A0 ; MustValidateEventsFromElement
884634 mov [esi+$34], al ; Same offset in 2k and XP
837E0800 cmp dword ptr [esi+8], 0 ; Same offset in 2k and XP
0F85483CFAFF jnz $71759DFB
E91F3CFAFF jmp $71759DD7
; -------------------------------------------------------------------------
; IsKeyDown
;
; Copied as-is, only had to fix up addresses and add relocs
; -------------------------------------------------------------------------
$717B61B8:
8BFF mov edi, edi
55 push ebp
8BEC mov ebp, esp
FF7508 push [ebp+8] ; nVirtKey
FF15701A7071 call [$71701A70] ; GetKeyState
33C9 xor ecx, ecx
6685C0 test ax, ax
0F9CC1 setl cl
8BC1 mov eax, ecx
5D pop ebp
C20400 ret 4
; -------------------------------------------------------------------------
; IsSecureAutoCompleteNavigationKey
;
; Copied as-is
; -------------------------------------------------------------------------
$717B61D4:
8BFF mov edi, edi
55 push ebp
8BEC mov ebp, esp
8B4D08 mov ecx, [ebp+8] ; arg_0
32C0 xor al, al
83F909 cmp ecx, 9
741E jz $717B6201
83F90D cmp ecx, $D
7419 jz $717B6201
83F920 cmp ecx, 20h
7616 jbe $717B6203
83F924 cmp ecx, $24
760F jbe $717B6201
83F926 cmp ecx, $26
740A jz $717B6201
83F928 cmp ecx, $28
7405 jz $717B6201
83F92E cmp ecx, $2E
7502 jnz $717B6203
$717B6201:
B001 mov al, 1
$717B6203:
5D pop ebp
C20400 ret 4
; -------------------------------------------------------------------------
; CIntelliForms::GetDocumentWindow
;
; Copied as-is, only had to fix up addresses and add relocs
; -------------------------------------------------------------------------
$717B6208:
8BFF mov edi, edi
55 push ebp
8BEC mov ebp, esp
51 push ecx
8365FC00 and [ebp-4], 0
8D45FC lea eax, [ebp-4]
50 push eax
FF7140 push dword ptr [ecx+$40] ; Same offset in 2k and XP
FF15xxxxxxxx call [$71701830] ; IUnknown_GetWindow
8B45FC mov eax, [ebp-4]
C9 leave
C3 ret
; -------------------------------------------------------------------------
; CIntelliForms::CAutoSuggest::_IsHTMLDocumentFocused
;
; Copied as-is, only had to fix up addresses and add relocs
; -------------------------------------------------------------------------
$717B6224:
8B4904 mov ecx, [ecx+4] ; Same offset in 2k and XP
85C9 test ecx, ecx
56 push esi
7409 jz $717B6235
E8D7FFFFFF call $717B6208 ; CIntelliForms::GetDocumentWindow
8BF0 mov esi, eax
EB02 jmp $717B6237
$717B6235:
33F6 xor esi, esi
$717B6237:
85F6 test esi, esi
740F jz $717B624A
FF157C1A7071 call [$71701A7C] ; GetFocus
3BC6 cmp eax, esi
7505 jnz $717B624A
33C0 xor eax, eax
40 inc eax
5E pop esi
C3 ret
$717B624A:
33C0 xor eax, eax
5E pop esi
C3 ret
; -------------------------------------------------------------------------
; CIntelliForms::CAutoSuggest::_IsKeyEventAllowed
;
; Copied as-is, only had to fix up addresses
; -------------------------------------------------------------------------
$717B6250:
8BFF mov edi, edi
55 push ebp
8BEC mov ebp, esp
53 push ebx
32DB xor bl, bl
385934 cmp [ecx+$34], bl ; Our new member variable
7424 jz $717B6281
E8C2FFFFFF call $717B6224 ; CIntelliForms::CAutoSuggest::_IsHTMLDocumentFocused
84C0 test al, al
741D jz $717B6283
FF7508 push [ebp+8] ; nVirtKey
E866FFFFFF call $717B61D4 ; IsSecureAutoCompleteNavigationKey
84C0 test al, al
740F jz $717B6281
FF7508 push [ebp+8] ; nVirtKey
E83EFFFFFF call $717B61B8 ; IsKeyDown
85C0 test eax, eax
0F95C3 setnz bl
EB02 jmp $717B6283
$717B6281:
B301 mov bl, 1
$717B6283:
8AC3 mov al, bl
5B pop ebx
5D pop ebp
C20400 ret 4
; -------------------------------------------------------------------------
; CIntelliForms::CAutoSuggest::_GenerateSecureKeyMessage
;
; Copied as-is, only had to fix up addresses and add relocs
; -------------------------------------------------------------------------
$717B628C:
8BFF mov edi, edi
55 push ebp
8BEC mov ebp, esp
53 push ebx
56 push esi
FF750C push [ebp+$C] ; nVirtKey
8BF1 mov esi, ecx
E8B3FFFFFF call $717B6250 ; CIntelliForms::CAutoSuggest::_IsKeyEventAllowed
8AD8 mov bl, al
84DB test bl, bl
7411 jz $717B62B4
6A00 push 0
FF750C push [ebp+$C] ; nVirtKey
FF7508 push [ebp+8] ; Msg
FF7614 push dword ptr [esi+$14] ; Same offset in 2k and XP
FF1524187071 call [$71701824] ; PostMessageWrapW
$717B62B4:
5E pop esi
8AC3 mov al, bl
5B pop ebx
5D pop ebp
C20800 ret 8
; -------------------------------------------------------------------------
; CIntelliForms::CAutoSuggest::HandleEvent
;
; Extensive changes. Rewrote some parts to save space and keep the code
; from becoming too fragmented. The patches seem to deal with the autocomplete
; vulnerabulity.
; -------------------------------------------------------------------------
$717B62BC:
FF2524187071 jmp [$71701824] ; PostMessageWrapW (space-saving measure: see below)
; -------------------------------------------------------------------------
$71759C61:
7505 jnz $71759C68
$71759C63:
; These three instructions save us 2 bytes
47 inc edi ; edi is initially 0
897DF0 mov [ebp-$10], edi ; edi is 1
4F dec edi ; set edi back to 0
$71759C68:
397DF4 cmp [ebp-$C], edi
7427 jz $71759C94
51 push ecx
6809800000 push $8009
89D9 mov ecx, ebx
E812C60500 call $717B628C ; CIntelliForms::CAutoSuggest::_GenerateSecureKeyMessage
84C0 test al, al
7416 jz $71759C94
837D0C08 cmp [ebp+$C], 8
7510 jnz $71759C94
57 push edi
6A08 push 8
6808800000 push $8008
FF7314 push dword ptr [ebx+$14]
E828C60500 call $717B62BC ; PostMessageWrapW_wrapper -- saves us a byte which lets us squeeze everything in
; -------------------------------------------------------------------------
$7175992F:
7E65 jle $71759996
$71759994:
EBEA jmp $71759980 ; Saves 3 bytes
$71759996:
8B06 mov eax, [esi]
83651000 and [ebp+$10], 0
8D4D10 lea ecx, [ebp+$10]
51 push ecx
56 push esi
FF504C call dword ptr [eax+$4C]
83FF03 cmp edi, 3
7406 jz $717599AF
F6451001 test byte ptr [ebp+$10], 1 ; psz1
74D1 jz $71759980 ; Saves 4 bytes
$717599AF:
8B4310 mov eax, [ebx+$10]
8B08 mov ecx, [eax]
6A00 push 0
8D550C lea edx, [ebp+$C] ; nHeight
52 push edx
50 push eax
FF510C call dword ptr [ecx+$C]
85C0 test eax, eax
7CBE jl $71759980 ; Saves 4 bytes
F6450C01 test byte ptr [ebp+$C], 1 ; nHeight
75B8 jnz $71759980 ; Saves 4 bytes
807B3400 cmp byte ptr [ebx+$34], 0
740B jz $717599D9
6A01 push 1
E8E3C70500 call $717B61B8 ; IsKeyDown
85C0 test eax, eax
7411 jz $717599EA
$717599D9:
6A00 push 0
6A28 push $28
6809800000 push $8009
FF7314 push dword ptr [ebx+$14]
E8D2C80500 call $717B62BC ; PostMessageWrapW_wrapper -- saves us a byte and eliminates the need for a reloc
$717599EA:
83632CF7 and dword ptr [ebx+$2C], $FFFFFFF7
EB90 jmp $71759980 ; Saves 3 bytes
90 nop
90 nop
; -------------------------------------------------------------------------
$71759BDC:
FF750C push [ebp+$C] ; nHeight
$71759BE7:
jmp $717B62C2
$717B62C2:
E8xxxxxxxx call $717B6250 ; CIntelliForms::CAutoSuggest::_IsKeyEventAllowed
84C0 test al, al
740A jz $xx
FF7508 push [ebp+8] ; pv
89D9 mov ecx, ebx
E8xxxxxxxx call $717592C6 ; CIntelliForms::CAutoSuggest::SetText
$xx:
E9xxxxxxxx jmp $71759BEC
; -------------------------------------------------------------------------
$71759917:
0F847D010000 jz $71759A9A ; Block moves down by 2 bytes
$71759A1D:
7455 jz $71759A74
$71759A63:
750F jnz $71759A74
89D9 mov ecx, ebx
$71759A6F:
E818C80500 call $717B628C ; CIntelliForms::CAutoSuggest::_GenerateSecureKeyMessage
33C0 xor eax, eax
3945F0 cmp [ebp-$10], eax
740F jz $71759A8A ; Saves 4 bytes
50 push eax
50 push eax
680A800000 push $800A
FF7314 push dword ptr [ebx+$14]
E832C80500 call $717B62BC ; PostMessageWrapW_wrapper -- saves us a byte
$71759A8A:
E94C020000 jmp $71759CDB ; Save space by having the near jump only once
$71759A8F:
E92B010000 jmp $71759BBF ; Save space by having the near jump only once
$71759A94:
E994010000 jmp $71759C2D ; Save space by having the near jump only once
$71759A99:
90 nop
8B06 mov eax, [esi]
8D4D0C lea ecx, [ebp+$C]
51 push ecx
33FF xor edi, edi
56 push esi
897DF0 mov [ebp-$10], edi
47 inc edi ; These three instructions save us 2 bytes
897DF4 mov [ebp-$C], edi
4F dec edi
$71759ACD:
74BB jz $71759A8A ; Compact way of getting to $71759CDB
83F90D cmp ecx, $D
74BB jz $71759A8F ; Compact way of getting to $71759BBF
83F909 cmp ecx, 9
74B6 jz $71759A8F ; Compact way of getting to $71759BBF
83F92E cmp ecx, $2E
75B6 jnz $71759A94 ; Compact way of getting to $71759C2D
8B4310 mov eax, [ebx+$10]
8D55F8 lea edx, [ebp-8] ; psz2
52 push edx
57 push edi
897DF8 mov [ebp-8], edi ; psz2
8B08 mov ecx, [eax]
50 push eax
FF510C call dword ptr [ecx+$C]
85C0 test eax, eax
7CA1 jl $71759A94 ; Compact way of getting to $71759C2D
397DF8 cmp [ebp-8], edi ; psz2
749C jz $71759A94 ; Compact way of getting to $71759C2D
FF750C push [ebp+$C] ; nHeight
89D9 mov ecx, ebx
897DF4 mov [ebp-$C], edi ; Y
E84BC70500 call $717B6250 ; CIntelliForms::CAutoSuggest::_IsKeyEventAllowed
84C0 test al, al
0F8495000000 jz $71759BA2
90 nop
90 nop
90 nop
$71759B17:
90 nop
90 nop
90 nop
$71759B9D: ; Swapping the order of 2 instructions
E85DF4FFFF call $71758FFF ; CIntelliForms::DeletePassword
$71759BA2:
C745F001000000 mov [ebp-$10], 1 ; hMem
;==========================================================================
; mshtmled.dll
;==========================================================================
; -------------------------------------------------------------------------
; CHtmlDlgHelper::CHtmlDlgHelper
;
; Uninitialized memory vulnerability patch
; -------------------------------------------------------------------------
$70F42B72:
E88D1D0500 call $70F94904 ; CHtmlDlgHelper::CHtmlDlgHelper_patch
$70F94904:
E86F25FAFF call $70F36E78 ; ATL::CComTypeInfoHolder::AddRef
83A69800000000 and dword ptr [esi+$98], 0
C3 ret
; -------------------------------------------------------------------------
; CSelectTracker::AdjustSelection
; -------------------------------------------------------------------------
$70F7BF78:
E897890100 call $70F94914 ; CSelectTracker::AdjustSelection_patch
90 nop
90 nop
90 nop
90 nop
53 push ebx
$70F94914:
8B466C mov eax, [esi+6Ch] ; Same offset in 2k and XP
83F809 cmp eax, 9
7408 jz $70F94924
83F806 cmp eax, 6
7403 jz $70F94924
33C0 xor eax, eax
C3 ret
$70F94924:
33C0 xor eax, eax
40 inc eax
C3 ret
; -------------------------------------------------------------------------
; CSelectionManager::StartSelectionFromShift
; -------------------------------------------------------------------------
$70F5F40F:
sub esp, 38h
$70F5F60F:
nop (3)
jmp $70F94928
$70F94928:
8B45FC mov eax, [ebp-4]
8B08 mov ecx, [eax]
8975C8 mov [ebp-$38], esi ; Initialize to 0
8D55C8 lea edx, [ebp-$38]
52 push edx
FF75F0 push [ebp-$10]
50 push eax
FF513C call dword ptr [ecx+3Ch]
89C3 mov ebx, eax
39F3 cmp ebx, esi
0F8CF1ACFCFF jl $70F5F636
3975C8 cmp [ebp-$38], esi
8B45FC mov eax, [ebp-4]
6A01 push 1
7503 jnz $70F94952
8B45F0 mov eax, [ebp-$10]
$70F94952:
8B08 mov ecx, [eax]
50 push eax
FF511C call dword ptr [ecx+1Ch]
8D4DCC lea ecx, [ebp-$34]
E888A4FCFF call $70F5EDE8 ; CSelectionChangeCounter::BeginSelectionChange
E9B2ACFCFF jmp $70F5F617
; -------------------------------------------------------------------------
; CDeleteCommand::DeleteCharacter
;
; The patch involves grafting in a single code block. Pretty much an as-is
; copy, only fixed up addresses.
; -------------------------------------------------------------------------
$70F5D2BB:
jmp $70F94968
90 nop
$70F94968: ; The new code block goes here
;==========================================================================
; MS10-081 patches ported to Windows 2000 SP4
;==========================================================================
;==========================================================================
; comctl32.dll
;==========================================================================
; -------------------------------------------------------------------------
; SBGetText
;
; Seems to limit the text length so we don't overflow a buffer
; -------------------------------------------------------------------------
$7175149B:
jmp $7176F440
90 nop
$7176F440:
8065090F and byte ptr [ebp+9], 0Fh
B8FEFF0000 mov eax, 0FFFEh
3BF0 cmp esi, eax
7202 jb $yy
8BF0 mov esi, eax
$yy:
E97020FEFF jmp $717514C4
This post has been edited by WildBill: 24 November 2010 - 06:51 PM