Перечисляем хэндлы сокетов... в чем ошибка?

Тема в разделе "WASM.WIN32", создана пользователем slow, 20 фев 2007.

  1. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ну естественно не будут работать.
    AFAIR хендл сокет, это хендл во внутренней таблице хендлов.
     
  2. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Я в курсе ващет :)) Имеется в виду что я пробую с уже скопированным с пом. ZwDuplicateObject хэндлом.
     
  3. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    даже такой код не прокатывает

    Код (Text):
    1.              for j := 1 to 1000 do
    2.              begin
    3.                if DuplicateHandle(hProcess, j, INVALID_HANDLE_VALUE, Addr(hh),
    4.                                   DUPLICATE_SAME_ACCESS, false,0) then
    5.                begin
    6.                  if getpeername(hh, locname, ress) = 0 then writeln('socket!');
    7.                  CloseHandle(hh);
    8.                end;
    9.              end;
     
  4. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    хотя здесь
    http://www.codeguru.com/forum/showthread.php?t=176997
    утверждается что такой трюк пройдет.
     
  5. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Не догоняю в общем.
     
  6. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Чё-то я не понял твоего вопроса, я ж тебе уже написал, как можно отличить дескриптор сокета от просто файла.
     
  7. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    поясняю. у меня есть дескриптор сокета, честно скопированный с пом. duplicatehandle. wsa функции не желают воспринимать его как сокет, выдавая ошибку 10038, т.е. я не могу сделать getpeername например
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    А откуда ты его получил?
     
  9. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Смотри
    Код (Text):
    1. program kill_socket;
    2.  
    3. {$APPTYPE CONSOLE}
    4.  
    5. uses
    6.   jwanative, jwawintype, jwawinbase, jwantstatus, windows, sysutils, winsock, psapi;
    7.  
    8. const
    9.   TH32CS_SNAPTHREAD      = $00000004;
    10.   TH32CS_SNAPPROCESS     = $00000002;
    11.  
    12.  type
    13.   PROCESS_BASIC_INFORMATION = packed record
    14.     ExitStatus: NTSTATUS;
    15.     PebBaseAddress: PPEB;
    16.     AffinityMask: KAFFINITY;
    17.     BasePriority: KPRIORITY;
    18.     uUniqueProcessId: Ulong;
    19.     uInheritedFromUniqueProcessId: Ulong;
    20.   end;
    21.  
    22. PSYSTEM_HANDLE_INFORMATION_EX = ^SYSTEM_HANDLE_INFORMATION_EX;
    23. SYSTEM_HANDLE_INFORMATION_EX = packed record
    24.    NumberOfHandles: dword;
    25.    Information: array [0..0] of SYSTEM_HANDLE_INFORMATION;
    26.    end;
    27.  
    28. TPROCESSENTRY32 = packed record
    29.   dwSize: DWORD;
    30.   cntUsage: DWORD;
    31.   th32ProcessID: DWORD;
    32.   th32DefaultHeapID: DWORD;
    33.   th32ModuleID: DWORD;
    34.   cntThreads: DWORD;
    35.   th32ParentProcessID: DWORD;
    36.   pcPriClassBase: Longint;
    37.   dwFlags: DWORD;
    38.   szExeFile: array[0..MAX_PATH - 1] of Char;
    39.   end;
    40.  
    41. TTHREADENTRY32 = packed record
    42.   dwSize: DWORD;
    43.   cntUsage: DWORD;
    44.   th32ThreadID: DWORD;
    45.   th32OwnerProcessID: DWORD;
    46.   tpBasePri: Longint;
    47.   tpDeltaPri: Longint;
    48.   dwFlags: DWORD;
    49.   end;
    50.  
    51.  
    52.  
    53. Function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): dword stdcall;
    54.                                   external 'kernel32.dll';
    55. Function Thread32First(hSnapshot: THandle; var lpte: TThreadEntry32): BOOL stdcall;
    56.                                   external 'kernel32.dll';
    57. Function Thread32Next(hSnapshot: THandle; var lpte: TThreadENtry32): BOOL stdcall;
    58.                                   external 'kernel32.dll';
    59. Function Process32First(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL stdcall;
    60.                                   external 'kernel32.dll';
    61. Function Process32Next(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL stdcall;
    62.                                   external 'kernel32.dll';
    63.  
    64. { Получение Id процесса по его имени }
    65. function GetProcessId(pName: PChar): dword;
    66. var
    67.  Snap: dword;
    68.  Process: TPROCESSENTRY32;
    69. begin
    70.   Result := 0;
    71.   Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    72.   if Snap <> INVALID_HANDLE_VALUE then
    73.      begin
    74.       Process.dwSize := SizeOf(TPROCESSENTRY32);
    75.       if Process32First(Snap, Process) then
    76.          repeat
    77.           if lstrcmpi(Process.szExeFile, pName) = 0 then
    78.              begin
    79.               Result := Process.th32ProcessID;
    80.               CloseHandle(Snap);
    81.               Exit;
    82.              end;
    83.          until not Process32Next(Snap, Process);
    84.       Result := 0;
    85.       CloseHandle(Snap);
    86.      end;
    87. end;
    88.  
    89. function GetProcessNameFromPid(Pid: DWORD): string;
    90. var
    91.  Snap: dword;
    92.  Process: TPROCESSENTRY32;
    93. begin
    94.   Result := '';
    95.   Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    96.   if Snap <> INVALID_HANDLE_VALUE then
    97.      begin
    98.       Process.dwSize := SizeOf(TPROCESSENTRY32);
    99.       if Process32First(Snap, Process) then
    100.          repeat
    101.           if Process.th32ProcessID = PID then
    102.              begin
    103.               Result := Process.szExeFile;
    104.               CloseHandle(Snap);
    105.               Exit;
    106.              end;
    107.          until not Process32Next(Snap, Process);
    108.       Result := '';
    109.       CloseHandle(Snap);
    110.      end;
    111. end;
    112.  
    113. function GetPidFromHandle(Handle: Word): Dword;
    114.   var ProcessInfo: PROCESS_BASIC_INFORMATION;
    115. begin
    116.    if ZwQueryInformationProcess(Handle, ProcessBasicInformation,
    117. @ProcessInfo,
    118. SizeOf(PROCESS_BASIC_INFORMATION),
    119. nil) = STATUS_SUCCESS then result := ProcessInfo.uUniqueProcessId else result := 0;
    120. end;
    121.  
    122.  
    123.  
    124. { Получение буфера с системной информацией }
    125. Function GetInfoTable(ATableType:_SYSTEM_INFORMATION_CLASS):Pointer;
    126. var
    127.  mSize: dword;
    128.  mPtr: pointer;
    129.  St: NTStatus;
    130. begin
    131.  Result := nil;
    132.  mSize := $4000; //начальный размер буффера
    133.  repeat
    134.    mPtr := VirtualAlloc(nil, mSize, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
    135.    if mPtr = nil then Exit;
    136.    St := ZwQuerySystemInformation(ATableType, mPtr, mSize, nil);
    137.    if St = STATUS_INFO_LENGTH_MISMATCH then
    138.       begin //надо больше памяти
    139.         VirtualFree(mPtr, 0, MEM_RELEASE);
    140.         mSize := mSize * 2;
    141.       end;
    142.  until St <> STATUS_INFO_LENGTH_MISMATCH;
    143.  if St = STATUS_SUCCESS
    144.    then Result := mPtr
    145.    else VirtualFree(mPtr, 0, MEM_RELEASE);
    146. end;
    147.  
    148. var HandlesInfo: PSYSTEM_HANDLE_INFORMATION_EX;
    149.     PID, ret: DWORD;
    150.     ss: NTSTATUS;
    151.     i, j, ress, rem_port: integer;
    152.     us: PUNICODE_STRING;
    153.     ot: POBJECT_TYPE_INFORMATION;
    154.     s,s1, remaddr: string;
    155.     hProcess, ObjHandle, hh: THandle;
    156.     sockname, locname: sockaddr_in;
    157.     WSData: WSAData;
    158. begin
    159.    wsastartup($101, WSData);
    160.    writeln('There are the following sockets opened on system:');
    161.  
    162.    HandlesInfo := GetInfoTable(SystemHandleInformation);
    163.  
    164.    GetMem(ot, 102400);
    165.    GetMem(us, 102400);
    166.  
    167.    for i := 0 to HandlesInfo^.NumberOfHandles-1 do
    168.    begin
    169.     hProcess := OpenProcess(PROCESS_DUP_HANDLE, false, handlesinfo.Information[i].ProcessId);
    170.  
    171.      if hProcess <> INVALID_HANDLE_VALUE then
    172.      begin
    173.        if ZwDuplicateObject(hProcess,HandlesInfo^.Information[i].Handle,
    174.                        INVALID_HANDLE_VALUE, Addr(ObjHandle), DUPLICATE_SAME_ACCESS, 0, 0) = STATUS_SUCCESS
    175.        then begin
    176.  
    177.          //--- determine object type info
    178.          ss := ZwQueryObject(ObjHandle,
    179.                           ObjectTypeInformation, ot, 102400, addr(ret));
    180.  
    181.          if ss = STATUS_SUCCESS then
    182.          begin
    183.  
    184.            //--- convert object type name to ansi
    185.            s := WIdeCharToString(ot.Name.Buffer);
    186.  
    187.            if s = 'File' then //--- File object
    188.            begin
    189.              //--- determine it's name
    190.              ss := ZwQueryObject(ObjHandle, ObjectNameInformation, us, 102400, addr(ret));
    191.              //--- convert to ansi
    192.              s1 := WideCharToString(us.Buffer);
    193.  
    194.              if (s1 = '\Device\Tcp') or (s1 = '\Device\Udp') or (s1 = '\Device\Ip') then
    195.              begin
    196.                //--- determine peer ip and port
    197.                getpeername(ObjHandle, sockname, ress);
    198.                writeln(wsagetlasterror); //--- return 10038 always
    199.                getsockname(ObjHandle, locname, ress);
    200.                writeln(wsagetlasterror); //--- return 10038 always
    201.                remaddr := inet_ntoa(sockname.sin_addr);
    202.                rem_port := ntohs(sockname.sin_port);
    203.                //--- write to output
    204.                writeln(
    205.                        'Object name=',s1,
    206.                        '; Owner=',GetProcessNameFromPid(HandlesInfo^.Information[i].ProcessId),
    207.                        '; Peer=',remaddr,':',rem_port
    208.                        );
    209.              end;
    210.            end;
    211.  
    212.           ZwClose(ObjHandle);
    213.  
    214.          end;
    215.        end;
    216.      end;
    217.  
    218.    end;
    219.  
    220.    FreeMem(ot);
    221.    FreeMem(us);
    222.  
    223.    WSACleanup;
    224.  
    225.    readln;
    226.  
    227. end.
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Хендл файла не есть хендл сокета, как я и писал выше.
     
  11. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Тогда я не понимаю как получить хэндлы сокетов чужого приложения.
     
  12. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Ну разве только WSADuplicateSocket в контексте нужного приложения.
    Хех.
    Даже использование второго винсока не дает ничего :dntknw:
     
  13. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    iphlpapi.AllocateAndGetTcpTableFromStack чтобы получить список коннектов без натив апи
    SetTcpEntry - можно исп-ть для убиения коннекта
     
  14. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Хотя... читал вот тута
    hттp://rtfm.4hack.com/print.php?act=articles&id1=11&id2=17&PHPSESSID=fa61a8e076a1819e7e891699ea83aacc

    оказывается передать сокет от одного процесса к другому можно но в контексте моей задачи придется инжектировать код в тот самый процесс, откуда копируется сокет.
     
  15. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Нашел решение. Отчасти навеянное этим топиком
    http://wasm.ru/forum/viewtopic.php?id=18976

    Исходник выложу, как только "причешу" его.
     
  16. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    http://slow.alfamoon.com/?module=filesdb&id=1&fid=12&get=1
     
  17. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Сорри, не заметил при первом прочтении :dntknw:((