изменить код клипера, чтобы обойти аутентификацию старой программы

Привет, мой друг попросил меня восстановить пароль программы, написанной в clipper еще в 1994 году. Я взял себе декомпилятор (Valkyrie 5) и декомпилировал EXE-файл. Я нашел процедуру под названием USERLOGIN. Проблема в том, что я не умею программировать в clipper. Я был бы очень благодарен, если бы кто-то мог отредактировать процедуру, чтобы она больше не запрашивала аутентификацию.

#include "common.ch"
#include "inkey.ch"

********************************
Function USERLOGON

   Local Local1:= -1, Local2:= .F., Local3, Local4, Local5:= 3, ;
      Local6:= 3, Local7:= 7, Local8:= 41, Local9, Local10, Local11, ;
      Local12, Local13, Local14, Local15
   Local3:= 1
   Local9:= {}
   Local13:= setcursor()
   If (!netuse(diskname() + ":" + dirname() + "\" + "sinusr.dbf", ;
         "users"))
      Return Local1
   EndIf
   dbSetFilter({ || users->valid })
   Local14:= box(Local5, Local6, Local7, Local8, Nil, ;
      coltonum("GR+/B"))
   Do While (!Local2)
      Local10:= Space(12)
      Local11:= Space(10)
      setcursor(1)
      If (!Empty(n_shellver()))
         Local10:= padr(nnetwhoami(), 12)
      EndIf
      wininfo(Local14, @Local5, @Local6, @Local7, @Local8)
      @ Local5 + 1, Local6 + 5 Say "User............." Color "GR+/B"
      SetPos(Row(), Col() + 1)
      AAdd(Local9, __Get({ |_1| IIf(ISNIL(_1), Local10, Local10:= ;
         _1) }, "cUName", "@K!", Nil, Nil):display())
      @ Local5 + 2, Local6 + 5 Say "Password........." Color "GR+/B"
      SetPos(Row(), Col() + 1)
      AAdd(Local9, __Get({ |_1| IIf(ISNIL(_1), Local11, Local11:= ;
         _1) }, "cUPass", "@K!", Nil, Nil):display())
      Local9[2]:reader({ |_1| gt_grpassw(_1) })
      wreadmodal(Local9, 0)
      Local11:= Local9[2]:cargo()
      Local9:= {}
      If (LastKey() == K_ESC .OR. !winisinuse(Local14))
         If (winisinuse(Local14))
            winclose(Local14)
         EndIf
         Return Local1
      EndIf
      Local10:= alltrim(Local10)
      Local12:= {}
      Locate For Local10 == alltrim(users->emri)
      Do While (Found())
         AAdd(Local12, users->id)
         Continue
      EndDo
      For Local4:= 1 To Len(Local12)
         If ((Local15:= upass(Local12[Local4])) != Nil)
            If (alltrim(Local11) == Local15)
               Local2:= .T.
               Exit
            EndIf
         EndIf
      Next
   EndDo
   If (users->id != Local12[Local4])
      users->(dbGoTop())
      Locate For Local12[Local4] == users->id
      If (!Found())
         msg("Fatal error in user's file !", 3)
         Return -1
      EndIf
   EndIf
   For Local4:= 1 To MaxCol()
      winchgpos(0, 3)
   Next
   boxc(Local14)
   setcursor(Local13)
   If (users->in)
      tone(500, 10)
      Local4:= al_box("User " + Trim(users->emri) + ;
         " is already IN;" + "Do You Want to Jump In ?", 2, ;
         {" Yes ", " No  "}, 2, "WARNING")
      If (Local4 == 1)
         msg("More than One User with the same Name might cause Trouble !", ;
            3)
      Else
         Close
         Return -1
      EndIf
   ElseIf (netrlock())
      Replace users->in With .T.
      Unlock
      dbcommit()
   Else
      Close
      Return -1
   EndIf
   Static148[1]:= users->id
   Static148[2]:= alltrim(users->emri)
   Static148[3]:= alltrim(users->dirpriv)
   Static148[4]:= users->gjuha1
   Static148[5]:= users->gjuha2
   Static148[6]:= alltrim(users->emriiplote)
   Local1:= Static148[1]
   Close
   Return Local1

* EOF

person Drilon Berisha    schedule 16.08.2012    source источник
comment
Я тоже не знаком с clipper, но код ((Local15:= upass(Local12[Local4])) != Nil) ... If (alltrim(Local11) == Local15) выглядит так, будто он извлекает, а затем проверяет пароль пользователя, поэтому, возможно, вы могли бы попробовать удалить этот условный код.   -  person Simon MᶜKenzie    schedule 17.08.2012


Ответы (1)


Это частично догадки, но вот моя интерпретация:

Прочитайте пароль пользователя из консоли в Local9[2]:

@ Local5 + 2, Local6 + 5 Say "Password........." Color "GR+/B"
...
Local9[2]:reader({ |_1| gt_grpassw(_1) })
wreadmodal(Local9, 0)

Введите пароль в Local11:

Local11:= Local9[2]:cargo()

Получить все идентификаторы пользователей в Local12 через Local10:

Locate For Local10 == alltrim(users->emri)
Do While (Found())
    AAdd(Local12, users->id)
    Continue
EndDo

Получите пароль каждого пользователя в Local15, и если пароль присутствует and и совпадает с паролем в Local11, подтвердите пользователя:

For Local4:= 1 To Len(Local12)
    If ((Local15:= upass(Local12[Local4])) != Nil)
        If (alltrim(Local11) == Local15)
            Local2:= .T.
            Exit
        EndIf
    EndIf
Next

Исправление

Просто удалите код проверки пароля. Не будучи уверенным в назначении всего остального кода, я бы рекомендовал оставить его в покое. Я сохранил получение пароля пользователя, так как, возможно, есть веская причина не входить в систему пользователя, у которого вообще нет пароля (возможно, поэтому учетная запись отключена. Последний блок выше можно изменить на это:

For Local4:= 1 To Len(Local12)
    If ((Local15:= upass(Local12[Local4])) != Nil)
        Local2:= .T.
    EndIf
Next
person Simon MᶜKenzie    schedule 23.08.2012