ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Использование ресурсов (Delphi) |

03.01.2009, 10:37
|
|
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
Провел на форуме: 1892597
Репутация:
836
|
|
Использование ресурсов (Delphi)
Введение
куча вопросов по поводу работы с ресурсами, тут приведу лишь 1 вариант извлечение онного...
BRCC32
1. Запускаем блокнот
2. Записываем секцию вида - updater_exe RCDATA updater.exe
3. Сохраняем с расширением rc
4. Открываем консоль. Набираем следующее brcc32 <путь и имя файла (пункт 3)>
5. В итоге должны получить фай с расширением res
{$R <Resource.res>}
1. Создаем проект в Delphi
2. Используя дериктиву $R добавляем использование ресурса... Пример {$R myres.res}
Извлечение ресурса
uses Classes;
...
procedure ExtractRes;
var Res:TResourceStream;
begin
Res:=TResourceStream.Create(HInstance,'updater_exe',RT_RCDATA);
Res.SaveToFile('FileName.exe');
Res.Free;
end;
Happy End
вот и все...
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...
|
|
|

06.01.2009, 17:50
|
|
Участник форума
Регистрация: 07.07.2008
Сообщений: 161
Провел на форуме: 1027635
Репутация:
234
|
|
Отправка e-mail на С#
Простое консольное приложение которое позволяет отправить email. Нужно указать свой Smtp-сервер в SmtpMail.SmtpServer, по умолчанию это localhost. Чтобы добавить System.Web.Mail идём в Project->Add Reference на вкладке .Net выбираем System.Web.
Вариант 1:
PHP код:
using System;
using System.Web.Mail;
namespace SendMail
{
/// <summary>
/// Test console application to demonstrate sending e-mail.
/// </summary>
class TestMail
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
TestMail.Send("test@mail.ru",
"recip@mail.ru",
"Test Message Using CDOSYS",
"Hello World! This is a simple message sent
using CDOSYS.");
}
public static void Send(string MessageFrom,
string MessageTo,
string MessageSubject,
string MessageBody)
{
MailMessage message = new MailMessage();
message.From = MessageFrom;
message.To = MessageTo;
message.Subject = MessageSubject;
message.BodyFormat = MailFormat.Text;
message.Body = MessageBody;
try
{
System.Console.WriteLine("Sending outgoing message");
SmtpMail.Send(message);
}
catch( System.Web.HttpException exHttp )
{
System.Console.WriteLine("Exception occurred:" +
exHttp.Message);
}
}
}
}
Вариант2(отправка через Google):
PHP код:
protected string sendMail(string from, string to, string cc, string bcc, string subject, string body)
{
//Отсылка через System.Web.Mail
// Инициализация
System.Web.Mail.MailMessage mailMsg = new System.Web.Mail.MailMessage();
mailMsg.From = from;
mailMsg.To = to;
mailMsg.Cc = cc;
mailMsg.Bcc = bcc;
mailMsg.Subject = subject;
mailMsg.BodyFormat = System.Web.Mail.MailFormat.Text;
mailMsg.Body = body;
mailMsg.Priority = System.Web.Mail.MailPriority.High;
// Smtp configuration
System.Web.Mail.SmtpMail.SmtpServer = "smtp.gmail.com";//smtp is :smtp.gmail.com
// - smtp.gmail.com use smtp authentication
mailMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
mailMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "myemail@gmail.com");
mailMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "mypassword");
// - smtp.gmail.com use port 465 or 587
mailMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", "465");//port is: 465, 25 default
// - smtp.gmail.com use STARTTLS (some call this SSL)
mailMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true");
// Попытка отправки...
try
{
System.Web.Mail.SmtpMail.Send(mailMsg);
return "";
}
catch (Exception ex)
{
return ex.Message;
}
}
Последний раз редактировалось De-visible; 22.02.2009 в 05:32..
Причина: Исправь на *** свой код, добавь теги CODE!
|
|
|
Измерение температуры процессора AMD64 |

