Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 октября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.

Исходники на С/C++ по определению МАС-адреса


Задача стоит по имени компьтера в сети
определять его MAC-адрес.(адрес сетевой карты)
Может -быть можно как-то иначе ,но я не знаю.
Этот код по идее должен определить по имени
IP-адрес(это он делает),а дальше SendARP
должна по IP-адресу определить MAC.
SendARP работает только под Win.2000
(под 95.98 возвращает error code 50- not_supported).Компилировалось в Buildere
(может в этом причина?)

//---------------------------------------------------------------------------
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
#include <conio.h>
#include <svcguid.h>
#include <iphlpapi.h>


int main(int argc, char* argv[])
{
WSADATA data;
char name[25];
int error;
unsigned long BufferLength = 1024;
unsigned long MacAddr;
unsigned long AddrLen;
PULONG PMacAddr = &MacAddr;
PULONG PAddrLen = &AddrLen;
DWORD ArpResult;
// char BufferName[1024];
char BufferName2[1024];
HANDLE Lookup;
LPHANDLE pLookup=&Lookup;
GUID SearchGuid = SVCID_INET_HOSTADDRBYNAME; //SVCID_INET_HOSTADDRBYINETSTRING;
WSAQUERYSET QuerySet;
WSAQUERYSET* pQuerySet = &QuerySet;
QuerySet.dwSize=sizeof(WSAQUERYSET);
QuerySet.lpServiceClassId = &SearchGuid;
QuerySet.lpVersion=NULL;
QuerySet.dwNameSpace=NS_ALL;
QuerySet.lpNSProviderId=NULL;
QuerySet.lpszContext=NULL;
QuerySet.dwNumberOfProtocols=0;
QuerySet.lpafpProtocols= NULL;//aAFProtocols;
QuerySet.lpszComment=NULL;
QuerySet.lpszQueryString=NULL;
QuerySet.dwNumberOfCsAddrs=0;
QuerySet.lpcsaBuffer=NULL;
QuerySet.dwOutputFlags=0;
QuerySet.lpBlob=NULL;
if (WSAStartup(0x202,&data) == 0)
{

printf("Enter name\n");
scanf ("%24s",name);
printf("\n");
QuerySet.lpszServiceInstanceName=name;
if (WSALookupServiceBegin(pQuerySet,LUP_RETURN_ALL,pLookup) !=0)
{
printf("WSALookupServiceBegin fail\n");
error = WSAGetLastError();
printf("error is %d\n",error);
}
else
{
if( WSALookupServiceNext(Lookup,0,&BufferLength,(LPWSAQUERYSET)BufferName2)==0)
{

printf("address is ");
printf(inet_ntoa(((LPSOCKADDR_IN)(((LPWSAQUERYSET)(BufferName2))->lpcsaBuffer->RemoteAddr.lpSockaddr))->sin_addr));
printf("\n");
if ((ArpResult=SendARP( ((IPAddr)(((LPSOCKADDR_IN)(((LPWSAQUERYSET)(BufferName2))->lpcsaBuffer->RemoteAddr.lpSockaddr))->sin_addr.S_un.S_addr)),0,PMacAddr,PAddrLen)) == NO_ERROR)
printf("ARP succeded\n");
else
{
printf ("ARP failed erorr = %d\n",ArpResult);
}
}
else
{

printf("Resolving fail\n");
error = WSAGetLastError();
printf("error is %d\n",error);
}
if (WSALookupServiceEnd(Lookup)!=0)
printf("WSALookupServiceEnd fail\n");
}
if (WSACleanup() == 0)
;
else
printf("exit fail\n");
}
else
{
printf("init fail\n");
}
printf("press any key to exit\n");
getch();
return 0;
}
//---------------------------------------------------------------------------


(c) alex


Q> Как узнать MAC адрес сетевой карты?
A>


Вариант1:

From : Sergey Gazimagomedov 2:453/11.13

