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

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, так как там я бываю чаще, чем на форуме.
|
|
|
MSDN с человеческим лицом, или "low-bandwidth view" |

27.02.2009, 11:56
|
|
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
Провел на форуме: 1892597
Репутация:
836
|
|
MSDN с человеческим лицом, или "low-bandwidth view"
Подумал что данный раздел более всего подходит.
Оригинал (англ)
Оригинальный копи-паст (рус)
Jon Galloway пишет о сверхсекретной разработке Microsoft: MSDN с человеческим лицом, или "low-bandwidth view".
С помощью фильтра loband, добавляемого в url статьи MSDN, её можно загрузить в 10-15 раз быстрее, без мишуры на пол-экрана:
System.String.aspx , 317Кб
System.String(loband).aspx , 14Кб
Low-band представление можно сохранить с помощью cookie (ссылка Persist/switch off low bandwidth view вверху страницы). Или включать по желанию - для этого есть bookmarklet, который с помощью javascript этот cookie устанавливает/сбрасывает.
Выглядит он так:
javascript :
if(document.cookie.indexOf('LoBandEnabled=yes')<0) {
document.cookie='LoBandEnabled=yes;path=/;domain=.microsoft.com;%20expires=Wed,%2001-Aug-2040%2008:00:00%20GMT';
}
else{
document.cookie='LoBandEnabled=no;path=/;domain=.microsoft.com;%20expires=Wed,%2001-Aug-2040%2008:00:00%20GMT';
}
window.location.reload();
Установить в браузер его можно так:
Для Firefox/Opera перетащите эту ссылку -
PHP код:
[URL=javascript:if(document.cookie.indexOf('LoBandEnabled=yes')<0){document.cookie='LoBandEnabled=yes;path=/;domain=.microsoft.com;%20expires=Wed,%2001-Aug-2040%2008:00:00%20GMT';}else{document.cookie='LoBandEnabled=no;path=/;domain=.microsoft.com;%20expires=Wed,%2001-Aug-2040%2008:00:00%20GMT';}window.location.reload();]MSDN Low Band[/URL]
на панель ссылок.
Для Internet Explorer - в контекстном меню ссылки
PHP код:
[URL=javascript:if(document.cookie.indexOf('LoBandEnabled=yes')<0){document.cookie='LoBandEnabled=yes;path=/;domain=.microsoft.com;%20expires=Wed,%2001-Aug-2040%2008:00:00%20GMT';}else{document.cookie='LoBandEnabled=no;path=/;domain=.microsoft.com;%20expires=Wed,%2001-Aug-2040%2008:00:00%20GMT';}window.location.reload();]MSDN Low Band[/URL]
выберите "Add to favorites", и добавьте её в папку со Links.
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...
|
|
|
Создаём скрытое консольное приложение |

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-хеш.
|
|
|
Операция “перехват”. Используем открытый сокет другого процесса. |

