IcqMod DLL IcqMod DLL Что это? Это небольшая DLL для работы с аськой ) которая реализует основные функции для работы с протоколом. Основные - это коннект, дисконнект, отправка и получение сообщений, запрос авторизации и отказ авторизовать. Заче оно нужно? 1) Очень удобный модуль для ICQ спама 2) Очень удобный модуль для ICQ флуда 3) Возможность быстрого создания простых ICQ ботов 4) Использование в любом другом софте который использует ICQ протокол В чем особенность? 1) чистый размер DLL - 6 килобайт 2) возможность использования в любом компилируемом языке 3) простота использования 4) поддержка socks4 и socks5 5) нет нужны юзать VCL и тому подобные вещи. 6) собственный двиг (не используется TICQClient)/ собственно по размеру это видно 7) в онлайн можно выводить сколько угодно номеров (в особенности если юзать прокси) при этом тормозить ничего не будет в отличии от использования VCL компонента TICQClient Какие функции имеются? ICQClose - закрытие соединение ICQConnect - коннект к серваку ICQSendMsg - посылка сообщения ICQSendAuth - посылка запроса на авторизацию с передачей текста ICQAuth - авторизовать UIN или отказать в авторизации ICQReadMsg - проверка на наличие сообщения в очереди. Технические особенность 1) максимальное кол-во параллельно работающих коннектов - неограничено, на сколько система позволит 2) максимальный размер входящего сообщения - 240 байт. Просто большие сообщения отправляются другим способом, который не поддерживается в dll 3) поддержка приема русских сообщений 4) оправка сообщений на рус языке требует предварительного конверта текста в UTF8. Англ и так прокатывает. 5) используется только WinSock2 6) написан на Си. 7) Скомпилен в VS 2008 Pro Дополнительно Т.к. судя по виду, эту либу будут использовать в основном для спама или флуда или в других программах которые будут приность прибыль людям, то исходники данной DLL выкладывать не буду. Тем кому они понадобятся могу продать за определенную плату. Пример использования в Delphi Пример реализации в делфи простого бота который будет выводить в консоль сообщение которые посылает юзвери и их UIN's на запрос !TIME будет отослано текущее время. Пример лежит в архиве TimeBot.dpr - сам бот IcqMod.pas - вспомогательный модуль описывающий константы и прототипы IcqMod.dll - сама dll Пример использования в C/C++ Примера не будет, просто в файле IcqMod.h описаны константы и прототипы функций. Кому нужно разберутся. Подробное описание функций? констант и структур Code: PROXY_INFO = packed record ProxyType : dword; // тип прокси ProxyIp : dword; // адрес прокси ProxyPort : word; // порт прокси end; PPROXY_INFO = ^PROXY_INFO; Данная структура описывает инфо о прокси. Типы прокси: PROXY_TYPE_SOCKS_4 = 1; PROXY_TYPE_SOCKS_5 = 2; заполняется так примерно: proxy.ProxyType = PROXY_TYPE_SOCKS_5; proxy.ProxyPort = 1222; proxy.ProxyIp = inet_addr("127.0.0.1"); -------------------------------- Code: ICQ_CLIENT = packed record status : byte; sequence : word; sock : dword; end; основная структура описывающая состояние работы. Заполняется функцией ICQConnect В ней не стоит ничего менять, просто используете для работы. Единственная переменная за состоянием которой нужно следить - status она может принимать значение: ICQ_CLIENT_STATUS_CONNECTED = 1; - связь установлена ICQ_CLIENT_STATUS_DISCONNECTED = 2; - нет связи с сервером -------------------------------- function ICQConnect(var client : ICQ_CLIENT; host : PAnsichar; port : word; login : PAnsichar; pass : PAnsichar; pproxy : PPROXY_INFO) : dword; stdcall; external ICQMOD_DLL; подключение к серверу, где client - переменная для хранения состояния host - имя сервака типа login.icq.com port - порт сервера (5190) login - UIN pass - пароль для UINа pproxy - указатель на структуру описывающую прокси. Если 0 значит не юзать прокси, если указана структура прокси, то берет из неё данные для коннекта Функция возвращает код состояния: ICQ_CONNECT_STATUS_OK = $FFFFFFFF; // подключился удачно ICQ_CONNECT_STATUS_RECV_ERROR = $FFFFFFFE; // ошибка чтения данных ICQ_CONNECT_STATUS_SEND_ERROR = $FFFFFFFD;// ошибка отправки данных ICQ_CONNECT_STATUS_CONNECT_ERROR = $FFFFFFFC;// ошибка коннекта к серваку ICQ_CONNECT_STATUS_AUTH_ERROR = $FFFFFFFB; // не смог авторизоваться. Или пас не подходит или превышен лимит ----------------- function ICQReadMsg(var client : ICQ_CLIENT; UIN : PAnsichar; msg : PAnsichar; var msglen : integer) : dword; stdcall; external ICQMOD_DLL; Проверка на сообщение. client - описание состояния UIN - адрес буфера куда будет помещен UIN человека от которого пришло сообщение. желательно чтобы был 10 байт. msg - адрес буфера куда будет записано сообщение. msglen - переменная в которую будет записана длинна сообщения. Функция возвращает: 0 - сообщения нет 1 - сообщение получено. Данная функция извлекает данне из сокета если они есть. И если это сообщение то парсит его. ---------------- function ICQAuth(var client : ICQ_CLIENT; UIN : PAnsichar; AuthOk : dword) : dword; stdcall; external ICQMOD_DLL; Авторизация номера. client - описание состояния UIN - номр человека которого нужно авторизовать AuthOk - флаг авторизации: 0 - послать команду - в авторизации отказано 1 - авторизовать человека. --------------------- procedure ICQClose(var client : ICQ_CLIENT); stdcall; external ICQMOD_DLL; закрывает соединение -------------------- function ICQSendAuth(var client : ICQ_CLIENT; UIN : PAnsichar; msg : PAnsichar) : dword; stdcall; external ICQMOD_DLL; Отсылка запроса на авторизацию. UIN - кому отсылается msg - текст который будет присутствовать в запросе --------------------- function ICQSendMsg(var client : ICQ_CLIENT; UIN : PAnsichar; msg : PAnsichar) : dword; stdcall; external ICQMOD_DLL; Посылка сообщения UIN - кому msg - текст сообщения На последок всякая инфа Как будет работать DLL - хз. тестил на локальном компе. Сообщениями обменивался с QIP Infium на рус и англ языке. всё было норм. При написании DLL некоторые вещи были подсмотрены в TICQClient (запросы на отсылку сообщений и работу с авторизаций) Чтение сообщений и коннект подсмотренный с CommView и php классе работы с аськой. Так что сильно прошу не пинать )) И главное - не спамте мою аську :'( http://slesh.name/uploads/IcqMod.rar (С) SLESH 2009
My proxy My proxy - поднимает проксю на 127.0.0.1:8080 Delphi код Code: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ToolWin, ImgList, Registry, IniFiles, WinSock, Unit2; type TForm1 = class(TForm) ListView1: TListView; ImageList1: TImageList; ToolBar1: TToolBar; ToolButton1: TToolButton; ToolButton4: TToolButton; ToolButton5: TToolButton; StatusBar1: TStatusBar; procedure ToolButton4Click(Sender: TObject); procedure ToolButton5Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ToolButton1Click(Sender: TObject); private _listenThread:TListenThread; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.ToolButton4Click(Sender: TObject); var _reg:TRegIniFile; begin _reg := TRegIniFile.Create('Software\Microsoft\Windows\CurrentVersion\Internet Settings'); _reg.WriteString('','ProxyServer', '127.0.0.1:8080'); _reg.WriteBool('', 'ProxyEnable', true); _reg.Free; ShowMessage('IE для текущего пользователя сконфигурирован!'); end; procedure TForm1.ToolButton5Click(Sender: TObject); var _reg:TRegIniFile; _ini:TIniFile; _AppData:string; begin _AppData := ''; _reg := TRegIniFile.Create('Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders'); _AppData := _reg.ReadString('', 'AppData', ''); if not (DirectoryExists(_AppData)) then begin ShowMessage ('Не получилось определить папку'); Exit; end; _AppData := _AppData+'\Opera\Opera\Profile\opera6.ini'; if not (FileExists(_AppData)) then begin ShowMessage('Не найден конфигурационный файл!'); Exit; end; _ini := TIniFile.Create(_AppData); _ini.WriteBool('Proxy', 'Use HTTP', true); _ini.WriteString('Proxy', 'HTTP Server','127.0.0.1:8080'); _reg.Free; _ini.Free; ShowMessage('Opera сконфигурирована!'); end; procedure TForm1.FormCreate(Sender: TObject); var _WSAData: WSAData; begin if (WSAStartup(makeword(1,1), _WSAData))<>0 then begin ShowMessage('Произошла ошибка при инициализации WinSock!'); Exit; end; end; procedure TForm1.ToolButton1Click(Sender: TObject); begin _listenThread := TListenThread.Create(false); StatusBar1.Panels.Items[0].Text := 'Проксик запущен на порту 8080'; end; end. Исходники + прога
Прога My fast port scan Программа My fast scan port быстро сканирует порты на удалённом сервере. Написанно на delphi 7. Code: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, winsock2, ComCtrls; type TForm1 = class(TForm) Panel1: TPanel; Label1: TLabel; AddressEdit: TEdit; Label2: TLabel; StartPortEdit: TEdit; EndPortEdit: TEdit; Label3: TLabel; Button1: TButton; DisplayMemo: TRichEdit; ProgressBar1: TProgressBar; procedure Button1Click(Sender: TObject); private { Private declarations } function LookupName: TInAddr; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} //Функция преобразвывающся введённый адрес сервера в спец формат //Если введено символьное имя, то она преобразовывает его сначала в IP адрес, //а потом переводит в спец формат function TForm1.LookupName: TInAddr; var HostEnt: PHostEnt; InAddr: TInAddr; begin if Pos('.', AddressEdit.Text)>0 then InAddr.s_addr := inet_addr(PChar(AddressEdit.Text)) else begin HostEnt := gethostbyname(PChar(AddressEdit.Text)); FillChar(InAddr, SizeOf(InAddr), 0); if HostEnt <> nil then begin with InAddr, HostEnt^ do begin S_un_b.s_b1 := h_addr^[0]; S_un_b.s_b2 := h_addr^[1]; S_un_b.s_b3 := h_addr^[2]; S_un_b.s_b4 := h_addr^[3]; end; end end; Result := InAddr; end; procedure TForm1.Button1Click(Sender: TObject); var i,j,s, opt, index: Integer; FSocket: array [0..41] of TSOCKET; //Массив сокетов busy : array [0..41] of boolean; //Массив, в котором будет храниться информация о каждом сканируемом сокете port : array [0..41] of integer; //Массив сканируемых портов addr : TSockAddr; hEvent : THandle; //Объект для обработки сетевых событий fset : TFDset; tv : TTimeval; tec :PServEnt; PName:String; GInitData : TWSADATA; begin // Устанавливаю максимальное и минимальное значение полоски состояния сканирования //Я устанавливаю в минимум начальный порт сканирования, а в максимум - конечный порт ProgressBar1.Min:=StrToInt(StartPortEdit.Text); ProgressBar1.Max:=StrToInt(EndPortEdit.Text); //Инициализирую WinSock WSAStartup(MAKEWORD(2,0), GInitData); //Записываю в переменную i значение начального порта i:=StrToInt(StartPortEdit.Text); //Заполняю основные поля структуры addr, которая будет использоваться //при вызове функции connect addr.sin_family := AF_INET; addr.sin_addr.s_addr := INADDR_ANY; //Вывожу сообщение о том, что начат поиск введённого хоста DisplayMemo.SelAttributes.Color:=clTeal; DisplayMemo.SelAttributes.Style:=DisplayMemo.SelAttributes.Style+[fsBold]; DisplayMemo.Lines.Add('Поиск хоста'); //LookupName - эта функция написана выше и она возвращяет адрес в спец формате указанного сервера //Результат этой функции я записываю в поле адреса сервера структуры addr addr.sin_addr := LookupName; //Вывожу сообщение о том, что начато сканирование DisplayMemo.SelAttributes.Color:=clTeal; DisplayMemo.SelAttributes.Style:=DisplayMemo.SelAttributes.Style+[fsBold]; DisplayMemo.Lines.Add('Сканирование...'); //В index находиться количество сокетов проверяемых за один раз index:=40; //Создаю объект для обработки сетевых событий hEvent := WSACreateEvent(); while i<StrToInt(EndPortEdit.Text) do begin ///Всем элементам массива busy присваиваю значение false for j:=0 to index do busy[j]:=false; //В этом цикле будут асинхронно посылаться запросы на моединение //переменная j будет изменяться от 0 до максимального количества //элементов в массиве for j:=0 to index do begin //Если j-й порт превысил значение указанного максимального //порта, то прервать цикл if i>StrToInt(EndPortEdit.Text) then begin index:=j-1; break; end; //Инициализирую очередной j-й сокет из массива FSocket FSocket[j] := socket(AF_INET, SOCK_STREAM, IPPROTO_IP); //Добавляю j-й сокет к объекту событий с помощью WSAEventSelect //1-й параметр - Добавляемый сокет //2-й параметр - объект событий, который был создан с помощью WSACreateEvent //3-й параметр - какие события ожидать. Тут я указываю FD_WRITE - события записи и FD_CONNECT - события о заключении соединения WSAEventSelect(FSocket[j], hEvent, FD_WRITE + FD_CONNECT); //Указываем порт, на который надо произвести попытку соединения addr.sin_port := htons(i); //Попытка коннекта на очередной порт connect(FSocket[j], @addr, sizeof(addr)); //Даём ОС поработать и обработать накопившиеся события. //Если этого не делать, то вовремя сканирования будет //происходить эффект зависания Application.ProcessMessages; //Проверяю, были ли ошибки. if WSAGetLastError()=WSAEINPROGRESS then begin //Если ошибка произошла, то закрываю этот порт closesocket (FSocket[j]); //Устанавливаю соответствующий элемент в массиве busy в true //чтобы потом не проверять этот порт, потому что он всё равно //уже закрыт busy[j]:=true; end; //Указываю в массиве port, на какой именно порт мы сейчас послали запрос port[j]:=i; //Увеличиваю счётчик i в котором я отслеживаю, какой порт сейчас сканируеться //чтобы на следующем этапе цикла for запустить сканирование следующего порта i:=i+1; end; //Обнуляю переменную fset FD_Zero(fset); //Заполняю сканируемый массив сокетов в переменную fset for j := 0 to index do begin if busy[j] <> true then FD_SET (FSocket[j], fset); end; //Даём ОС поработать и обработать накопившиеся события. Application.ProcessMessages; //Заполняю структуру, в которой указано время ожидания события от сокета tv.tv_sec := 1; //Мы будем ждать 1 секунду tv.tv_usec := 0; //Ожидаем пока произойдёт хотя бы одно событие от любого из сокетов s:=select (1, nil, @fset, nil, @tv); //Даём ОС поработать и обработать накопившиеся события. Application.ProcessMessages; //Запускаю массив, в котором будет проверятся, какие из сокетов в массиве FSocket //прошли коннект успешно, а какие нет. for j := 0 to index do begin //Проверяем, был ли закрыт соответствующий порт из-за ошибки //Если да, то нет смысла его проверять if busy[j] then continue; if FD_ISSET (FSocket[j], fset) then begin //В переменную s записываеться размер перменной Opt s:=Sizeof(Opt); opt:=1; //Получаю состояние текущего j-го сокета //результат состояния будет в переменной opt getsockopt(FSocket[j], SOL_SOCKET, SO_ERROR, @opt, s); //Если opt равно 0 то порт открыт и к нему можно подключится if opt=0 then begin //Пытаюсь узнать символьное имя порта tec := getservbyport(htons(Port[j]),'TCP'); if tec=nil then PName:='Unknown' else begin PName:=tec.s_name; end; //Вывожу сообщение об открытом порте DisplayMemo.Lines.Add('Хост:'+AddressEdit.Text+': порт :'+IntToStr(Port[j])+' ('+Pname+') '+' открыт '); end; end; //Закрыть j-й сокет, потому что он больше уже не нужен closesocket(FSocket[j]); end; //Увеличивею позицию в ProgressBar1 ProgressBar1.Position:=i; end; //Закрываю объект событий WSACloseEvent(hEvent); //Вывожу сообщение о конце сканирования DisplayMemo.SelAttributes.Color:=clTeal; DisplayMemo.SelAttributes.Style:=DisplayMemo.SelAttributes.Style+[fsBold]; DisplayMemo.Lines.Add('Сканирование закончено...'); ProgressBar1.Position:=0; end; end. Исходники + прога
ПЫЛЕСОС v2.0 качаем: http://jumpsoft.narod.ru/pileSOS.exe О программе: программа сортирует файлы там, куда вы ее поместите. Соответствующие файлы она перемещает в соответствующие папки, которые создает если их нету. Очень будет полезна тем, кто много качает и интернета, и на рабочем столе (и не только) у него хлам. --- Имеется множество настроек, также можно сортировать только те форматы, которые вы введете.
Читабельный вывод древообразной структуры на консоль Функция для вывода читабельной древообразной структуры на консоль. Писал для дерева такого типа Code: class Tree { public: std::string value; std::vector<Tree> tree; }; также легко будет переделать и под другой тип дерева. Например если сконструировать дерево след. выражения Code: 1+2*3 то вывод будет примерно таким Code: [+]-| |-[1] | |-[*]-| | |-[2] | |-[3] Code: #include <iostream> #include <string> #include <vector> class Tree { public: std::string value; std::vector<Tree> tree; }; void printTree (Tree tree, int offsetWidth = 0, std::string offsetStr = "") { std::string str = "[" + tree.value + "]"; std::string offset(offsetWidth + 1, ' '); // +1 because of '-' character on line 19 offset = offset.replace(0, offsetStr.length(), offsetStr); int length = str.length(); int size = tree.tree.size(); if (offsetWidth > 0) { offset += "|"; std::cout << offset << "-"; } std::cout << str; if (size > 0) { std::cout << "-|\n"; for (int i = 0; i < size; i++) { if (offsetWidth > 0) { printTree(tree.tree[i], length + offsetWidth + 3, offset); // +3 because of '[', ']', '-' characters } else { printTree(tree.tree[i], length + offsetWidth, offset); } if (i == size - 1) { std::cout << offset; std::cout << "\n"; } } } else { std::cout << "\n"; } } int main (int argc, char* argv[]) { print(tree); std::cin.get(); return 0; }
Bruteforce MMP / брут паролей сервиса mail.ru > intro Посмотрел сейчас сюжет про linux, про идеи open source (лиценцию GNU GPL) и решил опубликовать исходники. // тему создавал отдельную, но тут и обсуждать не чего. Пусть хоть исходник потеряется в сабжах нужной темы > WARNING Перед тем как компилировать исходники, настоятельно рекомендую прочесть статью 272 часть 2 (до пяти лет) и статью 138 УК РФ (до трёх лет) - about Функция генерация пароля взята из статьи "Циклический инкремент паролей", собственно каркас TCP/IP клиента у Криса Касперски, а идеи построения нормального сетевого приложения вычитаны у Йона Снейдера Клиент MMP собственно мой... многопоточность достигается путем открытия сразу N сокетов, которые в дальнейшем живут своей жизнью. + test При тестировании на скорости ~256 кб/c один сокет проверяет 4 пароля в секунду... 4 сокета соответственно 16 (думаю можно и больше не проверял). Приблизительно через 10 минут сервер попросту закрывает все соединения с данного IP (ну я так думаю, потому что помогает переподключение к инету). --==[ СОРЦЫ Bruteforce MMP ]==---
vkAPI.pas Code: unit vkapi; interface uses Windows, Classes, idHTTP, idCookieManager, SysUtils, Dialogs; var HTTP : TIDHTTP; function VK_Login(email, pass: string): boolean; procedure VK_GetFriendList(Names, OnlineFrinds: TStrings); function VK_OpenWriteBox(id: string): string; procedure VK_SendMessage(id, hash, msg: string); procedure VK_GetNewMessageList(Messages: TStrings); function VK_ReadMessage(msg_id: string): string; implementation function DecChas(chas: string): string; var Decchas : string; str : string; I : Integer; Len : integer; begin str := Copy(chas, 6, 12); Len := Length(str); For I := 0 To Length(str) -1 do begin Decchas := Decchas + str[len]; Inc(len, -1); end; str := Copy(chas, 21, Length(chas) -5); str := str + Copy(chas, 5, 1); Len := Length(str); For I := 0 To Length(str) -1 do begin Decchas := Decchas + str[len]; Inc(len, -1); end; Result := Decchas; end; function VK_Login(email, pass: string): boolean; var Cookie : TidCookieManager; Data, Page : TStringList; I : Integer; S : string; begin HTTP := TIDHTTP.Create(NIL); Cookie := TidCookieManager.Create(nil); Cookie.AddCookie('remixchk=5;', 'vkontakte.ru'); Cookie.AddCookie('remixclosed_tabs=0;', 'vkontakte.ru'); Cookie.AddCookie('remixlang=0;', 'vkontakte.ru'); Cookie.AddCookie('remixgroup_closed_tabs=0;', 'vkontakte.ru'); Cookie.AddCookie('remixnotajaxphotos=1;', 'vkontakte.ru'); Cookie.AddCookie('remixnews_privacy_filter=0;', 'vkontakte.ru'); Cookie.AddCookie('audio_vol=100;', 'vkontakte.ru'); HTTP.Request.UserAgent := 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 MRA 5.6 (build 03278) Firefox/3.5.7 sputnik 2.1.0.18'; HTTP.Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; HTTP.Request.AcceptLanguage := 'ru,en-us;q=0.7,en;q=0.3'; HTTP.Request.AcceptCharSet := 'windows-1251,utf-8;q=0.7,*;q=0.7'; HTTP.Request.Pragma := 'no-cache'; HTTP.Request.CacheControl := 'no-cache'; HTTP.Request.RawHeaders.Add('X-Requested-With: XMLHttpRequest'); HTTP.AllowCookies := True; HTTP.HandleRedirects := True; HTTP.ProtocolVersion := pv1_1; HTTP.CookieManager := Cookie; Data := TStringList.Create; Page := TStringList.Create; HTTP.Post('http://vkontakte.ru/login.php', Data); Data.Add('act=login'); Data.Add('email=' + email); Data.Add('pass=' + pass); Page.Text := HTTP.Post('http://login.vk.com/', Data); For I := 0 To Page.Count -1 Do begin If Pos('id=' + #39 + 's' + #39, Page[i]) <> 0 Then begin S := Page[i]; S := Copy(s, Pos('value=', s) +7, Length(s)); Delete(s, Pos(#39, s), Length(s)); end; end; Data.Clear; Data.Add('redirect=0'); // При установке значения "1", при успешном логине, вы попадаете на свою страницу Data.Add('op=slogin'); Data.Add('s=' + s); Page.Text := HTTP.Post('http://vkontakte.ru/login.php', Data); If Pos('error', Page.Text) <> 0 Then Result := False Else Result := True; Page.Free; Data.Free; end; procedure VK_GetFriendList(Names, OnlineFrinds: TStrings); var Data : TStringList; I : Integer; id, name, FriendsData, OnlineFriendsData: string; OnlineCount, FriendCount : string; begin Data := TStringList.Create; Data.Text := HTTP.Get('http://vkontakte.ru/friends.php'); For I := 0 To Data.Count -1 do begin If Pos('var friendsData', Data[i]) <> 0 Then begin FriendsData := Data[i]; FriendsData := Copy(FriendsData, Pos('friends' + #39 + ':', FriendsData) +10, Length(FriendsData)); Delete(FriendsData, Pos('universities', FriendsData) -3, Length(FriendsData)); end; If Pos('var js_fr_cnt', Data[i]) <> 0 Then begin FriendCount := data[i]; FriendCount := Copy(FriendCount, Pos('=', FriendCount) +2, Length(FriendCount)); Delete(FriendCount, Pos(';', FriendCount), Length(FriendCount)); end; end; For I := 0 To StrToInt(FriendCount) -1 do begin Name := Copy(FriendsData, Pos('"', FriendsData) +1, Length(FriendsData)); Id := Copy(FriendsData, Pos(',', id)+2, Length(FriendsData)); Delete(id, pos(',', id), Length(id)); If Id[1] = '[' Then Delete(id, 1, 1); Delete(FriendsData, 1, Pos(']', FriendsData)); Delete(id, pos(',', id), Length(id)); Delete(name, Pos('"', name), Length(name)); Names.Add(name + '{id:' + id + '}'); end; // Загружаем online друзей Sleep(1000); Data.Text := HTTP.Get('http://vkontakte.ru/friends.php?filter=online'); For I := 0 To Data.Count -1 do begin If Pos('var friendsData', Data[i]) <> 0 Then begin OnlineFriendsData := Data[i]; OnlineFriendsData := Copy(OnlineFriendsData, Pos('friends' + #39 + ':', OnlineFriendsData) +10, Length(OnlineFriendsData)); Delete(OnlineFriendsData, Pos('universities', OnlineFriendsData) -3, Length(OnlineFriendsData)); end; If Pos('friends_common_count', Data[i]) <> 0 Then begin OnlineCount := Data[i]; OnlineCount := Copy(OnlineCount, Pos('friends_common_count', OnlineCount) +22, Length(OnlineCount)); Delete(OnlineCount, Pos('<', OnlineCount), Length(OnlineCount)); end; end; For I := 0 To StrToInt(OnlineCount) -1 do begin Name := Copy(OnlineFriendsData, Pos('"', OnlineFriendsData) +1, Length(OnlineFriendsData)); Id := Copy(OnlineFriendsData, Pos(',', id)+2, Length(OnlineFriendsData)); Delete(id, pos(',', id), Length(id)); If Id[1] = '[' Then Delete(id, 1, 1); Delete(OnlineFriendsData, 1, Pos(']', OnlineFriendsData)); Delete(name, Pos('"', name), Length(name)); OnlineFrinds.Add(name + '{id:' + id + '}'); end; end; function VK_OpenWriteBox(id: string): string; var Str : string; begin Str := HTTP.Get('http://vkontakte.ru/mail.php?act=a_write_box&to=' + id); str := Copy(str, Pos('decodehash', str) +12, Length(str)); Delete(str, Pos(#39, str), Length(str)); Result := str; end; procedure VK_SendMessage(id, hash, msg: string); var Post : TStringList; begin Post := TStringList.Create; Post.Add('act=sent'); Post.Add('ajax=1'); Post.Add('chas=' + DecChas(hash)); Post.Add('to_id=' + id); Post.Add('title=Posted by Vkonatkte Messenger v1.0 by Vadim'); Post.Add('message=' + AnsiToUTF8(msg)); Post.Add('from_box=1'); HTTP.Request.Referer := 'http://vkontakte.ru/mail.php?act=a_write_box&to=' + id; HTTP.Post('http://vkontakte.ru/mail.php', Post); Post.Free; end; procedure VK_GetNewMessageList(Messages: TStrings); var Page : TStringList; I : Integer; Name, Body, id, Image, messId : string; begin Page := TStringList.Create; Page.Text := HTTP.Get('http://vkontakte.ru/mail.php'); For I := 0 To Page.Count -1 do begin If Pos('newRow', Page[i]) <> 0 Then begin Image := Page[i+8]; Image := Copy(image, Pos(#34, image) +1, Length(image)); Delete(image, Pos(#34, image), Length(image)); Id := Page[i+7]; Id := Copy(id, Pos('d', id) +1, Length(id)); Delete(id, pos(#34, id), Length(id)); MessId := Page[i+20]; MessId := Copy(MessId, Pos('mail.php?', MessId) +21, Length(MessId)); Delete(MessId, Pos('&', MessId), Length(MessId)); Name := Page[i+13]; Name := Copy(name, Pos('>', name) +1, length(name)); Delete(name, Pos('<', name), Length(name)); Body := Page[i+20]; Body := Copy(body, Pos('Body">', body) +6, Length(body)); Delete(body, Pos('<', body), Length(body)); Messages.Add('id: ' + Id + ',body:' + Body + ',name:' + name + ',messid:' + MessId); end; end; page.Free; end; function VK_ReadMessage(msg_id: string): string; var Page : TStringList; i : Integer; msg : string; begin Page := TStringList.Create; Page.Text := HTTP.Get('http://vkontakte.ru/mail.php?act=show&id=' + MSG_ID + '&out=0'); For I := 0 To Page.Count -1 do begin If Pos('<td class="label">Сообщение:</td>', Page[i]) <> 0 Then begin msg := Page[i+3]; msg := Copy(msg, Pos('">', msg) +2, Length(msg)); msg := StringReplace(msg, '<br>', #13, [rfReplaceAll]); Delete(msg, Pos('</div>', msg), Length(msg)); end; end; Result := msg; Page.Free; end; end.
Flash grabber by Gar|k Размер exe - 3.5 Кб Язык - winAPI Разрабатывалась для успешной сдачи сесси, препод зажал лекции в электронке Фишки: - Копирует скрытые файлы - Не нужно прав администратора - Небольшая нагрузка на процессор - Копирует только файлы определенного формата, пропуская уже скопированные файлы - Запоминает уже копированные флешки по серийному номеру и запускает повторное сканирование ЭТОЙ только через сутки. Подробнее о релизе смотреть тут - ИСХОДНИК, EXE Скомпиленная версия держит форматы doc,docx,ppt,pptx,rtf - все это легко правится из исходника + я предоставил проект vs2008 со всеми настройками
Дело было вечером делать было нечего =) решил написать Грабер для USB флешек (Вспомнилась статья из какого то номера Хакера) вот что получилось. Возможности 1. Возможность автозагрузки программы 2. Работать скрыто ( скрывает иконку из трея и ни о чем не предупреждает) 3. Типы файлов задаются по маске *.exe к примеру 4. Можно указать пусть куда копировать файлы 5. Все файлы разделяются по папкам для каждой флешки 6. Возможно сохранять структуру папко как на саомй флешку 7. построение полного списка файлов есть пару недочетов 1. длина 1 го расширения не более 6ти символов общая длина под маски равна 255 символов. 2. пусть до папки назначения должен быт обязательно указан и заканчиваться " \ " вот ссыль на сорци http://depositfiles.com/files/6twdaaw4h http://slil.ru/28543554 http://rapidshare.com/files/340750659/FlashGraber.rar.html пас antichat.ru P.S. жду справедливой критики по Коду и по самой идеи не сочтите за плагиат =) похоже идея родилась с Gar|k параллельно https://forum.antichat.ru/thread173437.html создавал тему с ним ранее
делим фал на части и качаем Code: unit DownloadTh; interface uses Windows, Classes, SysUtils, idHTTP, IdComponent, IniFiles, ExtCtrls; const HEADER_RANGE = 'Range: bytes='; HEADER_USERAGENT = 'Downloader/1.0 (Windows NT; Vadim; Redfern;)'; { Сюда идет запись файла } var FStream : TFileStream; { События } type TOnAddSegmentEvent = procedure(StartPos, MaxPos : Int64) of object; TOnSetPositionEvent = procedure(Index: Integer; Position: Int64) of object; { Основной класс(поток) } type TDownload = class(TThread) protected FHTTP : TidHTTP; FRangeStart : string; FRangeEnd : string; FURL : string; FFileName : string; FTotalCount : Int64; FContentLen : Int64; private { Properties } property URL : string read FURL write FURL; property FileName : string read FFileName write FFileName; property RangeStart : string read FRangeStart write FRangeStart; property RangeEnd : string read FRangeEnd write FRangeEnd; property TotalCount : Int64 read FTotalCount; property ContentLength : Int64 read FContentLen; { Procedures } procedure Execute; override; procedure OnWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); procedure OnWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer); procedure Disconnect; end; { Внешний класс(объект) для загрузки файла } type TMultiHTTPDownloader = class(TComponent) protected FDownload : array of TDownload; FPartCount : Integer; FFileName : string; FStateFile : string; FURL : string; FOnAddSegmentEvent : TOnAddSegmentEvent; FOnSetPositionEvent : TOnSetPositionEvent; FTimer : TTimer; FTotalCount : Int64; FContentLen : Int64; private procedure TriggerAddSegment(Min, Max: Int64); procedure TriggerSetPosition(Index: Integer; Position: Int64); procedure OnTimer(Sender: TObject); public constructor Create(AOwner: TComponent); procedure Start; procedure Abort; procedure Pause; procedure Resume; property TotalCount : Int64 read FTotalCount; property ContentLen : Int64 read FContentLen; published property PartCount : Integer read FPartCount write FPartCount; property FileName : string read FFileName write FFileName; property StateFile : string read FStateFile write FStateFile; property URL : string read FURL write FURL; property OnAddSegment : TOnAddSegmentEvent read FOnAddSegmentEvent write FOnAddSegmentEvent; property OnSetPosition: TOnSetPositionEvent read FOnSetPositionEvent write FOnSetPositionEvent; end; procedure Register; implementation /////////////////////////////TDownload///////////////////////////// { Выполнение загрузки } procedure TDownload.Execute; begin // Создаем объект "FHTTP" FHTTP := TidHTTP.Create(nil); // Присваеваем заголовки FHTTP.Request.CustomHeaders.Add(HEADER_RANGE + FRangeStart + '-' + FRangeEnd); // Custom FHTTP.Request.UserAgent := HEADER_USERAGENT; // Присвоение процедур FHTTP.OnWork := OnWork; FHTTP.OnWorkBegin := OnWorkBegin; // Запуск FHTTP.Get(FURL, FStream); // Очистка памяти по завершению FHTTP.Free; end; { Щитаем колличество скачанных байт } procedure TDownload.OnWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); begin FTotalCount := AWorkCount; end; { Щитаем общее колличество байт } procedure TDownload.OnWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer); begin FContentLen := AWorkCountMax; end; { Отключем } procedure TDownload.Disconnect; begin FHTTP.Disconnect; end; //-----------------------------------------------------------------------------| /////////////////////////////TMultiHTTPDownloader//////////////////////////////| //-----------------------------------------------------------------------------| // Создаем нужное вместе с объектом "TMultiHTTPDownloader" constructor TMultiHTTPDownloader.Create(AOwner: TComponent); begin Inherited Create(AOwner); FTimer := TTimer.Create(nil); FTimer.OnTimer := OnTimer; FTimer.Enabled := False; FTimer.Interval := 1000; end; // Обрабатываем нужные события в таймере procedure TMultiHTTPDownloader.OnTimer(Sender: TObject); var I : Integer; begin FContentLen := 0; FTotalCount := 0; For I := 0 To FPartCount -1 Do begin Inc(FTotalCount, FDownload[i].TotalCount); Inc(FContentLen, FDownload[i].ContentLength); TriggerSetPosition(I, FDownload[i].TotalCount); end; If FTotalCount = FContentLen Then begin FTimer.Enabled := False; end; end; // Добавить сегмент в индикатор procedure TMultiHTTPDownloader.TriggerAddSegment(Min, Max: Int64); begin If Assigned(FOnAddSegmentEvent) Then FOnAddSegmentEvent(Min, Max); end; // Установка позиции сегментов procedure TMultiHTTPDownloader.TriggerSetPosition(Index: Integer; Position: Int64); begin If Assigned(FOnSetPositionEvent) Then FOnSetPositionEvent(Index, Position); end; // Заустить закачку procedure TMultiHTTPDownloader.Start; var Chunk, Offset, ContentLength : Int64; HTTP : TidHTTP; I : Integer; begin { Проверка на назначенный статичный файл } If FStateFile = '' Then begin Raise Exception.Create('Имя статичного файла не определено'); Exit; end; { Проверка на введенный URL-аддрес } If FURL = '' Then begin Raise Exception.Create('поле URL не должено остоваться пустым'); Exit; end; { Прове } HTTP := TidHTTP.Create(nil); HTTP.Head(FURL); ContentLength := HTTP.Response.ContentLength; HTTP.Free; FStream := TFileStream.Create(FFileName, fmCreate); Chunk := ContentLength div FPartCount; Offset := 0; FTimer := TTimer.Create(nil); FTimer.OnTimer := OnTimer; FTimer.Interval := 1000; FTimer.Enabled := True; For I := 0 To FPartCount -1 Do begin SetLength(FDownload, I +1); FDownload[i] := TDownload.Create(True); FDownload[i].RangeStart := IntToStr(Offset); FDownload[i].RangeEnd := IntToStr(Offset + Chunk); FDownload[i].FreeOnTerminate := True; FDownload[i].FileName := FFileName; FDownload[i].URL := FURL; TriggerAddSegment(Offset, Offset + Chunk); Offset := Offset + Chunk +1; end; For I := 0 To FPartCount -1 Do FDownload[i].Resume; end; // Остановка procedure TMultiHTTPDownloader.Abort; var I : Integer; begin For I := 0 To FPartCount -1 Do begin FDOwnload[i].Disconnect; FDownload[i].Free; end; SetLength(FDownload, 0); FTimer.Enabled := False; end; // Пауза procedure TMultiHTTPDownloader.Pause; var I : Integer; iFile : TIniFile; begin iFile := TIniFile.Create(FStateFile); For I := 0 To FPartCount -1 do begin iFile.WriteString('Section ' + IntToStr(i), 'Position', IntToStr(FDownload[i].TotalCount)); iFile.WriteString('Section ' + IntToStr(i), 'Length', IntToStr(FDownload[i].ContentLength)); end; For I := 0 To FPartCount -1 Do begin FDownload[i].Disconnect; FDownload[i].Free; end; iFile.Free; FTimer.Enabled := False; end; // Возобновление procedure TMultiHTTPDownloader.Resume; var I : Integer; iFile : TIniFile; Temp : TStringList; begin iFile := TIniFile.Create(FStateFile); Temp := TStringList.Create; iFile.ReadSections(Temp); For I := 0 To Temp.Count -1 do begin SetLength(FDownload, I +1); FDownload[i] := TDownload.Create(True); FDownload[i].RangeStart := iFile.ReadString('Section ' + IntToStr(i), 'Position', ''); FDownload[i].RangeEnd := iFile.ReadString('Section ' + IntToStr(i), 'Length', ''); end; For I := 0 To Temp.Count -1 do FDownload[i].Resume; FTimer.Enabled := True; Temp.Free; iFile.Free; end; procedure Register; begin RegisterComponents('Standard', [TMultiHTTPDownloader]); end; end.
Простоя программулька для брокеров (котировки Forex) Написал для себя чтобы каждый раз в терминал MT4 не заходит Пример простой но кому то пригодится идея... Исходники и компилированные скачать тут
Look4Hash http://crackfor.me/index.php. Суть утилиты в том что ты подгружаешь хеш список, и прогоняешь его по сервису. сорцы Годится как пример для работы с компонентом BackgroundWorker. Писал на C#, .NET Framework 3.5. Visual Studio 2010 RC1.
base64_encode [C] Сейчас для HTTP аутентификации понадобилось... Может кому ещё пригодится. написано с помощью... Code: // base64 by Gar|k //#define B64_DEF_LINE_SIZE 72 //#define B64_MIN_LINE_SIZE 4 // buf - строка для кодирования // sizebuf - размер строки // rez - буффер для результата // функция возвращает размер полученого хеша int base64_encode(char *buf,int sizebuf,char *rez,int linesize) { static const char cb64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; unsigned char in[3], out[4]; int i, len, blocksout=0,count=0; while(count!=sizebuf) { len = 0; for( i = 0; i < 3; i++ ) { if( count!=sizebuf ) { in[i] = (unsigned char)*buf++; count++; len++; } else in[i] = 0; } if( len ) { out[0] = cb64[ in[0] >> 2 ]; out[1] = cb64[ ((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4) ]; out[2] = (unsigned char) (len > 1 ? cb64[ ((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6) ] : '='); out[3] = (unsigned char) (len > 2 ? cb64[ in[2] & 0x3f ] : '='); memcpy(rez,out,4); rez+=4; blocksout++; } if( blocksout >= (linesize/4) || count==sizebuf ) blocksout = 0; } *rez++=0; return count; }
Написал авторег вебмани.К сожалению без скрина кидаю. прога лежит тут: o4u.msk.ru/webmoneyreger.rar Прога регит форму, лезет на мыло, тырит активационный код, вписывает его, ждет активации по смс. Скоро сделаю авторег без активации по смс. Офф.Топик тут:https://forum.antichat.ru/thread191555.html
MD5 на основе Crypto API Понадобилось генерировать 128-ми битные ключи для RC4 шифрования, вспомнил про MD5. вариант с использованием динамически выделяемой памяти Code: #include <wincrypt.h> // на выходе адрес буфера 16 байтного хеша // после использования выполни VirtualFree(LPVOID lpAddress,0,MEM_RELEASE); unsigned char *md5(unsigned char *string,DWORD count) { HCRYPTPROV hProv; HCRYPTHASH hHash; unsigned char *hash_value; // Инициализация контекста криптопровайдера if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) { // Cоздание хеш-объекта if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) { // Передача хешируемых данных хэш-объекту. if (CryptHashData(hHash, string, count, 0)) { // Получение хеш-значения count = 0; if (CryptGetHashParam(hHash, HP_HASHVAL, NULL, &count, 0)) { hash_value=(unsigned char *)VirtualAlloc(NULL,count,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE); if (CryptGetHashParam(hHash, HP_HASHVAL, hash_value, &count, 0)) { return hash_value; } } } } } return NULL; } но хеш-то всегда 16 байт поэтому можно оптимизировать так Code: // hash_value указатель на >=16 байтный буфер (напр. char hash[16];) BOOL md5(unsigned char *hash_value,unsigned char *string,DWORD count) { HCRYPTPROV hProv; HCRYPTHASH hHash; // Инициализация контекста криптопровайдера if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) { // Cоздание хеш-объекта if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) { // Передача хешируемых данных хэш-объекту. if (CryptHashData(hHash, string, count, 0)) { // Получение хеш-значения count = 16; if (CryptGetHashParam(hHash, HP_HASHVAL, hash_value, &count, 0)) return TRUE; } } } return FALSE; }
BrutalSynonym BrutalSynonym Простенькая программа синонимайзер. Заменяет слова в тексте на их синонимы,если таковые находятся в словаре (прилагается). В словаре записи вида: слово синоним1 синоним2 ... синонимN Случайным образом выбирает по одному синониму к каждому слову. Вставляете текст в верхнее текстовое поле Нажимаете кнопку "Generate" Получаете текст в нижнем текстовом поле Качество замен зависит от словаря. Словарь можно дополнять и изменять (к примеру использовать английский словарь синонимов), но файл с синонимами должен иметь название "synonym.txt" Скачать BrutalSynonym
DateChanger v0.1 Программа для изменения ДАТЫ СОЗДАНИЯ большого количества файлов. Позволяет изменять дату создания файлов в каталоге по указанной маске. Возможна лишь установка действительной даты, т.е. даты, которая уже наступила. Также программа изменяет дату EXIF и удаляет содержание других параметров EXIF у файлов типа JPEG и JPG (небольшая потеря качества). Скачать DateChanger v0.1
не то что бы полезная программа скорее сырье для изучения регулярных выражений тем кто хочет поигратся с регулярными выражениями в ANSI С для компияции надо добавить библиотеку импорта glib.lib скачать версию для венды ну и поставить флаг компилировать как Си код без плюсов пользоватся просто вводим регулярное выражение диск на котором искать файлы перебирает все файлы на диске мапит и скармливает их глибовскому регекспу и выводит файлы в которых найдено совпадение например найти файлы в которых есть мыльники [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4} или файлы с адресами проксей [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:[0-9]{1,4} да или просто найти в каких файлах хранится твой пароль gj#@$hjkhkjh кому интересно велком http://www.regular-expressions.info/ работает довольно быстро так как файл мапится и тут же идет на парсинг в GRegex вообщем кто хочет изучить регекспы и пользоватся ими в ANSI C зе бест да и к тому же часто помниш слово а найти файл не можеш виндовый поиск иногда в упор не находит строку в файле хотя она там есть это только у меня так ? кому интересно зачем g_regex_match (regex, string, 0, &match_info); в SEH фрейм включено скажу дело в том чтоб не испортить файл он открывается с атрибутом PAGE_READONLY но не все файлы заканчиваются '\0' поэтому на 165 тыс файлов где то 18 нарушений доступа на эти случаи можно прикрутить когда поймали исключение загрузить файл полность в память завершить его '\0' вручную и отдать на парсинг это медленно поэтому я предпочел ловить исключения а когда поймал можно для него индивидуально и выделить память идеи насчет того что сделать защиту PAGE_READWRITE дописать '\0' и парсить не идут так как в момень парсинга могут прибить прогу файл останетя испорченным ну это так мысли может и можно еще как то сделать Code: #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <glib.h> typedef void (*LPSEARCHFUNC)(LPCTSTR lpszFileName); BOOL SearchFiles( LPCTSTR lpszFileName, LPSEARCHFUNC lpSearchFunc, BOOL bInnerFolders ); char file[MAX_PATH]; BOOL SearchFiles(LPCTSTR lpszFileName, LPSEARCHFUNC lpSearchFunc, BOOL bInnerFolders) { LPTSTR part; char tmp[MAX_PATH]; // временный массив char name[MAX_PATH]; HANDLE hSearch = NULL; WIN32_FIND_DATA wfd; memset(&wfd, 0, sizeof(WIN32_FIND_DATA)); // сначало поиск внутри вложенных папках ... if(bInnerFolders) { if(GetFullPathName(lpszFileName, MAX_PATH, tmp, &part) == 0) return FALSE; strcpy(name, part); strcpy(part, "*.*"); // если папки существуют, то делаем поиск wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE)) do { // в каждой папке есть две папки с именами "." и ".." // и эти папки мы не трогаем // пропускаем папки "." и ".." if (!strncmp(wfd.cFileName, ".", 1) || !strncmp(wfd.cFileName, "..", 2)) continue; if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // если мы нашли папку { char next[MAX_PATH]; if(GetFullPathName(lpszFileName, MAX_PATH, next, &part) == 0) return FALSE; strcpy(part, wfd.cFileName); strcat(next, "\\"); strcat(next, name); SearchFiles(next, lpSearchFunc, TRUE); } } while (FindNextFile(hSearch, &wfd)); // ищем следующий файл FindClose (hSearch); // заканчиваем поиск } if ((hSearch = FindFirstFile(lpszFileName, &wfd)) == INVALID_HANDLE_VALUE) return TRUE; // в противном случае выходим do if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // если мы нашли файл { if(GetFullPathName(lpszFileName, MAX_PATH, file, &part) == 0) return FALSE; strcpy(part, wfd.cFileName); lpSearchFunc(file); } while (FindNextFile(hSearch, &wfd)); // ищем следующий файл FindClose (hSearch); // заканчиваем поиск return TRUE; } int yes; char entries; int entriesf; int failopen; int all_files; int except; static void print_ip(const gchar *string); void __cdecl show_info() { int len, ret; char *cv, *pfmt; pfmt = strrchr(file, '\\'); if (!pfmt) __asm int 3; len = _scprintf("f %d s %d a %d x %d %s", failopen, yes, all_files, except, pfmt); if (-1 == len) __asm int 3; cv = malloc(len + 1); if (!cv) __asm int 3; ret = sprintf(cv, "f %d s %d a %d x %d %s", failopen, yes, all_files, except, pfmt); if (-1 == ret) __asm int 3; ret = SetConsoleTitle(cv); if (!ret) __asm int 3; free(cv); } void DoSomething(LPCTSTR name) { HANDLE hFile = INVALID_HANDLE_VALUE, hMap = NULL; DWORD dwFileSize; CHAR *base = NULL; show_info(++all_files); __try { hFile = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { show_info(++failopen); __leave; } dwFileSize = GetFileSize(hFile, NULL); if (dwFileSize == INVALID_FILE_SIZE) __leave; hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, dwFileSize, NULL); if (!hMap) __leave; base = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, dwFileSize); if (!base) __leave; print_ip(base); } __finally { if (base) UnmapViewOfFile(base); if (hMap) CloseHandle(hMap); if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile); } if (entriesf && entries == 'y') { puts(name); entriesf ^= entriesf; } return; } #define _124KB 126976 static char regexp[_124KB]; static void print_ip(const gchar *string) { GRegex *regex; GMatchInfo *match_info; regex = g_regex_new (regexp, 0, 0, NULL); __try { g_regex_match (regex, string, 0, &match_info); } __except(EXCEPTION_EXECUTE_HANDLER) { show_info(++except); g_regex_unref(regex); return; } while (g_match_info_matches (match_info)) { gchar *word = g_match_info_fetch (match_info, 0); g_print ("%s\n", word); g_free (word); g_match_info_next (match_info, NULL); entriesf = 1; show_info(++yes); } g_match_info_free (match_info); g_regex_unref (regex); } int main(void) { printf("echo entries (y/n) -> "); scanf("%c", &entries); fflush(stdin); printf("enter regexp -> "); gets(regexp); SearchFiles("C:\\*.*", DoSomething, TRUE); }