Po uruchomieniu tego reme, wykonywane sa tylko call GetModulehandle i ExitProces.. 
Pierwszym zadaniem jest pokazania messageboxa ktory jest juz w zasobach.. wiec looknijmy w nie.. Ok dialog jest.. i ma nazwe "MYDIALOG"

To co musimy na razie zrobic to:

Start:
                push    0               ; lpModuleName
                call    GetModuleHandleA
                mov     ds:dword_0_402000, eax
                push 0
                push XXXXXXXXh  ; adres do procki obslugujacej okno
                push YYYYYYYYh  ; adres do nazwy dialogu "MYDIALOG"
                push eax        ; hInstance
                call DialogBoxParamA
                push 0
                call ExitProcess

Heh.. brakuje importu GetModuleHandleA.. wiec musimy go dodac..

Zobaczmy z kad sie zaczyna ta tabela.. 
  NTHEADER.OptionalHeader.DataDirectories[IMPORTS] = 3000h

Teraz odnajdzmy sekcje w ktorej VA miesci sie 3000h..
Jest to sekcja ".idata".. jej VA = 3000h a PointerToRawData = A00h

Z tad wiemy ze tabela w pliku sie zaczyna od offsetu A00h w pliku..

Tak wyglada tabela importu w tym reme:

28300000000000000000000040300000
34300000000000000000000000000000
00000000000000004E30000062300000
000000004E3000006230000000000000
4B45524E454C33322E646C6C00000000
4765744D6F64756C6548616E646C6541
000000004578697450726F6365737300

Nie bede przypominal tutaj jak zbudowana jest tabela importow bo pelno jest o tym tutow z ktorych mozna to wyczytac..

Teraz pomyslmy jakie importy musza byc:

- GetModuleHandleA [Kernel32.dll] ; wiadomo
- ExitProcess [Kernel32.dll] ; j/w
- DialogBoxParamA [User32.dll] ; wyswietlenie dialoga
- MessageBoxA [User32.dll] ; wyswietlenie abouta
- LoadIcon [User32.dll] ; zaladowanie ikonki z zasobow, do dialoga
- SendMessageA [User32.dll] ; wyswietlenie ikonki na dialogu
- SetDlgItemText [User32.dll] ; wyswietlenie usera
- RegisterHotKey [User32.dll] ; rejestracja hotkey'ow
- RegOpenKeyEx [advapi32.dll] ; otworzenie klucza rejestru
- RegQueryValueEx [advapi32.dll] ; odczytanie wlasciciela windy
- RegCloseKey [advapi32.dll] ; zamkniecie klucza


Hmm.. tyle powinno wystarczyc.. ;)

Ok, importy dodane.. huh.. troche tego bylo.. teraz ustawmy jeszcze ze importy sa pod 3038h.. ok..

Do odczytywania wlasniciela windozy posluze sie jego rejestrem gdyz nie ma api zwracajacaj nazwe wlasciciela na ktorego zostal on zarejestrowany..

[HKEY_LOCAL_MACHINE] Software\Microsoft\Windows\CurrentVersion
      RegisteredOwner = "Jakas nazwa wlasciciela windozy.. ;)"


Teraz pomyslmy jak bedzie wygladal kod:

   invoke GetModuleHandleA, NULL
   mov hInstance, eax
   invoke DialogBoxParam, eax, addr MyDlg, addr MainProc, 0
   invoke ExitProcess, eax

MainProc proc STDCALL uses ebx edi esi hDlg:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD   
       .if uMsg == WM_INITDIALOG
            invoke LoadIcon, hInstance, 100
            invoke SendMessageA, hDlg, WM_SETICON, ICON_SMALL, eax
            invoke RegisterHotKey, hDlg, 1, 0, 41h ; A
            invoke RegisterHotKey, hDlg, 2, 0, 45h ; E
            invoke RegisterHotKey, hDlg, 3, 0, 55h ; U
       .elseif uMsg == WM_CLOSE
            jmp @exit
       .elseif uMsg == WM_COMMAND
            .if wParam == 1001       ; About
               @showabout:
                invoke MessageBoxA, hDlg, addr MsgInfo, addr szTitle, MB_OK + MB_ICONINFORMATION
            .elseif wParam == 1002   ; Exit
               @exit:
                invoke ExitProcess, 0
            .endif
       .elseif uMsg == WM_HOTKEY
            mov eax, wParam
            cmp ax, 1
            jz @showabout
            cmp ax, 2
            jz @exit
            cmp ax, 3
            jnz @F
            invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr szKey, 0,\
                                 KEY_WRITE or KEY_READ, addr hKey
            mov lpcbData, 250
            invoke RegQueryValueEx, hKey, addr szKeyName, 0, addr szREGSZ, addr szBuff, addr lpcbData
            invoke RegCloseKey, hKey
            invoke SetDlgItemTextA, hDlg, 1003, addr szBuff
            @@:
       .else
            xor eax, eax
            ret
       .endif
       mov eax, TRUE
       ret
MainProc endp


Wstawiamy odpowiednie opkody w miejsce kodu.. uwzgledniajac call'e..

Ok, reme sie uruchamia ale, nie widac butonkow na dialogu.. oraz przyciskow zamknij itp. co uniemozliwia pokazanie ikonki..

Przechodzimy do zasobow i 19 bajtow przed napisem "Exit" (jako unicode).. zmieniamy wartosc z 48h na 50h.. ok.. mamy widoczny i dzialajacy juz przycisk Exit :)
Tak samo robimy z buttonem About..

Teraz do Bajtu z offsetu 17A6h dodajemy 8..

Ok, reme juz jest prawie w pelni sprawne, prawie poniewaz static na ktorym jest wyswietlana nazwa wlasniciela windowsa ma opcje WS_DISABLED i troche brzydko wyglada..

Robimy tak jak z buttonami.. tylko zamiast 58h dajmy 50h.. i viola! Cale ReverseMe by ToMKoL padlo w pare chwil.. ;)

 Pozdrawiam!
  _TeStON_
  mailto: teston@chesti.com
  http://teston.spox.biz/ or http://www.pzone.of.pl/ 