Мне нужен был МАС адpес, так я его получал, пользуясь NetBIOS.
Добавляешь имя NetBIOS и посылаешь на имя станции, нужной для опpеделения(можно
и своей) датагpамный пакет с заполненным NCB.
Вот исходник моей функции для опpеделения МАС адpеса.

UCHAR MYLIBAPI GetAdapterID(char *Name, // NetBIOS имя станции
UINT lana_num,
CARDID *ID) // 6 байтовый массив
{
UCHAR rc = 0;
UCHAR Status[256];

while( lstrlen(Name) - 15)
lstrcat(Name, " ");

memset(&SNcb, 0, sizeof(NCB));
SNcb.ncb_command = NCBASTAT;
SNcb.ncb_buffer = (LPSTR)Status;
SNcb.ncb_length = 256;
lstrcpy(SNcb.ncb_callname, Name);
SNcb.ncb_lana_num = lana_num;
rc = Netbios( &SNcb );
if(rc ==0){
memcpy(ID, Status, 6);
}
return(SNcb.ncb_cmd_cplt);
}

Это под Win32. Конечно должен быть пpотокол NetBIOS, но он в фоpточках и так
необходим.

Вариант2:

From : Alexey Grachyov <rook@relex.ru>

#include <windows.h>
#include <winsock.h>
#include <wsipx.h>
#include <wsnwlink.h>
#include <stdio.h>

void main()
{
int iAdapters,iOpt=sizeof(iAdapters),iSize=sizeof(SOCKADDR_IPX);
SOCKET skNum;
SOCKADDR_IPX Addr;
WSADATA Wsa;

if(WSAStartup(0x0101,&Wsa)) return;
if((skNum=socket(AF_IPX,SOCK_DGRAM,NSPROTO_IPX))!=INVALID_SOCKET)
{
memset(&Addr,0,sizeof(Addr));
Addr.sa_family=AF_IPX;
if(bind(skNum,(SOCKADDR *)&Addr,iSize)!=SOCKET_ERROR)
{
if(getsockopt(skNum,NSPROTO_IPX,IPX_MAX_ADAPTER_NUM,
(char *)&iAdapters,&iOpt)!=SOCKET_ERROR)
{
while(iAdapters)
{
IPX_ADDRESS_DATA Data;
memset(&Data,0,sizeof(Data));
Data.adapternum=iAdapters-1;
iOpt=sizeof(Data);
if(getsockopt(skNum,NSPROTO_IPX,IPX_ADDRESS,(char
*)&Data,&iOpt)!=SOCKET_ERROR)
{
printf("Addr: %02X%02X%02X%02X:%02X%02X%02X%02X%02X%02X\n",
(int)Data.netnum[0],(int)Data.netnum[1],(int)Data.netnum[2],
(int)Data.netnum[3],(int)Data.netnum[4],(int)Data.netnum[5],
(int)Data.netnum[6],(int)Data.netnum[7],(int)Data.netnum[8],
(int)Data.netnum[9]);
}
iAdapters--;
}
}
}
closesocket(skNum);
}
WSACleanup();
}

Вариант3:

From: MSDN

#include <windows.h>
#include <wincon.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT;

ASTAT Adapter;

void main (void)
{
NCB Ncb;
UCHAR uRetCode;
char NetName[50];

memset( &Ncb, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = 0;

uRetCode = Netbios( &Ncb );
printf( "The NCBRESET return code is: 0x%x \n", uRetCode );

memset( &Ncb, 0, sizeof (Ncb) );
Ncb.ncb_command = NCBASTAT;
Ncb.ncb_lana_num = 0;

strcpy( Ncb.ncb_callname, "* " );
Ncb.ncb_buffer = (char *) &Adapter;
Ncb.ncb_length = sizeof(Adapter);

uRetCode = Netbios( &Ncb );
printf( "The NCBASTAT return code is: 0x%x \n", uRetCode );
if ( uRetCode == 0 )
{
printf( "The Ethernet Number is: %02x%02x%02x%02x%02x%02x\n",
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3],
Adapter.adapt.adapter_address[4],
Adapter.adapt.adapter_address[5] );
}
}




<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS