综合项目之闪讯破解(二)之 如何用C++建立PPPOE连接

如何用C++建立PPPOE连接

之前我们把闪讯拨号的真实用户名通过特定算法得到了,密码闪讯是没有加密的,因此我们接下来就是建立一个PPPOE连接。通过程序代码建立PPPOE连接的方法有大概这么几种:

1)直接修改系统的PBK电话簿文件内容(只对WIN8和WIN10有效)

PBK电话簿路径C:\ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk我们一般手动通过 控制面板\所有控制面板项\网络和共享中心\设置新的连接和网络来建立一个拨号连接,这种方式建立的网络连接的连接信息在WIN8/10中储存在这个PBK文件中,但在WIN7系统下就不管用了,WIN7的PPPOE连接信息并不依赖这个文件,所以你直接拿一个正确的PPPOE连接的信息去替换原来的PBK文件内容在WIN7中也是无效的,因此这种方式只能在WIN8/10中玩玩,因此这种方法兼容性太差 舍去。
下面是一个名称为0的PPPOE连接的PBK文件内容

[0]
Encoding=1
PBVersion=4
Type=5
AutoLogon=0
UseRasCredentials=1
LowDateTime=1569292672
HighDateTime=30552893
DialParamsUID=7955968
Guid=F80C6B8196921A4EAF308401972D3382
VpnStrategy=0
ExcludedProtocols=8
LcpExtensions=1
DataEncryption=0
SwCompression=0
NegotiateMultilinkAlways=1
SkipDoubleDialDialog=0
DialMode=0
OverridePref=15
RedialAttempts=0
RedialSeconds=0
IdleDisconnectSeconds=0
RedialOnLinkFailure=0
CallbackMode=0
CustomDialDll=
CustomDialFunc=
CustomRasDialDll=
ForceSecureCompartment=0
DisableIKENameEkuCheck=0
AuthenticateServer=0
ShareMsFilePrint=1
BindMsNetClient=1
SharedPhoneNumbers=0
GlobalDeviceSettings=0
PrerequisiteEntry=
PrerequisitePbk=
PreferredPort=PPPoE5-0
PreferredDevice=WAN Miniport (PPPOE)
PreferredBps=0
PreferredHwFlow=0
PreferredProtocol=0
PreferredCompression=0
PreferredSpeaker=0
PreferredMdmProtocol=0
PreviewUserPw=1
PreviewDomain=0
PreviewPhoneNumber=0
ShowDialingProgress=0
ShowMonitorIconInTaskBar=0
CustomAuthKey=0
AuthRestrictions=552
IpPrioritizeRemote=1
IpInterfaceMetric=0
IpHeaderCompression=0
IpAddress=0.0.0.0
IpDnsAddress=0.0.0.0
IpDns2Address=0.0.0.0
IpWinsAddress=0.0.0.0
IpWins2Address=0.0.0.0
IpAssign=1
IpNameAssign=1
IpDnsFlags=0
IpNBTFlags=1
TcpWindowSize=0
UseFlags=2
IpSecFlags=0
IpDnsSuffix=
Ipv6Assign=1
Ipv6Address=::
Ipv6PrefixLength=0
Ipv6PrioritizeRemote=0
Ipv6InterfaceMetric=0
Ipv6NameAssign=1
Ipv6DnsAddress=::
Ipv6Dns2Address=::
Ipv6Prefix=0000000000000000
Ipv6InterfaceId=0000000000000000
DisableClassBasedDefaultRoute=0
DisableMobility=0
NetworkOutageTime=0
ProvisionType=0
PreSharedKey=
CacheCredentials=0
NumCustomPolicy=0
NumEku=0
UseMachineRootCert=0
NumServers=0
NumRoutes=0
NumNrptRules=0
AutoTiggerCapable=0
NumAppIds=0
NumClassicAppIds=0
SecurityDescriptor=
ApnInfoProviderId=
ApnInfoUsername=
ApnInfoPassword=
ApnInfoAccessPoint=
ApnInfoAuthentication=1
ApnInfoCompression=0
WebPreAuth=
DisableDefaultDnsSuffixes=0
NumTrustedNetworks=0
NumDnsSearchSuffixes=0
PowershellCreatedProfile=0
ProxyFlags=0
ProxySettingsModified=0
ProvisioningAuthority=
AuthTypeOTP=0
GREKeyDefined=0
NumPerAppTrafficFilters=0
AlwaysOnCapable=0
PrivateNetwork=0

NETCOMPONENTS=
ms_msclient=1
ms_server=1

MEDIA=rastapi
Port=PPPoE5-0
Device=WAN Miniport (PPPOE)

DEVICE=PPPoE
LastSelectedPhone=0
PromoteAlternates=0
TryNextAlternateOnFail=1

2)使用系统的rasphone.exe用VBS代码来建立PPPOE

rasphone.exe路径C:\WINDOWS\System32\rasphone.exe,启动它我们可以看到当前系统存在的所有PPPOE连接,也可以新建PPPOE连接,通过运行一段VBS代码

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run("rasphone -a ""宽带连接X""")
WScript.Sleep 500
WshShell.SendKeys "R"
WScript.Sleep 20
WshShell.SendKeys "{ENTER}"
WScript.Sleep 20
WshShell.SendKeys "{ENTER}"
WScript.Sleep 20

把这段代码复制到记事本,后缀名改为.vbs双击运行即可,随后他就会帮我们建立一个名为“宽带连接X”的PPPOE连接,使用C#的Process启动它也可以,但不足的是他建立连接的时候要弹出对话窗口,因此这种方法背离了我们通过代码建立拨号连接的意图 也舍去。

3)使用Rasapi32.dll中的函数来建立PPPOE连接

函数名:RasSetEntryProperties
具体函数功能见https://msdn.microsoft.com/en-us/library/windows/desktop/aa377827
直接上代码

# include <ras.h>
# include <windows.h>
#pragma comment(lib, "Rasapi32.lib")
int __stdcall CreatePPPOE(int PPPOENumber)//传入PPPOE连接的数字名称
{
    LPRASENTRY lpRasEntry = NULL;
    DWORD cb = sizeof(RASENTRY);
    DWORD dwBufferSize = 0;
    DWORD dwRet = 0;

    // 取得entry的大小,这句是必须的,
    RasGetEntryProperties(NULL, L"", NULL, &dwBufferSize, NULL, NULL);
    if (dwBufferSize == 0)
        return -1;

    lpRasEntry = (LPRASENTRY)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwBufferSize);
    if (lpRasEntry == NULL)
        return -2;

    ZeroMemory(lpRasEntry, sizeof(RASENTRY));
    lpRasEntry->dwSize = dwBufferSize;
    lpRasEntry->dwfOptions = RASEO_PreviewUserPw | RASEO_RemoteDefaultGateway; 
    lpRasEntry->dwType = RASET_Broadband;

    lstrcpy(lpRasEntry->szDeviceType, RASDT_PPPoE);
    lstrcpy(lpRasEntry->szDeviceName, L"");
    lpRasEntry->dwfNetProtocols = RASNP_Ip;
    lpRasEntry->dwFramingProtocol = RASFP_Ppp;

    wchar_t  A[10];//PPPOE连接名称
    _itow_s(PPPOENumber, A, 10, 10);
    DWORD dwRul = ::RasDeleteEntry(NULL, A);//先删

    dwRet = RasSetEntryProperties(NULL, A, lpRasEntry, dwBufferSize, NULL, 0); // 创建连接
    HeapFree(GetProcessHeap(), 0, (LPVOID)lpRasEntry);

    if (dwRet != 0)
    {
        return 3;
    }

    return 0;
}

这种方法掉用的是系统函数因此可以在WIN7/8/10上完美运行,而且不显示界面,非常稳定,最终选用了它。

BY Sunday丶若雪 转载请注明出处

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值