28.01.2009, 15:56
|
|
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
Провел на форуме: 4226446
Репутация:
1564
|
|
Измерение температуры процессора AMD64
[Измерение температуры процессора AMD64]
[Преамбула]
Неожиданно при измерении температуры процессора CoreTemp - ом захотелось научиться это делать самостоятельно. Как видно из заголовка я обладатель процессора AMD.
Почему я это решила запостить? Да как-то пока материал искала, наткнулась на несколько тем на форумах, но примера нормального так и не нашла (а вопросы такие периодически возникают). Материал практический, по теории достаточно в манах AMD. Я только кратко обрисую основные теоретически моменты.
[Coding]
Чтобы узнать текущую температуру нам потребуется доступ к так называемому Thermtrip Status Register. Его формат
Чтобы прочитать значение Thermtrip Status Register для каждого ядра, нам потребуется доступ к конфигурационному пространству PCI.
Для доступа к устройствам на шине PCI существует 2 порта - 0xCF8 и 0xCFC. Порт 0xCF8 именуется CONFIG_ADDRESS (0xCF8) и в него заносится значение в формате
Порт 0xCFC или CONFIG_DATA предназначен для чтения/записи данных в конфигурационное пространство. Сначала мы должны выбрать нужное устройство посредством регистра CONFIG_ADDRESS, а потом прочитать данные из CONFIG_DATA (чуть забегая вперед записывать в CONFIG_DATA тоже придется при выборе ядра).
Теперь перейдем непосредственно к кодингу. Для удобства формирования CONFIG_ADDRESS приведу 2 функции (взято из книженции "Программирование Аппаратных средств в Windows", глава 12 "Пространство шины PCI"):
Код:
int GetDeviceSlot(int iDevice,int iFunction){
return ((((iDevice)&0x1f)<<3)|((iFunction)&0x07));
}
ULONG GetDevice(int iBus,int iSlot,int iAddress){
return (0x80000000L |((iBus&0xff)<<16)|(iSlot<<8)|(iAddress&~3));
}
Таким образом, мы вызываем так
Код:
GetDevice(0,GetDeviceSlot(24,3),0xE4);
То есть:
Bus:0
Device:24
Function:3
Offset:0xE4
Почему такие значения? Все это из документации (ссылки на нее в конце).
Ясное дело, что ядра у нас может быть 2. Тогда смотрим еще раз внимательно на формат Thermtrip Status Register и видим бит ThermSenseCoreSel, отвечающий как раз за выбор ядра. Если второй бит от нуля (ThermSenseCoreSel) будет равен 0, то мы проверяем температуру первого ядра, если 1- второго. Итак, полный код функции, которую следует поместить в драйвер
Код:
VOID GetTemperature(VOID){
ULONG therm_=0,core=0,conf_data;
ULONG cdata = GetDevice(0,GetDeviceSlot(24,3),0xE4);
//пишем в Configuration Address Register
_outpd(0xCF8,cdata);
// читаем Configuration Data Register
therm_ = _inpd(0xCFC);
conf_data = therm_;
//с каким ядром имеем дело
core=therm_;
core=(core>>2)&1;
//нам нужны биты 23:14
therm_=(therm_>>14)&(0x3FF);
//вычисляем реальную температуру ядра по формуле
therm_=(therm_/4)-49;
KdPrint(("Temperature Core%d: %d C",core,therm_));
//проверяем другое ядро
conf_data = conf_data^4;
//пишем в Configuration Address Register
_outpd(0xCF8,cdata);
//выбираем другое ядро
_outpd(0xCFC,conf_data);
//пишем в Configuration Address Register
_outpd(0xCF8,cdata);
// читаем Configuration Data Register
therm_ = _inpd(0xCFC);
conf_data = therm_;
//с каким ядром имеем дело
core=therm_;
core=(core>>2)&1;
//нам нужны биты 23:14
therm_=(therm_>>14)&(0x3FF);
//вычисляем реальную температуру ядра по формуле
therm_=(therm_/4)-49;
KdPrint(("Temperature Core%d: %d C",core,therm_));
}
Получилось что-то вроде...
*Тестировалось на Amd Athlon 64 x2 Dual Core, ОС WinXPSP3
[Что читать?]
Ну если тема интересна, то могу порекомендовать по AMD
[1] Мануалы от производителя.
http://developer.amd.com/documentation/guides/Pages/default.aspx#developer_guides
[2].Хорошая статья, которая помогла мне связать все воедино
Реализация низкоуровневой поддержки шины PCI в ядре Linux
http://www.opennet.ru/base/dev/pci_linux_kernel.txt.html
конкретно по сабжу будет полезен раздел "Конфигурационное пространство устройства PCI", там как раз про Configuration Mechanism, CONFIG_ADDRESS, CONFIG_DATA. Как прочтете это - сразу все в голове уложится.
PS В общем-то посредством пм со мной можно связаться и какой-то момент уточнить.
PSS Сессия, мать ее, моя первая сессия. Чувствую себя ботом, сконфигурированным на заучивание конспектов.... (
Последний раз редактировалось 0x0c0de; 28.01.2009 в 16:01..
|
|
|

07.02.2009, 18:50
|
|
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
Провел на форуме: 4226446
Репутация:
1564
|
|
[Voltage ID]
[Voltage ID]
В жж своем писала уже это сегодня, но т.к. не все читают чужие жж как логическое продолжение отпишу и тут. Я так подумала, что буду потихоньку приводить в нормальный вид свой кодес с измерением температуры и делать что-то более-менее приличное, конечно, в образовательных целях. В планах привести сорс в нормальный удобочитаемый вид и выложить для всеобщего пользования.
Ясное дело, что чисто температуру мерить довольно скушно, вот я и подумала по ходу дела прикрутить измерение текущего напряжения питания процессора, к тому же, что делается это довольно-таки просто. Для того, чтобы узнать текущий Voltage ID (а затем переверсти его в значение напряжения) нам потребуется доступ к так называемому FIDVID_STATUS register, машинно-зависимому регистру с адресом 0xС0010042.
Его формат. Нас интересует 6-битовое поле CurrVID во втором двойном слове. Таблица соответсвия этих 6-битов и значения напряжения приведена ниже.
Сначала проверяем с помощью функции 8000_0007 CPUID доступность этой [VID] опции (функции CPUID можно глянуть в CPUID Specification от AMD, ссылки на скачку я давала в предыдущем посте амдэшных мануалов).
Код:
_asm{
//проверяем доступность опции
// Advanced Power Management Information
mov eax,80000007h
cpuid
// 2 бит в edx - VID: Voltage Id control
bts edx,2
// cf == 1?
jnb ext
mov isVID,TRUE
ext:
}
Я думаю, что есть народ тут, который с асмом не дружит. Ну так вот, поясняю насчет многострадальной инструкции bts. Инструкции bts/btr полюбились мне еще в 2007 году, тогда кажись я постила 23 способа получения единицы в регистре (тема вроде такая была) и меня интересовали разные извратные способы, тогда-то я и познакомилась с этой инструкцией. Первый ее операнд - это источник, в котором мы проверяем бит с номером, хранящимся во втором операнде. То есть проверяем второй бит от нуля в edx. флаг CF устанавливается значением этого бита. Сам бит потом устанавливается в 1, но нам это уже не важно. jсс, проверяющие флаг CF - это jb и jnb. второй происходит, если этот бит 0. вот такие дела. Теперь, думаю, все ясно и непосвященному.
В драйвере, после проверок пишем
Код:
// получаем напряжение
if(isVID){
_asm{
mov ecx,0c0010042h
rdmsr
and edx,111111b
mov uVID,edx
}
buf[2] = uVID;
KdPrint(("VID %X",uVID));
}else buf[2]=0xFFFFFFFF;
Из таблицы соответствия была выведена формула для напряжения
opart - часть до запятой, tpart - после запятой.
Код:
DWORD opart,tpart;
if(tmp[2]<0x20){
tmp[2]=1550-tmp[2]*25;
opart = tmp[2]/1000;
tpart = tmp[2]-1000;
}else{
tmp[2]=7750 - (tmp[2]-0x1F)*25;
opart = 0;
tpart = tmp[2];
}
wsprintf(core,L"%d.%dv",opart,tpart);
Как-то так.
---
Если есть ошибки - неточности в моих рассуждениях буду рада указанию на них, т.к. в общем-то тестирования достаточного не было и какой-то момент могла упустить. Кароче, велкам в jabber и пм, если что.
---------
Ах да, речь, идет, конечно об амд, насчет как это у интелов я хз, пока в их манах не смотрела этого
Последний раз редактировалось 0x0c0de; 09.02.2009 в 19:55..
|
|
|

22.02.2009, 01:00
|
|
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
Провел на форуме: 4226446
Репутация:
1564
|
|
Нихеранепонятный код обновлен, теперь по крайней мере читабельно. Исправила баг с загрузкой драйвера [установка привилегий, в SP2 и SP3 моих работало нормально, но на win7 там не загружался]. И еще я действительно в первый раз не усмотрела нумерацию ядер в мануале и поэтому были разночтения коретемпом. Теперь номер измеряемого ядра показывается верно.
сорцы, бинари теперь тут
http://code.google.com/p/amd-cpu-info/
Тот код, который выше в постах уже не исправляю, так как нет времени и желания. Пускай будет. За нормальными сорцами на код гугл. Замечания желательно слать в jabber, так как там я бываю чаще, чем на форуме.
|
|
|
Создаём скрытое консольное приложение |

28.02.2009, 20:44
|
|
Участник форума
Регистрация: 07.07.2008
Сообщений: 161
Провел на форуме: 1027635
Репутация:
234
|
|
Создаём скрытое консольное приложение
Эта мини-статья о том, как создать консольное приложение в Visual C++ так, чтобы оно не появлялось на экране.
Основной трюк здесь в структуре STARTUPINFO. Она содержит много параметров, из них нам нужны
PHP код:
DWORD cb
DWORD dwFlags
DWORD wShowWindow
Сначала нужно объявить структуру и выделить для неё память:
PHP код:
STARTUPINFO StartupInfo;
memset(&StartupInfo, 0, sizeof(StartupInfo));
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
Теперь заполним структуру так, чтобы не показывать окно:
PHP код:
// Задаём размер структуры
StartupInfo.cb = sizeof(STARTUPINFO);
// Установка параметров окна
StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
// HIDE - прячем окно
StartupInfo.wShowWindow = SW_HIDE;
Функция, которая принимает название программы для запуска из консоли и её аргументы:
PHP код:
DWORD RunSilent(char* strFunct, char* strstrParams)
{
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInfo;
char Args[4096];
char *pEnvCMD = NULL;
char *pDefaultCMD = "CMD.EXE";
ULONG rc;
memset(&StartupInfo, 0, sizeof(StartupInfo));
StartupInfo.cb = sizeof(STARTUPINFO);
StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow = SW_HIDE;
Args[0] = 0;
pEnvCMD = getenv("COMSPEC");
if(pEnvCMD){
strcpy(Args, pEnvCMD);
}
else{
strcpy(Args, pDefaultCMD);
}
strcat(Args, " /c ");
strcat(Args, strFunct);
strcat(Args, " ");
strcat(Args, strstrParams);
if (!CreateProcess( NULL, Args, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&StartupInfo,
&ProcessInfo))
{
return GetLastError();
}
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
if(!GetExitCodeProcess(ProcessInfo.hProcess, &rc))
rc = 0;
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
return rc;
}
Пример:
PHP код:
int main()
{
DWORD a = RunSilent("ipconfig", " > out.txt");
return 0;
}
создаст файл out.txt при этом ничего не выводя на экран.
|
|
|
Перебор пароля по словарю. MD5-хеш (C#) |

06.03.2009, 22:39
|
|
Участник форума
Регистрация: 01.01.2009
Сообщений: 144
Провел на форуме: 89680
Репутация:
154
|
|
Перебор пароля по словарю. MD5-хеш (C#)
Введение. Описание программы.
Информация в данном материале может оказаться полезной для тех, кто планирует использовать авторизацию в своем ПО, работать с хешами алгоритма шифрования MD5, а так же для тех, кому просто интересен принцип работы переборщиков паролей по словарю (брутфорсеров). Автор акцентирует внимание читателя на том, что программа работает исключительно с базами словарей (в коде осуществляется работа с txt-файлами, но это не столь принципиально), а не генерирует диапазоны символов для перебора.
Основная часть. Составление и кодирование алгоритма.
Условие задачи довольно простое: имея на руках MD5-хеш, подобрать коллизию (проще говоря, найти комбинацию символов, соответствующую этому хешу, то бишь пароль). Принцип и алгоритм работы приведен ниже.
1. Открыть файл с хешем (input.txt) и открыть файл с паролями (pass.txt).
2. Перевести все символы хеша в верхний регистр. Данная операция позволит корректно сравнивать его с генерируемыми нами хешами (при генерации все символы в хеше в верхнем регистре).
3. Прочитать i-ю строчку файла, где i принадлежит отрезку [0; EndOfFile] (это не столь важно, т.к. строка из файла будет считываться до тех пор, пока не окажется пустой).
4. Сгенерировать хеш прочитанной строчки.
5. Сравнить с целевым хешем. Если равны – вывести строку, соответствующую сгенерированному хешу. Если не равны – продолжить шаги 3-5.
6. Если достигнут конец файла, то уведомить пользователя о том, что пароль не найден.
Если по какой-либо причине непонятны те или иные шаги, то, возможно, все вопросы отпадут после анализа кода (и соответствующих ему комментариев) получившейся программы.
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace MD5Brute
{
class Programm
{
static void Main(string[] args)
{
//убедиться, что в командной строке указано имя файла
if ((args[0].Length == 0) || (args[1].Length == 0))
{
Console.WriteLine("Error: Missing Input file or Pass file");
Console.ReadKey();
}
else
{
//открыть файл с хешем
StreamReader reader = new StreamReader(args[0]);
string EnemyHash = reader.ReadLine(); //прочитать хэш
reader.Close();
EnemyHash = EnemyHash.ToUpper(); //перевести все символы в верхний регистр
//открыть файл с паролями
reader = new StreamReader(args[1]);
//перебрать каждую строку
for (string line = reader.ReadLine(); line != null; line = reader.ReadLine())
{
string CurrentHash = string.Empty;
//сгенерировать MD5-хеш
foreach (byte b in new MD5CryptoServiceProvider().ComputeHash(Encoding.Default.GetBytes(line)))
{
CurrentHash += b.ToString("X2");
}
//сравнить хеши
if (CurrentHash == EnemyHash)
{
Console.WriteLine("Password: "+line);
Console.ReadKey();
return;
}
}
Console.ReadKey();
Console.WriteLine("No Password");
return;
}
}
}
}
Формат запуска программы: md5brute.exe <%DIRECTORY%/input.txt> <%DIRECTORY%/pass.txt>
Заключение.
Конечно до полноценного брутфорсера этой программе далеко, но данные исходные коды вполне могут лечь в основу системы авторизации, продвинутого переборщика паролей, системы распределенных вычислений и чего-либо другого. По крайней мере, читатель теперь сумеет сгенерировать MD5-хеш.
|
|
|

21.06.2009, 11:43
|
|
Познающий
Регистрация: 04.01.2009
Сообщений: 94
Провел на форуме: 404716
Репутация:
145
|
|
Системный вызов stat
Системный вызов stat Программирование для linux.
Если в консоли выполнить команду ls-l, то мы увидим кроме всего прочего, информацию о файлах, такую как: права доступа, uid. gid, размер и т.п.
Для получения этой информации программно, нужно использовать вызов stat.
Код:
stat(char *file,struct stat fbuf);
Первый аргумент это имя/путь файла. Второй - это структура stat.
В ней собственно и будет располагаться вся информация.
Некоторые поля структуры:
Код:
st_mode - тип, права доступа.
st_atime - время последнего доступа.
st_size - размер.
st_uid - юид юзера.
st_gid - идентификатор группы пользователей
При ошибке возвращает -1
Теперь давайте напишем пример - программа должна выводить размер указаного файла.
Код:
------------------------------------------------------
#include <stdio.h>
#include <sys/stat.h>// необходимый заголовочный файл
int main(int ac,char *ag[])
{
struct stat buffer; // структура для хранения инфы
if(ac!=1) если кол во аргументов не 1 то
printf("Пожалуйста введите необходимые аргументы\n");
if(stat(ag[1],&buffer)!=-1) //если не произошла ошибка то
printf("Размер файла: %d\n",buffer.st_size); //вывод
else
printf("Не корректное имя файла\n"); // если ошибка
}
---------------------------------------------------------------------------
Последний раз редактировалось --StraNger--; 21.06.2009 в 14:23..
|
|
|

30.06.2009, 20:17
|
|
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
Провел на форуме: 1892597
Репутация:
836
|
|
Определение ТИЦ
PHP код:
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
public class Test
{
public static WebResponse GetResponse(string url, bool redirect)
{
var request = (HttpWebRequest)WebRequest.Create(url);
try
{
request.Method = "GET";
request.AllowAutoRedirect = redirect;
return request.GetResponse();
}
catch
{
return null;
}
}
public static string GetPageSrc(string url)
{
var response = GetResponse(url, true);
if (response == null)
{
return "";
}
using (var reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(1251)))
{
return reader.ReadToEnd();
}
}
private static int getCI(string url)
{
var pageScr = GetPageSrc(string.Format("http://bar-navig.yandex.ru/u?ver=2&show=32&url=http://www.{0}/", url));
var reg = new Regex("value=\"(.\\d*)\"", RegexOptions.IgnoreCase);
return reg.IsMatch(pageScr) ? int.Parse(reg.Match(pageScr).Groups[1].Value) : 0;
}
public static void Main()
{
Console.WriteLine(getCI("gw.kz"));
Console.WriteLine("Done!");
Console.ReadLine();
}
}
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...
|
|
|
Пример простейшего сниффера для W2K/XP. |

26.07.2009, 09:43
|
|
Banned
Регистрация: 11.04.2009
Сообщений: 45
Провел на форуме: 260579
Репутация:
2
|
|
Пример простейшего сниффера для W2K/XP.
Пример простейшего сниффера для W2K/XP.
Ниже приведён полный код программы. Данный код не претендует на звание крутого снифера, однако при желании его можно доработать, чтобы можно было просматривать содержимое пакетов. Так же на его основе можно легко сделать простой анализатор трафика. А главное - не надо делать всяких драйверов; всё просто и понятно.
Суть этого сниффера заключается в том, что используются сокеты второй версии и созданный сокет переводится в режим promiscuous (прослушивания).
nclude <conio.h>
#include <stdio.h>
#include <winsock2.h>
#define MAX_PACKET_SIZE 0x10000
#define SIO_RCVALL 0x98000001
// Буфер для приёма данных
char Buffer[MAX_PACKET_SIZE]; // 64 Kb
//Структура заголовка IP-пакета
typedef struct IPHeader {
UCHAR iph_verlen; // версия и длина заголовка
UCHAR iph_tos; // тип сервиса
USHORT iph_length; // длина всего пакета
USHORT iph_id; // Идентификация
USHORT iph_offset; // флаги и смещения
UCHAR iph_ttl; // время жизни пакета
UCHAR iph_protocol; // протокол
USHORT iph_xsum; // контрольная сумма
ULONG iph_src; // IP-адрес отправителя
ULONG iph_dest; // IP-адрес назначения
} IPHeader;
char src[10];
char dest[10];
char ds[15];
unsigned short lowbyte;
unsigned short hibyte;
void main()
{
WSADATA wsadata; // Инициализация WinSock.
SOCKET s; // Cлущающий сокет.
char name[128]; // Имя хоста (компьютера).
HOSTENT* phe; // Информация о хосте.
SOCKADDR_IN sa; // Адрес хоста
IN_ADDR sa1; //
unsigned long flag = 1; // Флаг PROMISC Вкл/выкл.
// инициализация
WSAStartup(MAKEWORD(2,2), &wsadata);
s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
gethostname(name, sizeof(name));
phe = gethostbyname( name );
ZeroMemory( &sa, sizeof(sa) );
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr;
bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
// Включение promiscuous mode.
ioctlsocket(s, SIO_RCVALL, &flag);
// Бесконечный цикл приёма IP-пакетов.
while( !_kbhit() )
{
int count;
count = recv( s, Buffer, sizeof(Buffer), 0 );
// обработка IP-пакета
if( count >= sizeof(IPHeader) )
{
IPHeader* hdr = (IPHeader *)Buffer;
//Начинаем разбор пакета...
strcpy(src,"Пакет: ");
CharToOem(src,dest);
printf(dest);
// Преобразуем в понятный вид адрес отправителя.
printf("From ");
sa1.s_addr = hdr->iph_src;
printf(inet_ntoa(sa1));
// Преобразуем в понятный вид адрес получателя.
printf(" To ");
sa1.s_addr = hdr->iph_dest;
printf(inet_ntoa(sa1));
// Вычисляем протокол. Полный список этих констант
// содержится в файле winsock2.h
printf(" Prot: ");
if(hdr->iph_protocol == IPPROTO_TCP) printf("TCP ");
if(hdr->iph_protocol == IPPROTO_UDP) printf("UDP ");
// Вычисляем размер. Так как в сети принят прямой порядок
// байтов, а не обратный, то прийдётся поменять байты местами.
printf("Size: ");
lowbyte = hdr->iph_length>>8;
hibyte = hdr->iph_length<<8;
hibyte = hibyte + lowbyte;
printf("%s",itoa(hibyte,"",10));
// Вычисляем время жизни пакета.
printf(" TTL:%s",itoa(hdr->iph_ttl,"",10));
printf("\n");
}
}
closesocket( s );
WSACleanup();
}
Для успешной компиляции, необходимо подключить к проекту файл ws2_32.lib. надо изменить строки: printf("%s",itoa(hibyte,"",10)); printf(" TTL:%s",itoa(hdr->iph_ttl,"",10));
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|