Hi everybody,
first I would like to apologize for any grammatical errors. English is not my native language.
Also, if you will find this message too long, I will keep it shorter next time.
To describe a problem.. I have an application on which I’m practicing reverse engineering. It’s written in Delphi. The problem is in locating a WNDPROC. OllyDbg is a visual debugger and it can easy set a breakpoint on WNDPROC, but it fails due to strange address. Next step was trying with an IDA Pro. By manually browsing through the code I came up with the same address as Olly did. The address is 0xFFF010E8. I named the strange function “ModifyProccAddr”. You will see in there locating a 4k buffer and filling it with some values in a loop. Also, I don’t really understand the sub_4047DC function. It does some float computing, but IMHO, it has nothing to do with WNDPROC. It’s here anyway.
Any idea or suggestion on this WNDPROC issue is welcome.
Thnx, Natko
.text:00452F2C call RegisterClassW
.text:00452F31
.text:00452F31 loc_452F31: ; CODE XREF: sub_452ED8+38j
.text:00452F31 push 80000000h
.text:00452F36 push 0
.text:00452F38 push 0
.text:00452F3A push 0
.text:00452F3C push 0
.text:00452F3E push 0
.text:00452F40 push 0
.text:00452F42 mov eax, ds:hModule
.text:00452F47 push eax
.text:00452F48 push 0
.text:00452F4A mov ecx, offset dword_452F88
.text:00452F4F mov edx, WndClass.lpszClassName
.text:00452F55 mov eax, 80h
.text:00452F5A call sub_40F310
.text:00452F5F mov ebx, eax
.text:00452F61 cmp [ebp+arg_2], 0
.text:00452F66 jz short loc_452F7C
.text:00452F68 push [ebp+arg_4]
.text:00452F6B push dword ptr [ebp+8]
.text:00452F6E call ModifyProcAddr
.text:00452F73 push eax ; at the address in EAX is value 0xFFF010E8 (same as in Olly)
.text:00452F74 push GWLP_WNDPROC ; nIndex
.text:00452F76 push ebx ; hWnd
.text:00452F77 call SetWindowLongW
.text:00452F7C
.text:00452F7C loc_452F7C: ; CODE XREF: sub_452ED8+8Ej
.text:00452D40 ; =============== S U B R O U T I N E =======================================
.text:00452D40
.text:00452D40 ; Attributes: bp-based frame
.text:00452D40
.text:00452D40 ModifyProcAddr proc near ; CODE XREF: sub_452ED8+96p
.text:00452D40 ; sub_4A140C+97p ...
.text:00452D40
.text:00452D40 arg_0= dword ptr 8
.text:00452D40 arg_4= dword ptr 0Ch
.text:00452D40
.text:00452D40 push ebp
.text:00452D41 mov ebp, esp
.text:00452D43 push ebx
.text:00452D44 push esi
.text:00452D45 push edi
.text:00452D46 mov edi, offset dword_B43F90
.text:00452D4B cmp dword ptr [edi], 0
.text:00452D4E jnz short loc_452DBC
.text:00452D50 push 40h ; flProtect
.text:00452D52 push 1000h ; flAllocationType
.text:00452D57 push 1000h ; dwSize
.text:00452D5C push 0 ; lpAddress
.text:00452D5E call VirtualAlloc_0
.text:00452D63 mov esi, eax
.text:00452D65 mov eax, ds:dword_B43F8C
.text:00452D6A mov [esi], eax
.text:00452D6C lea edx, [esi+4]
.text:00452D6F mov eax, offset unk_AB3238
.text:00452D74 mov ecx, 2
.text:00452D79 call sub_4047DC
.text:00452D7E mov edx, offset sub_452D18
.text:00452D83 lea eax, [esi+5]
.text:00452D86 call sub_452D38 ; return edx - (eax + 5)
.text:00452D8B mov [esi+6], eax
.text:00452D8E lea ebx, [esi+0Ah]
.text:00452D91
.text:00452D91 loc_452D91: ; CODE XREF: ModifyProcAddr+74j
.text:00452D91 mov byte ptr [ebx], 0E8h
.text:00452D94 lea edx, [esi+4]
.text:00452D97 mov eax, ebx
.text:00452D99 call sub_452D38
.text:00452D9E mov [ebx+1], eax
.text:00452DA1 mov eax, [edi]
.text:00452DA3 mov [ebx+5], eax
.text:00452DA6 mov [edi], ebx
.text:00452DA8 add ebx, 0Dh
.text:00452DAB mov eax, ebx
.text:00452DAD sub eax, esi
.text:00452DAF cmp eax, 0FFCh
.text:00452DB4 jl short loc_452D91
.text:00452DB6 mov ds:dword_B43F8C, esi
.text:00452DBC
.text:00452DBC loc_452DBC: ; CODE XREF: ModifyProcAddr+Ej
.text:00452DBC mov eax, [edi]
.text:00452DBE mov ebx, [edi]
.text:00452DC0 mov edx, [ebx+5]
.text:00452DC3 mov [edi], edx
.text:00452DC5 mov edx, [ebp+arg_0]
.text:00452DC8 mov [ebx+5], edx
.text:00452DCB mov edx, [ebp+arg_4]
.text:00452DCE mov [ebx+9], edx
.text:00452DD1 pop edi
.text:00452DD2 pop esi
.text:00452DD3 pop ebx
.text:00452DD4 pop ebp
.text:00452DD5 retn 8
.text:00452DD5 ModifyProcAddr endp
.text:00452DD5
.text:00452DD8
.text:00452DD8 ; =============== S U B R O U T I N E =======================================
.text:004047DC ; =============== S U B R O U T I N E =======================================
.text:004047DC
.text:004047DC
.text:004047DC sub_4047DC proc near ; CODE XREF: sub_403B68+Ap
.text:004047DC ; sub_404EAC+4Fp ...
.text:004047DC cmp eax, edx
.text:004047DE jz short locret_404811
.text:004047E0 cmp ecx, 20h
.text:004047E3 ja short loc_404861
.text:004047E5 sub ecx, 8
.text:004047E8 jg short loc_4047F1
.text:004047EA jmp ds:off_404834[ecx*4]
.text:004047F1 ; ---------------------------------------------------------------------------
.text:004047F1
.text:004047F1 loc_4047F1: ; CODE XREF: sub_4047DC+Cj
.text:004047F1 fild qword ptr [ecx+eax]
.text:004047F4 fild qword ptr [eax]
.text:004047F6 cmp ecx, 8
.text:004047F9 jle short loc_40480C
.text:004047FB fild qword ptr [eax+8]
.text:004047FE cmp ecx, 10h
.text:00404801 jle short loc_404809
.text:00404803 fild qword ptr [eax+10h]
.text:00404806 fistp qword ptr [edx+10h]
.text:00404809
.text:00404809 loc_404809: ; CODE XREF: sub_4047DC+25j
.text:00404809 fistp qword ptr [edx+8]
.text:0040480C
.text:0040480C loc_40480C: ; CODE XREF: sub_4047DC+1Dj
.text:0040480C fistp qword ptr [edx]
.text:0040480E fistp qword ptr [ecx+edx]
.text:00404811
.text:00404811 locret_404811: ; CODE XREF: sub_4047DC+2j
.text:00404811 ; DATA XREF: sub_4047DC+38o
.text:00404811 retn
.text:00404811 ; ---------------------------------------------------------------------------



