۷.۰۱.۱۳۸۸

آموزش هک ( جلسه ي ششم - حرفه اي )


درس شماره 7

- خلاصه درس: در اين درس يک Port Scanner ساده به اسم acw_spscan به زبان C می‌نويسيم. درک مطالب اين درس نياز به آشنايی با زبان برنامه‌نويسی C دارد.
◊ يادآوری

قبلا گفتم که برای اينکه هکر خوبی بشيد، زبان C را بايد ياد بگيريد. امروز اولين برنامه اينترنتی خود را به زبان C شروع می‌کنيم.برنامه‌ای که امروز می‌نويسيم، يک پورت اسکنر ساده (Simple Port Scanner) است که acw_spscan.exe نام دارد. acw يعنی Artawill Commandline Windows و spscan يعنی Simple Port Scanner. من سورس اين برنامه را با Borland C++ 5.02 کامپايل کردم ولی فکر کنم روی هر نوع کامپايلر C ويندوز کار کند.
يک سری نکات در مورد هر برنامه‌ای که با C برای ويندوز خواهم نوشت هست که فقط امروز می‌گم و بعدا ديگه اشاره نخواهم کرد.
۱- هر برنامه‌ای که من می‌نويسم، شامل دو فايل است که بايد داون‌لود کنيد: فايل اصلی که پسوند C يا CPP دارد و يک فايل به يکی از نامهای acw_sock.h يا agw_sock.h يا acu_sock.h ويا axu_sock.h که با توجه به نوع سيستم‌عامل (ويندوز يا يونيکس) و نوع ظاهر برنامه (خط‌ فرمان يا گرافيکی) يکی از اين چهارتا خواهد بود. اگر برنامه برای ويندوز نوشته شده است، بايد قبل از کامپايل نهايی فايل WS2_32.LIB را هم به پروژه اضافه کنيد.
۲- هر بار که برنامه جديدی خواهم نوشت فايلی که پسوند h دارد، کامل و کامل‌تر می‌شود، پس هر وقت يک فايل جديد C يا CPP داون‌لود می‌کنيد، فايل h مربوطه را هم داون‌لود کنيد.
۳- کامپايلر مورد استفاده در برنامه‌های ويندوز Borland C++ 5.02 است. اگر از کامپايلر ديگری استفاده می‌کنيد، ممکن است لازم باشد که تغييراتی اعمال کنيد.
۴- سورس تمام توابع و برنامه‌ها مشمول کپی‌ رايت است ولی استفاده از توابع در برنامه‌هايتان در صورت عدم اعمال تغييرات در سورس بلامانع است. - اينههههههه !

◊ درباره برنامه Artawill Command-prompt Windows - Simple Prot Scanner = acw_spscan

برنامه acw_spscan.exe عمل پورت اسکنينگ را به صورت tcp و udp انجام می‌دهد. همانطوری که از نامش پيداست، برای ويندوز و به‌صورت خط فرمان عمل می‌کند.



اگر در command prompt تايپ کنيد: acw_spscan ،خطوط زير چاپ می‌شود:
Artawill Command-line Windows SimplePortScanner (acw_spscan.exe) v1.0
Programmed by Araz Samadi, ArtaWill.com

Usage: acw_spscan []
بنابراين مثلا اگر بخواهم سايت پی آر دو را (که ip آن 63.148.227.65 است) برای پورت‌های ۲۰ تا ۳۰ به صورت tcp اسکن کنم، بايد بنويسم:
acw_spscan 63.148.227.65 20 30 tcp
و جواب می‌شنوم:
Artawill Command-line Windows SimplePortScanner (acw_spscan.exe) v1.0
Programmed by Araz Samadi, ArtaWill.com

>TCP
[63.148.227.65] TCP 21 : OPEN
[63.148.227.65] TCP 25 : OPEN

Simple Port Scanner End.
که نشان می‌دهد، پورت‌های ۲۱ و ۲۵ باز است.

◊ بررسی سورس برنامه

من برای راحتی کار برنامه‌نويسی شبکه، يک سری تابع تعريف کرده و آنها را در فايل acw_sock.h قرار داده‌ام که در برنامه اصلی آن را include می‌کنم. حال به بررسی توابع مورد استفاده در برنامه امروز می‌پردازم ( اگر خواهان اطلاعات بيشتری هستيد، سورس اين توابع را از فايل acw_sock.h بخوانيد ):

۱- (int arta_win_LoadWinsock(char, char ==>
در برنامه‌نويسی ويندوز قبل از استفاده از سوکت(socket)، بايد WinSock را لود کرد که من اين کار را با اين تابع انجام می‌دهم. اگر بپرسيد سوکت چيست، می‌گويم سوکت ارتباطی است از نوع TCP/IP که از پورت خاصی از يک کامپيوتر به سوی يک پورت خاص از يک کامپيوتر ديگر برای رد و بدل کردن داده‌ها ايجاد می‌شود. کل برنامه‌نويسی شبکه به کمک C با استفاده از سوکت‌هاست.
if(arta_win_LoadWinsock(2,0)==-1)
arta_commandline_win_DieWithError("ERR: Cannot load WinSock!");

دو خط بالا برای لودکردن WinSock ورژن 2.0 به‌کار می‌رود.

۲- (void arta_win_CleanWinsock(void ==>
در آخر برنامه بايد WinSockی را که با دستور بالا ايجاد کرده‌ايم، به‌کمک دستور اين قسمت ببنديم:

arta_win_CleanWinsock();


۳- (int arta_win_CreateTcpSocket(void ==>
اين تابع يک سوکت از نوع tcp ايجاد می‌کند.
if((sock=arta_win_CreateTcpSocket())==-1)
arta_commandline_win_DieWithError("ERR: Cannot Create Socket!");

دو خط بالا برای ايجاد يک سوکت tcp به‌کار می‌رود.

۴- (int arta_win_CreateUdpSocket(void ==>
اين تابع يک سوکت از نوع udp ايجاد می‌کند.

if((sock=arta_win_CreateUdpSocket())==-1)
arta_commandline_win_DieWithError("ERR: Cannot Create Socket!");
دو خط بالا برای ايجاد يک سوکت udp به‌کار می‌رود.

۵- (void arta_win_CloseSocket(int ==>
اين تابع، سوکتی را که با يکی از دو دستور بالا ايجاد کرده‌ايم، می‌بندد.
arta_win_CloseSocket(sock);


۶- void arta_win_CreateServerAddressStructure
(* struct sockaddr_in *, unsigned short, char ) ==>
اين تابع اطلاعات لازم برای برقراری اتصال را مانند IP, Port می‌گيرد و در يک structure مخصوص از نوع sockaddr_in قرار می‌دهد. اين structure در توابع بعدی به‌کار می‌رود.
arta_win_CreateServerAddressStructure(&addr,port,IP);


۷- (* int arta_win_EstablishTcpSocketConnection(int, struct sockaddr_in ==>
اين تابع sock (که از تابع‌های ۳ يا ۴ به‌دست آمده) و addr را (که از تابع ۶ حاصل شده) می‌گيرد و يک ارتباط واقعی tcp تشکيل می‌دهد. اگر ارتباط به‌وجود آمد، پورت باز است وگرنه بسته است.
if(arta_win_EstablishTcpSocketConnection(sock, &addr)==-1){
....
}


۸- (* int arta_win_EstablishUdpSocketConnection(int, struct sockaddr_in ==>
اين تابع sock (که از تابع‌های ۳ يا ۴ به‌دست آمده) و addr را (که از تابع ۶ حاصل شده) می‌گيرد و يک ارتباط واقعی udp تشکيل می‌دهد. اگر ارتباط به‌وجود آمد، پورت باز است وگرنه بسته است.
if(arta_win_EstablishUdpSocketConnection(sock, &addr)==-1){
....
}



حالا يک توضيح کلی می‌دم:

اولين سطرهای برنامه را بررسی می‌کنم
/* An ArtaWill Production - copyright(c) ArtaWill.com              */
/* Programmed by: M.E */
/* This Source code and its Functions can be used - but no .... */
/* Funcions source or code can be done ! */

#include /* for printf(), fprintf() */
#include /* for exit() */
#include /* for strings */
#include "acw_sock.h"

void main(int argc, char *argv[])
{
struct sockaddr_in addr;
char *IP;
int sock;
int port;
int startport, endport;
int tcp_udp_both=1;

arta_commandline_win_StartMessage("SimplePortScanner ......");

if ((argc != 4) && (argc != 5)) /* Test for correct ...... */
{
arta_commandline_win_DieWithError("Usage: acw_spscan []\n");
exit(1);
}

IP = argv[1];
startport = atoi(argv[2]);
endport = atoi(argv[3]);
if(argc==5){
if(stricmp(argv[4],"udp")==0){tcp_udp_both=2;}
else if (stricmp(argv[4],"both")==0){tcp_udp_both=3;}
}

if(arta_win_LoadWinsock(2,0)==-1)
arta_commandline_win_DieWithError("ERR: Cannot load WinSock!");
اوايل برنامه يه‌سری توضيحات
بعدش يک سری هدر (header) را include کرده‌ام از جمله acw_sock.h را
بعدش main شروع می‌شود و يک سری تعريف متغير داريم که به نوع اين متغير ها دقت کنيد.
بعد از روی ورودی خط‌ فرمان، متغير‌ها ست می‌شوند.
دو سطر آخر هم يک WinSock لود می‌کند.

حالا ادامه:

if(tcp_udp_both!=2){ puts(">TCP");
for(port=startport;port<=endport;port++){
printf(" [%s] TCP %5d : Testing... ",IP,port);

if((sock=arta_win_CreateTcpSocket())==-1)
arta_commandline_win_DieWithError("ERR: Cannot Crea....");

arta_win_CreateServerAddressStructure(&addr,port,IP);

if(arta_win_EstablishTcpSocketConnection(sock, &addr)==-1){
printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b........");
}
else{
printf("\b\b\b\b\b\b\b\b\b\b\b");
printf("OPEN \n");
}
arta_win_CloseSocket(sock);
}
}
اگر قرار باشد که tcp چک شود، اين خطوط اجرا می‌شوند. در اين سطرها يک اتصال tcp خاص بايد ايجاد شود و اگر اين عمل موفق بود، آن پورت باز است.

حالا ادامه برنامه:
if(tcp_udp_both!=1){
puts(">UDP ");
for(port=startport;port<=endport;port++){
printf(" [%s] UDP %5d : Testing... ",IP,port);

if((sock=arta_win_CreateUdpSocket())==-1)
arta_commandline_win_DieWithError("ERR: Cannot Cre....!");

arta_win_CreateServerAddressStructure(&addr,port,IP);

if(arta_win_EstablishUdpSocketConnection(sock, &addr)==-1){
printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b.....");
}
else{
printf("\b\b\b\b\b\b\b\b\b\b\b");
printf("OPEN \n");
}
arta_win_CloseSocket(sock);
}
}
همان کارها را ولی اين‌بار برای udp انجام می‌دهد.

و حالا آخر برنامه:
puts("\n");
arta_commandline_win_EndMessage("Simple Port Scanner");

arta_win_CloseSocket(sock);
arta_win_CleanWinsock();

exit(0);
}
در اينجا پيغام انتهايی چاپ شده و سوکت بسته می‌شود.

هیچ نظری موجود نیست:

http://up.iranblog.com/images/0z5dgraxwa4j49a5ts77.gif http://up.iranblog.com/images/gv83ah5giec9g8jkopmc.gif