31.05.2009, 18:15
|
|
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме: 991929
Репутация:
395
|
|
Операция “перехват”. Используем открытый сокет другого процесса.
Меня всегда интересовало, а можно ли похитить сокет другой программы и использовать его в своих целях? Еще как можно!
Обход фаервола, установка скрытых соединений, чтение конфиденциальных данных – это лишь немногое, что можно сделать, обладая сокетом.
Метод перехвата прост и широко обсуждаем в интернете. Нам не потребуется глубоких знаний Windows, потому что все осуществимо из User Mode (ring 3), но для понимания основы знать просто необходимо. RTFM Джеффри Рихтер “Windows для профессионалов: создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows”, глава 3
Метод заключатся в следующем - Получить список описателей (хэндлов - handle) открытых нужным процессом
- Найти среди них сокеты
- Скопировать их в свой процесс
В листинге, представленном ниже, я использовал функцию ZwQuerySystemInformation (Native API)
Код:
NTSTATUS ZwQuerySystemInformation(
SYSTEM_INFORMATION_CLASS SystemInformationClass,
PVOID SystemInformation,
ULONG SystemInformationLength,
PULONG ReturnLength);
для получения списка открытых описателей, передав ей в качестве первого аргумента SystemHandleInformation
Для получения типа описателя функцию NtQueryObject
Код:
NTSTATUS NtQueryObject(
HANDLE ObjectHandle,
OBJECT_INFORMATION_CLASS ObjectInformationClass,
PVOID ObjectInformation,
ULONG Length,
PULONG ResultLength );
c параметром ObjectTypeInformation (нам нужны только ‘File’) и с параметром ObjectNameInformation для получения имени описателя (нам нужны сокеты ‘\Device\Afd’). Эти функции находятся в библиотеке ntdll.dll
Копировать описатель – сокет в наш процесс мы будем функцией DuplicateHandle
Листинг кода (VS2008 Win32->Console Project), демонстрирующий описанный выше метод для вывода всех открытых сокетов в системе.
Код:
#include "stdafx.h"
#include <windows.h>
#include <winternl.h> // нужный заголовочек с полезными структурами
#include <Ntstatus.h> // структура NTSTATUS
// подключаем сокеты для использования функций преобразования IP адреса и порта
#include <Winsock.h>
#pragma comment(lib, "ws2_32.lib")
#define BUF_SIZE 102400 // размер буффера под таблицу информации и имени описателя
// http://msdn.microsoft.com/en-us/library/aa492492.aspx эх, у меня нет DDK
typedef enum _POOL_TYPE
{
NonPagedPool = 0,
PagedPool = 1,
NonPagedPoolMustSucceed = 2,
DontUseThisType = 3,
NonPagedPoolCacheAligned = 4,
PagedPoolCacheAligned = 5,
NonPagedPoolCacheAlignedMustS = 6,
MaxPoolType = 7,
NonPagedPoolSession = 32,
PagedPoolSession = 33,
NonPagedPoolMustSucceedSession = 34,
DontUseThisTypeSession = 35,
NonPagedPoolCacheAlignedSession = 36,
PagedPoolCacheAlignedSession = 37,
NonPagedPoolCacheAlignedMustSSession = 38
} POOL_TYPE;
// структура необходимая для получения имени описателя - NtQueryObject(ObjectNameInformation)
typedef struct _OBJECT_NAME_INFORMATION {
UNICODE_STRING Name;
WCHAR NameBuffer[0];
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
// структура необходимая для получения типа описателя - NtQueryObject(ObjectTypeInformation)
typedef struct _OBJECT_TYPE_INFORMATION {
UNICODE_STRING TypeName;
ULONG TotalNumberOfHandles;
ULONG TotalNumberOfObjects;
WCHAR Unused1[8];
ULONG HighWaterNumberOfHandles;
ULONG HighWaterNumberOfObjects;
WCHAR Unused2[8];
ACCESS_MASK InvalidAttributes;
GENERIC_MAPPING GenericMapping;
ACCESS_MASK ValidAttributes;
BOOLEAN SecurityRequired;
BOOLEAN MaintainHandleCount;
USHORT MaintainTypeList;
POOL_TYPE PoolType;
ULONG DefaultPagedPoolCharge;
ULONG DefaultNonPagedPoolCharge;
} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
//используется в NtQueryObject
typedef enum _OBJECT_INFORMATION_CLASS {
ObjectBasicInformation,
ObjectNameInformation,
ObjectTypeInformation,
ObjectAllInformation,
ObjectDataInformation
} OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS;
//функции мы будем подключать динамически, поэтому их необохдимо описать :)
// ZwQuerySystemInformation
typedef NTSTATUS (CALLBACK *LPFNZwQuerySystemInformation)(
SYSTEM_INFORMATION_CLASS SystemInformationClass,
PVOID SystemInformation,
ULONG SystemInformationLength,
PULONG ReturnLength
);
LPFNZwQuerySystemInformation ZwQuerySystemInformation;
// NtQueryObject
typedef NTSTATUS (CALLBACK *LPFNNtQueryObject)(
HANDLE ObjectHandle,
OBJECT_INFORMATION_CLASS ObjectInformationClass,
PVOID ObjectInformation,
ULONG Length,
PULONG ResultLength );
LPFNNtQueryObject NtQueryObject;
#define SystemHandleInformation 16 //недокументированый enum SYSTEM_INFORMATION_CLASS
// структура используемая в ZwQuerySystemInformation
typedef struct _SYSTEM_HANDLE_INFORMATION {
USHORT ProcessId;
USHORT CreatorBackTraceIndex;
UCHAR ObjectTypeNumber;
UCHAR Flags;
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
// Расширенная структура для получения информации о всех описателях
typedef struct _SYSTEM_HANDLE_INFORMATION_EX {
ULONG NumberOfHandles;
SYSTEM_HANDLE_INFORMATION Information[1];
} SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX;
int _tmain(int argc, _TCHAR* argv[]) {
DWORD ret;
NTSTATUS ss;
PUNICODE_STRING us;
POBJECT_TYPE_INFORMATION ot;
int i,ress,rem_port,loc_port;
char *remaddr,*locaddr;
sockaddr_in sockname, locname;
WSAData WSData;
HANDLE hProcess,ObjHandle, hh;
HINSTANCE hNTdll = LoadLibrary(L"Ntdll.dll");
if(!hNTdll) return 1;
//ищем функции
ZwQuerySystemInformation = (LPFNZwQuerySystemInformation)
GetProcAddress(hNTdll, "ZwQuerySystemInformation");
NtQueryObject=(LPFNNtQueryObject)
GetProcAddress(hNTdll, "NtQueryObject");
WSAStartup(MAKEWORD(2,2), &WSData); // стартуем winsock 2.2
printf("There are the following sockets opened on system:\n");
// Получение числа описателей в системе
DWORD buffer_size = 0;
SYSTEM_HANDLE_INFORMATION_EX temp_info;
ss = ZwQuerySystemInformation(
(SYSTEM_INFORMATION_CLASS)SystemHandleInformation, &temp_info,
sizeof(temp_info), &buffer_size);
// выделяем память под информацию о описателях и
SYSTEM_HANDLE_INFORMATION_EX *system_handles =(SYSTEM_HANDLE_INFORMATION_EX*)malloc(buffer_size); // если C++ можно и (new BYTE[buffer_size])
ss = ZwQuerySystemInformation(
(SYSTEM_INFORMATION_CLASS)SystemHandleInformation,system_handles,
buffer_size, &buffer_size);
// выделяем память под сруктурки
ot=(POBJECT_TYPE_INFORMATION)malloc(BUF_SIZE);
us=(PUNICODE_STRING)malloc(BUF_SIZE);
// информацию о всех описателях мы получили теперь пробежимся по ним...
for(i=0;i<system_handles->NumberOfHandles;i++) {
/*
Тут можно вставить проверку на описатели определенного процесса,
PID которого можно получить кучей разных способов (см. ссылки в конце статьи)
*/
hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, system_handles->Information[i].ProcessId); // открываем процесс с нужными правами доступа
if (hProcess != INVALID_HANDLE_VALUE)
{
hh=(HANDLE)system_handles->Information[i].Handle; // у меня были проблемы с преобразованиями - для этого и завел новую переменную
// теперь копируем описатель в адресное пространство своего процесса
if(DuplicateHandle(hProcess,hh,INVALID_HANDLE_VALUE, &ObjHandle, DUPLICATE_SAME_ACCESS, 0, 0)) {
// вытаскиваем информацию о типе описателя
ss = NtQueryObject(ObjHandle,ObjectTypeInformation, ot, BUF_SIZE, &ret);
if (ss == STATUS_SUCCESS) {
//кстати таким образом можно перехватывать любые обьекты ядра заданые в таблице описателей процесса,
if(lstrcmp(ot->TypeName.Buffer,L"File")==0){ // но нам нужен только File
// вытаскиваем информацию о имени описателя
ss=NtQueryObject(ObjHandle,ObjectNameInformation, us, BUF_SIZE, &ret);
if(ss==STATUS_SUCCESS){
if(lstrcmp(us->Buffer,L"\\Device\\Afd")==0){ // если это сокет
/*
=================================================================================
Вот впринципе и все! мы нашли сокет и он уже находится во власти нашего процесса
теперь мы можем делать с ним все, что захотим! ;)
а я хочу вывысти информацию о нем и о том кому он пренадлежит.
=================================================================================
*/
ress = sizeof(sockaddr_in);//--- commenting this line would cause an 10014 error.
getpeername((SOCKET)ObjHandle, (sockaddr *)&sockname, &ress);
//--- определяем локальный IP и порт
ress = sizeof(sockaddr_in);//--- commenting this line would cause an 10014 error.
getsockname((SOCKET)ObjHandle, (sockaddr *)&locname, &ress);
//--- коевертируем в понятные для глаза данные )
remaddr = inet_ntoa(sockname.sin_addr);
rem_port = ntohs(sockname.sin_port);
locaddr = inet_ntoa(locname.sin_addr);
loc_port = ntohs(locname.sin_port);
// выводим информацию
wprintf(L"PID=%d; Local=%S:%d; Peer=%S:%d;\n",system_handles->Information[i].ProcessId,locaddr,loc_port,remaddr,rem_port);
}
} // --- name handle
}
} // --- type handle
} // -- duplicate handle
CloseHandle(hProcess);
}
} // --- for
// освобождаем память
free(ot);
free(us);
free(system_handles);
WSACleanup(); // отключаемс сокеты
FreeLibrary(hNTdll); // и выгружаем DLL
getchar(); // а это так для паузы )
return 0;
}
Полезные ссылки
Множество примеров использования Tool Help и ZwQuerySystemInformation
Недокументированные функции Windows NT/2K/XP/2003
|
|
|

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...
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|