ورود

View Full Version : مبتدی: port scanner



EL_MPR
یک شنبه 10 خرداد 1394, 16:48 عصر
با سلام

یه برنامه پورت اسکنر نوشتم که یک آی پی می گیره و برای یک رنج پورت اون رو بررسی می کنه که باز هست یا بسته ولی می خوام که یک رنج آی پی بگیره و بعد این بررسی رو انجام بده ....مثلا یه آی پی شروع و یه آی پی پایان بگیره و بعد شماره آی پی رو تو حلقه افزایش بده کسی میدونه باید چی کار کنم؟؟؟؟
در واقع برای گرفتن یک رنج آی پی چه پیشنهادی دارید؟





#include <iostream>
#include <winsock2.h>//definitions to be used with the WinSock 2 DLL and WinSock 2 applications This header file corresponds to version 2.2.x of the WinSock API
#pragma comment(lib,"WSOCK32.LIB")
using namespace std;

void main()
{
WSADATA wsadata;
SOCKET sock;
int err,i,startport=1,endport=1024;
char ip[20];
struct sockaddr_in sock_addr;
FILE *j;//j is a pointer

cout<<"please enter ip"<<endl;
cin>>ip;

cout<<"please enter start port"<<endl;
cin>>startport;

cout<<"please enter end port"<<endl;
cin>>endport;

if((WSAStartup(MAKEWORD(2,2),&wsadata)!=0))
{
cout<<"WSAstartup error"<<endl;
}
else
{
for(i=startport;i<=endport;i++)
{
sock=socket(AF_INET,SOCK_STREAM,0);//create a stream TCP socket
sock_addr.sin_family=PF_INET;
sock_addr.sin_port=htons(i);//convert to network byte
sock_addr.sin_addr.s_addr=inet_addr(ip);
cout<<"scanning"<<endl;
err=connect(sock,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr));
if(err==0)
{
cout<<"Port Open"<<endl;
j=fopen("ports.txt","a+");
cout<<j<<"Port is open"<<endl;
closesocket(sock);
fclose(j);
}
else
{
cout<<"Port Closed"<<endl;
}
}
WSACleanup();
system("ports.txt");
}

}

rahnema1
یک شنبه 10 خرداد 1394, 21:08 عصر
سلام
در تاپیک زیر درمورد ذخیره کردن ip توضیح داده شده
http://barnamenevis.org/showthread.php?473450

EL_MPR
دوشنبه 11 خرداد 1394, 18:55 عصر
خیلی ممنون این تاپیک رو دیدم ولی متاسفانه نتونستم با برنامم منطبق کنم
میشه یه راهنمایی کنین چطور ip که از کاربر می گیرم رو در حلقه بذارم و اونو یه واحد یه واحد افزایش بدم؟ip از نوع کاراکتر گرفتم
باید اول کانورتش کنم به int یا string؟؟و بعد یه واحد یه واحد افزایش بدم؟
خیلی ممنون میشم کمک کنین:ناراحت:

one hacker alone
دوشنبه 11 خرداد 1394, 21:54 عصر
سلام ارگومان های ورودی تابع main رو برای گرفتن ورودی تنظیم کنید یه راهنما هم به کاربر بدید که مثلا


a.exe ip1 ip2 [port]

یعنی کاربر میتونه یه پورت دلخواه رو فقط روی این رنج ای پی بگیره
اولین کاری که میکنید بررسی اینکه دو ای پی در رنج هستن یا کلاس هستن یا خیر
بعد شما باید رقمی که تفاوت داره مثلا
192.168.1.2 192.168.1.20
رقم اخر رو بخونید و یه حلقه از 2 تا 20 تعریف کنید
درون حلقه هر سری یه سوکت با مشخصات ip مورد نظر ساخته میشه حالا یه حلقه ی درونی هم دارید برای بررسی پورت ها

اما خب روش بهتر استفاده از چند نخیه که شما به تعداد ip ها شی تعریف کنید یعنی برنامه رو به صورت شی گرایی بنویسید

EL_MPR
دوشنبه 11 خرداد 1394, 22:47 عصر
خیلی ممنون ..... :لبخندساده:
فکر نمی کردم انقدر سخت باشه :افسرده:
مثلا اگه یه حلقه while بذارم با شرط (ip=endip) و بعد بیاد پورت ها رو بررسی کنه و بعد از اون با کانورتip به رشته و افزایش یک واحدی اون رشته و دوباره تبدیل به آرایه کاراکتری که همون آی پیمونه و برگشتن به حلقه while ،مشکل حل نمیشه؟اینطوری یه رنج ip رو بررسی می کنه؟
ولی سر کانورتش مشکل دارم!

rahnema1
سه شنبه 12 خرداد 1394, 00:30 صبح
به این شکل می تونید بنویسید

#include <windows.h>
#include <stdio.h>
#include <string>
#include <iostream>
#include <sstream>

union IP
{
BYTE arrayAddress[4];
DWORD numAddress;
IP(DWORD num) : numAddress(num) {}
IP(std::string txtAddress)
{
unsigned int a ,b ,c , d;
char p;
std::stringstream str(txtAddress);
str
>>a >> p
>>b >> p
>>c >> p
>>d ;
arrayAddress[0]=a, arrayAddress[1]=b, arrayAddress[2]=c, arrayAddress[3]=d;
}
IP& operator++()
{
if (++arrayAddress[3] == 0)
if (++arrayAddress[2] == 0)
if (++arrayAddress[1] == 0)
++arrayAddress[0];
return *this;
}
} ;

int main()
{
sockaddr_in sock_addr;
IP start_ip(std::string("255.255.114.16"));
IP stop_ip(std::string("255.255.116.0"));
while( start_ip.numAddress != stop_ip.numAddress)
{
sock_addr.sin_addr.s_addr = start_ip.numAddress;

std::cout
<< (int)start_ip.arrayAddress[0] << "."
<< (int)start_ip.arrayAddress[1] << "."
<< (int)start_ip.arrayAddress[2] << "."
<< (int)start_ip.arrayAddress[3]
<< std::endl;
++start_ip;
}
return 0;
}

EL_MPR
سه شنبه 12 خرداد 1394, 09:17 صبح
خیلی ممنونم لطف کردین:لبخندساده:

ولی این برنامه رو که دیباگ می کنم فیلد میشه اجرا نمیشه چرا؟؟َ:متفکر:

rahnema1
سه شنبه 12 خرداد 1394, 15:14 عصر
برنامه که من اجرا می کنم مشکل نداره شما قبل از return این کد را بذارید تا برنامه خارج نشه
std:cin.get();
یا کلا برنامه را در cmd اجرا کنید

EL_MPR
یک شنبه 17 خرداد 1394, 07:09 صبح
نه اصلا اجرا نمی شه
این کد هم قبل return گذاشتم ولی cin رو ارور گرفته:متفکر:
میشه لطفا بگید چی کار کنم تو ویژوال اجرا شه؟
قبلا هم چند کد که از std :: استفاده شده بود رو تست کردم اجرا نمیشد:ناراحت: