Проблема с созданием VPN подключения

Тема в разделе "WASM.BEGINNERS", создана пользователем Swat2k, 7 дек 2008.

  1. Swat2k

    Swat2k Дима

    Публикаций:
    0
    Регистрация:
    14 май 2007
    Сообщения:
    64
    Вобщем трабла , есть длл , которая должна создовать vpn подключение , но при нажатии IDC_BTN8 прога вылетает но впн подключение создаёт . Пытался сохранять регистры до вызова invoke CreatVPN и востонавливать после , не помогает . Уже 2 день сижу никак разобраться немогу ( . Может есть другой код создания VPN ? подкиньте если не сложно ...

    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap :none   ; case sensitive
    4.  
    5.     include bin\StringsEx.mac
    6.  
    7.     include bin\windows.inc
    8.     include bin\user32.inc
    9.     include bin\kernel32.inc
    10.     include bin\rasapi32.inc
    11.     include bin\masm32.inc
    12.     include bin\msvcrt.inc
    13.  
    14.     includelib bin\user32.lib
    15.     includelib bin\kernel32.lib
    16.     includelib bin\masm32.lib
    17.     includelib bin\rasapi32.lib
    18.     includelib bin\msvcrt.lib
    19.  
    20. IDD_DLG_IL equ 1000
    21. IDD_DLG_EW equ 2000
    22. IDD_DLG_IC equ 3000
    23. IDD_DLG_ADSL equ 4000
    24. IDD_DLG_inet equ 5000
    25.  
    26. IDC_WEB_Start equ 1001
    27. IDC_WEB_Forum equ 1002
    28. IDC_WEB_bans equ 1003
    29. IDC_WEB_wowd equ 1004
    30. IDC_WEB_batlenet equ 1005
    31. IDC_WEB_aowow equ 1006
    32. IDC_WEB_reg equ 1007
    33.  
    34. IDC_BTN1 equ 1002
    35. IDC_BTN2 equ 1003
    36. IDC_BTN3 equ 1004
    37. IDC_BTN4 equ 1005
    38. IDC_BTN5 equ 1006
    39. IDC_BTN6 equ 1007
    40. IDC_BTN7 equ 1008
    41. IDC_BTN8 equ 1009
    42. IDC_BTN9 equ 1010
    43.  
    44.  
    45. _RASENTRYA STRUCT
    46.         dwSize DWORD ?
    47.         dwfOptions DWORD ?
    48.         dwCountryID DWORD ?
    49.         dwCountryCode DWORD ?
    50.         szAreaCode db RAS_MaxAreaCode + 1 dup(?)
    51.         szLocalPhoneNumber db RAS_MaxPhoneNumber + 1 dup(?)
    52.         dwAlternateOffset DWORD ?
    53.         ipaddr RASIPADDR <>
    54.         ipaddrDns RASIPADDR <>
    55.         ipaddrDnsAlt RASIPADDR <>
    56.         ipaddrWins RASIPADDR <>
    57.         ipaddrWinsAlt RASIPADDR <>
    58.         dwFrameSize DWORD ?
    59.         dwfNetProtocols DWORD ?
    60.         dwFramingProtocol DWORD ?
    61.         szScript db MAX_PATH dup(?)
    62.         szAutodialDll db MAX_PATH dup(?)
    63.         szAutodialFunc db MAX_PATH dup(?)
    64.         szDeviceType db RAS_MaxDeviceType + 1 dup(?)
    65.         szDeviceName db RAS_MaxDeviceName + 1 dup(?)
    66.         szX25PadType db RAS_MaxPadType + 1 dup(?)
    67.         szX25Address db RAS_MaxX25Address + 1 dup(?)
    68.         szX25Facilities db RAS_MaxFacilities + 1 dup(?)
    69.         szX25UserData db RAS_MaxUserData + 1 dup(?)
    70.         dwChannels DWORD ?
    71.         dwReserved1 DWORD ?
    72.         dwReserved2 DWORD ?
    73.         dwSubEntries DWORD ?
    74.         dwDialMode DWORD ?
    75.         dwDialExtraPercent DWORD ?
    76.         dwDialExtraSampleSeconds DWORD ?
    77.         dwHangUpExtraPercent DWORD ?
    78.         dwHangUpExtraSampleSeconds DWORD ?
    79.         dwIdleDisconnectSeconds DWORD ?
    80.         dwType DWORD ?
    81.         dwEncryptionType DWORD ?
    82.         dwCustomAuthKey DWORD ?
    83.         guidId GUID <>
    84.         szCustomDialDll db MAX_PATH dup(?)
    85.         dwVpnStrategy DWORD ?
    86.         dwfOptions2 DWORD ?
    87.         dwfOptions3 DWORD ?
    88.         szDnsSuffix db 256 dup(?)
    89.         dwTcpWindowSize DWORD ?
    90.         szPrerequisitePbk db MAX_PATH dup(?)
    91.         szPrerequisiteEntry db RAS_MaxEntryName + 1 dup(?)
    92.         dwRedialCount DWORD ?
    93.         dwRedialPause DWORD ?
    94. _RASENTRYA ENDS
    95.  
    96. RASCREDENTIALS STRUCT
    97.    dwSize DWORD ?
    98.    dwMask DWORD ?
    99.    szUserName db UNLEN + 1 dup(?)
    100.    szPassword db PWLEN + 1 dup(?)
    101.    szDomain db DNLEN + 1 dup(?)
    102. RASCREDENTIALS ENDS
    103.  
    104. ;###########################################################################
    105.  
    106. .data?
    107.  
    108. Host            dd  ?
    109. hLib            DD  ?
    110. Message         MSG    <?>
    111. SysDir          db  255 dup (?)
    112. ;###########################################################################
    113.  
    114. .data
    115. error_Host      db  "Ошибка определения сети",0
    116. szAtlAxWinInit      DB  "AtlAxWinInit",0
    117. szDLL           DB  "\atl.dll",0
    118. hCurrentDLL     dd  ?
    119. _hWnd           dd  ?
    120. VPN_msg         db  "OK?",0
    121. ;###########################################################################
    122.  
    123. .code
    124.  
    125. CreatVPN proc User:dword,Pass:dword
    126.      local re:_RASENTRYA
    127.      local crd:RASCREDENTIALS
    128.       lea edi,re
    129.       mov ecx,00000B44h
    130.       xor al,al
    131.       rep stosb
    132.       mov re.dwSize,00000B44h
    133.       mov re.dwfOptions,3c000710h
    134.       mov re.dwCountryID,0
    135.       mov re.dwCountryCode,0
    136.             .if Host==1
    137.             invoke lstrcpy,addr re.szLocalPhoneNumber,$CTA0("il_ip")
    138.         .elseif Host==2
    139.             invoke lstrcpy,addr re.szLocalPhoneNumber,$CTA0("ew_ip")
    140.         .elseif Host==3
    141.             invoke lstrcpy,addr re.szLocalPhoneNumber,$CTA0("ic_ip")
    142.         .elseif Host==4
    143.             invoke lstrcpy,addr re.szLocalPhoneNumber,$CTA0("vt_ip")
    144.         .elseif Host==5
    145.             invoke lstrcpy,addr re.szLocalPhoneNumber,$CTA0("wow_ip")
    146.         .endif
    147.       mov re.dwAlternateOffset,0
    148.       mov re.dwFrameSize,0
    149.       mov re.dwfNetProtocols,4
    150.       mov re.dwFramingProtocol,1
    151.       invoke lstrcpy,addr re.szDeviceType,$CTA0("vpn")
    152.       invoke lstrcpy,addr re.szDeviceName,$CTA0("WAN Miniport (L2TP)")
    153.       mov re.dwIdleDisconnectSeconds,00000000h
    154.       mov re.dwType,00020000h
    155.       mov re.dwEncryptionType,00030000h
    156.       mov re.dwfOptions2,01040000h
    157.       mov re.dwRedialPause,00000300h
    158.       mov re.dwVpnStrategy,00020000h
    159.       invoke RasSetEntryProperties,0,$CTA0("internet"),addr re,00000B44h,0,0
    160.        .if eax == 0
    161.           invoke lstrcpy,addr crd.szUserName,User
    162.           invoke lstrcpy,addr crd.szPassword,Pass
    163.           mov crd.dwMask,3
    164.           mov crd.dwSize,sizeof RASCREDENTIALS + 2
    165.           invoke RasSetCredentials,0,$CTA0("internet"),addr crd,0
    166.            .if eax == 0
    167.            .endif
    168.        .endif
    169.       ret
    170. CreatVPN endp
    171.  
    172. OneWindowVis Proc Visible:DWORD , __hWnd:DWORD
    173.  
    174.         invoke GetDlgItem,__hWnd,IDC_WEB_Start
    175.         invoke ShowWindow,eax,FALSE
    176.         invoke GetDlgItem,__hWnd,IDC_WEB_Forum
    177.         invoke ShowWindow,eax,FALSE
    178.         invoke GetDlgItem,__hWnd,IDC_WEB_bans
    179.         invoke ShowWindow,eax,FALSE
    180.         invoke GetDlgItem,__hWnd,IDC_WEB_wowd
    181.         invoke ShowWindow,eax,FALSE
    182.         invoke GetDlgItem,__hWnd,IDC_WEB_batlenet
    183.         invoke ShowWindow,eax,FALSE
    184.         invoke GetDlgItem,__hWnd,IDC_WEB_aowow
    185.         invoke ShowWindow,eax,FALSE
    186.         invoke GetDlgItem,__hWnd,IDC_WEB_reg
    187.         invoke ShowWindow,eax,FALSE
    188.         invoke GetDlgItem,__hWnd,Visible
    189.         push eax
    190.         invoke ShowWindow,eax,TRUE
    191.         invoke SetForegroundWindow,__hWnd
    192.         pop eax
    193.         invoke SetFocus,eax
    194.         ret
    195.  
    196. OneWindowVis EndP
    197.  
    198. DlgProc Proc hWnd:DWORD,uMsg:DWORD,wParam:WPARAM, lParam:LPARAM
    199.  
    200.     .If uMsg == WM_INITDIALOG
    201.         invoke OneWindowVis,IDC_WEB_Start,hWnd
    202.  
    203.     .elseif uMsg == WM_CLOSE
    204.         invoke ExitProcess,0
    205.  
    206.     .elseif wParam == IDC_BTN2 ; Forum
    207.         invoke OneWindowVis,IDC_WEB_Forum,hWnd
    208.     .elseif wParam == IDC_BTN3 ; BanList
    209.         invoke OneWindowVis,IDC_WEB_bans,hWnd
    210.     .elseif wParam == IDC_BTN4 ; Wowd
    211.         invoke OneWindowVis,IDC_WEB_wowd,hWnd
    212.     .elseif wParam == IDC_BTN5 ; Battle.net
    213.         invoke OneWindowVis,IDC_WEB_batlenet,hWnd
    214.     .elseif wParam == IDC_BTN6 ; Aowow
    215.         invoke OneWindowVis,IDC_WEB_aowow,hWnd
    216.     .elseif wParam == IDC_BTN7 ; Reg Acc
    217.         invoke OneWindowVis,IDC_WEB_reg,hWnd
    218.     .elseif wParam == IDC_BTN8 ; CreateVPN
    219.  
    220.         invoke CreatVPN,$CTA0("bnet"),$CTA0("bnet")
    221.  
    222.     .Else
    223.         MOV EAX,FALSE
    224.         RET
    225.     .EndIf
    226.  
    227.     MOV EAX,TRUE
    228.     RET
    229.  
    230. DlgProc EndP
    231.  
    232. LibMain proc hInstDLL:DWORD, reason:DWORD, unused:DWORD
    233.         .if reason == DLL_PROCESS_ATTACH
    234.             mov eax,1
    235.         .endif
    236.         ret
    237. LibMain Endp
    238.  
    239. MainCodeProc proc
    240.  
    241.     pop eax
    242.     mov Host,eax
    243.     pop eax
    244.     mov hCurrentDLL,eax
    245.     invoke GetSystemDirectory,addr SysDir,sizeof SysDir
    246.     invoke lstrcat,addr SysDir,addr szDLL
    247.     Invoke LoadLibrary,Offset SysDir
    248.     MOV hLib,EAX
    249.     Invoke GetProcAddress,hLib,ADDR szAtlAxWinInit
    250.     CALL EAX
    251.         .if Host==1
    252.             Invoke CreateDialogParam, hCurrentDLL,IDD_DLG_IL, NULL, Offset DlgProc, NULL
    253.         .elseif Host==2
    254.             Invoke CreateDialogParam, hCurrentDLL,IDD_DLG_EW, NULL, Offset DlgProc, NULL
    255.         .elseif Host==3
    256.             Invoke CreateDialogParam, hCurrentDLL,IDD_DLG_IC, NULL, Offset DlgProc, NULL
    257.         .elseif Host==4
    258.             Invoke CreateDialogParam, hCurrentDLL,IDD_DLG_ADSL, NULL, Offset DlgProc, NULL
    259.         .elseif Host==5
    260.             Invoke CreateDialogParam, hCurrentDLL,IDD_DLG_inet, NULL, Offset DlgProc, NULL
    261.         .else
    262.             invoke MessageBox,0,addr error_Host,addr error_Host,0
    263.             Invoke ExitProcess,0
    264.         .endif
    265.     .While TRUE
    266.         Invoke GetMessage, ADDR Message,0,0,0
    267.         .Break .If (!EAX)
    268.         Invoke TranslateMessage,ADDR Message
    269.         Invoke DispatchMessage,ADDR Message
    270.     .EndW
    271.     Invoke FreeLibrary,hLib
    272.    
    273.     Invoke ExitProcess,EAX
    274.  
    275. MainCodeProc endp
    276.  
    277. End LibMain
     
  2. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    Swat2k
    Код (Text):
    1. MainCodeProc proc
    2.     pop eax
    3.     mov Host,eax
    4.     pop eax
    5.     mov hCurrentDLL,eax
    Это как? Что ты делаешь этим кодом? Сначала в Host запихиваешь старове значение ebp, затем в hCurrentDLL пихаешь адрес возврата... Непонятно, куда все это вылетит после выхода из процедуры?
     
  3. Swat2k

    Swat2k Дима

    Публикаций:
    0
    Регистрация:
    14 май 2007
    Сообщения:
    64
    нет . Сперва запускается ехешник собирает нужную инфу , загружае длл , передаю параметры через стек.
    В ехешнике :
    Код (Text):
    1. Invoke GetProcAddress,hLib,ADDR MainCodeProc
    2. push hLib
    3. push Host
    4. jmp eax
    Повторюсь все функции проги работают как надо , траблы возникают только при создании VPN
     
  4. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    Swat2k
    Начало функции MainCodeProc под отладчиком должно быть таким:
    push ebp
    mov ebp, esp
    дальше идет твой код..
    pop eax
    mov Host,eax
    pop eax
    mov hCurrentDLL,eax

    Кстати, почему просто не pop Host, pop hCurrentDLL?
    Все равно получается фигня, потому что ты в Host сохраняешь старое значение ebp. Отсюда и падает прога при создании соеденения...

    Что мешает нормально передавть параметры?
     
  5. Swat2k

    Swat2k Дима

    Публикаций:
    0
    Регистрация:
    14 май 2007
    Сообщения:
    64
    Нормально это как ? :) мне казалось передача параметров всегда подразумевала работу со стеком
    Извратился так :
    Код (Text):
    1. MainCodeProc proc
    2.     mov x_ebp,ebp
    3.     mov ebp, esp
    4.     pop eax
    5.     mov Host,eax
    6.     pop eax
    7.     mov hCurrentDLL,eax
    8.     push x_ebp
    Ошибка не ушла , мне кажется что ошибка в процедуре CreateVPN . Но нимогу понять где именно . Без функции создания VPN прога работает стабильно .
     
  6. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    Да...но не так,как это делаешь ты... Ща..

    PS Я тоже так могу..
    Да, и кстати, не забывай в каком порядке ты передаешь параметры...у тебя все с ног на голову.
     
  7. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    Код (Text):
    1. MainCodeProc proc lHost: dword, lhCurrentDLL: dword
    Нормально юзаешь эти два параметра обращаясь к неи по именам lHost и lhCurrentDLL соответсвено.
    Вызов делаешь так:
    Код (Text):
    1. push hLib
    2. push Host
    3. call eax
     
  8. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    По другому и не скажешь ))) Кода добавилось, а смысла убавилось ))
     
  9. Swat2k

    Swat2k Дима

    Публикаций:
    0
    Регистрация:
    14 май 2007
    Сообщения:
    64
    Проблему это не решает ( . Хоть так хоть сяк . Повторюсь , приложение падает после нажатия кнопки . Впн создаёт и падает. Под отладчиком всё норм создаёт проблема не в процедуре CreateVPN (она норм отробатывает) а вот "где то дальше" приложение падает . Сейчас времени нет , вечером сделаю ехешник который будет создавать VPN , а моя dll будет его дропать и запускать с параметром Host . Изврат но что же делать ...
    Сделал передачу параметров через регистры (что бы не трогать стек , хотя зачем ? всё и так работало)
    Вызываю так :
    Код (Text):
    1.             ...
    2.             Invoke GetProcAddress,hLib,ADDR MainCodeProc
    3.             mov  ecx,Host
    4.             mov  edx,hLib
    5.             jmp eax
    В dll :
    Код (Text):
    1. MainCodeProc proc
    2.  
    3.     push ebp
    4.     mov ebp, esp
    5.  
    6.     mov Host,ecx
    7.     mov hCurrentDLL,edx
    8.     ...
    Вечером выложу листинг оли , сейчас уходить нужно
    _Aspire : стукни если не сложно вечером в icq : 6665899 дам все сурсы , а то чуствую один не справлюсь , а придумывать большие извращения нехочется
     
  10. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    Swat2k Покажи исправленный тобой код.
     
  11. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    Это сильно... Совсем запутался... Убиваешь стек в первом, втором и третьем случаях.
     
  12. Swat2k

    Swat2k Дима

    Публикаций:
    0
    Регистрация:
    14 май 2007
    Сообщения:
    64
    Лучше стукни в аську после 8 , а то тут тема разростается :)
     
  13. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    Swat2k Ок
     
  14. Wisder

    Wisder New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    30
  15. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    _Aspire
    Ну зачем же вводить в заблуждение домыслами про ebp? Посмотрели бы сами в отладчике - не создаёт masm стековых фреймов в процедуре, если ей этого не заказывают. Код
    Код (Text):
    1. zzz proc
    2. xor eax,eax
    3. ret
    4. zzz endp
    скомпилится честно в
    Код (Text):
    1. xor eax,eax
    2. ret
    (Пример случая, где это заказано:
    Код (Text):
    1. zzz proc a:dword
    2. xor eax,eax
    3. ret
    4. zzz endp
    скомпилится уже в
    Код (Text):
    1. push ebp
    2. mov ebp,esp
    3. xor eax,eax
    4. leave
    5. ret 4
    )
    Swat2k
    В изначальном коде: CreateVPN разрушает edi, что отражается на том, что диалоговая процедура тоже разрушает edi, а такого винда может не простить. Кроме того, MainCodeProc не является "честной" процедурой и не может быть вызвана командой call, но при "вызове" через jmp с этим проблем нет.
     
  16. Swat2k

    Swat2k Дима

    Публикаций:
    0
    Регистрация:
    14 май 2007
    Сообщения:
    64
    И что делать ? push edi перед и pop edi после ?
     
  17. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Да, но это далеко не самое главное. Основная проблема в том, что неправильно определены структуры - в реальности должно быть выравнивание на 4 байта всего подряд, иначе размер структуры получается неверным (меньше 0xb44) и обнуление переменной в начале кода затирает важные данные из стека.
    Код (Text):
    1. _RASENTRYA STRUCT
    2.         dwSize DWORD ?
    3.         dwfOptions DWORD ?
    4.         dwCountryID DWORD ?
    5.         dwCountryCode DWORD ?
    6.         szAreaCode db RAS_MaxAreaCode + 1 dup(?)
    7.         szLocalPhoneNumber db RAS_MaxPhoneNumber + 1 dup(?)
    8.         dwAlternateOffset DWORD ?
    9.         ipaddr RASIPADDR <>
    10.         ipaddrDns RASIPADDR <>
    11.         ipaddrDnsAlt RASIPADDR <>
    12.         ipaddrWins RASIPADDR <>
    13.         ipaddrWinsAlt RASIPADDR <>
    14.         dwFrameSize DWORD ?
    15.         dwfNetProtocols DWORD ?
    16.         dwFramingProtocol DWORD ?
    17.         szScript db MAX_PATH dup(?)
    18.         szAutodialDll db MAX_PATH dup(?)
    19.         szAutodialFunc db MAX_PATH dup(?)
    20.         szDeviceType db RAS_MaxDeviceType + 1 dup(?)
    21.         szDeviceName db RAS_MaxDeviceName + 1 dup(?)
    22.         szX25PadType db RAS_MaxPadType + 1 dup(?)
    23.         szX25Address db RAS_MaxX25Address + 1 dup(?)
    24.         szX25Facilities db RAS_MaxFacilities + 1 dup(?)
    25.         szX25UserData db RAS_MaxUserData + 1 dup(?)
    26.             align 4
    27.         dwChannels DWORD ?
    28.         dwReserved1 DWORD ?
    29.         dwReserved2 DWORD ?
    30.         dwSubEntries DWORD ?
    31.         dwDialMode DWORD ?
    32.         dwDialExtraPercent DWORD ?
    33.         dwDialExtraSampleSeconds DWORD ?
    34.         dwHangUpExtraPercent DWORD ?
    35.         dwHangUpExtraSampleSeconds DWORD ?
    36.         dwIdleDisconnectSeconds DWORD ?
    37.         dwType DWORD ?
    38.         dwEncryptionType DWORD ?
    39.         dwCustomAuthKey DWORD ?
    40.         guidId GUID <>
    41.         szCustomDialDll db MAX_PATH dup(?)
    42.         dwVpnStrategy DWORD ?
    43.         dwfOptions2 DWORD ?
    44.         dwfOptions3 DWORD ?
    45.         szDnsSuffix db 256 dup(?)
    46.         dwTcpWindowSize DWORD ?
    47.         szPrerequisitePbk db MAX_PATH dup(?)
    48.         szPrerequisiteEntry db RAS_MaxEntryName + 1 dup(?)
    49.             align 4
    50.         dwRedialCount DWORD ?
    51.         dwRedialPause DWORD ?
    52. _RASENTRYA ENDS
    53. RASCREDENTIALS STRUCT
    54.    dwSize DWORD ?
    55.    dwMask DWORD ?
    56.    szUserName db UNLEN + 1 dup(?)
    57.    szPassword db PWLEN + 1 dup(?)
    58.    szDomain db DNLEN + 1 dup(?)
    59.    _padding dw ?
    60. RASCREDENTIALS ENDS
     
  18. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    Прав.
     
  19. Swat2k

    Swat2k Дима

    Публикаций:
    0
    Регистрация:
    14 май 2007
    Сообщения:
    64