ПОИСК строки в ЧУЖEМ Процессе

Тема в разделе "WASM.BEGINNERS", создана пользователем keer, 10 фев 2008.

  1. keer

    keer New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    1
    Специ помогите кодом...необходимо чтобы мой процесс искал в задачах EXEL.EXE прошаривал его на наличие строки (определенной)и если таковая строка имеется в памяти EXEL то сразу убивал напрочь этот процесс (exel)..Заранее спасибо
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    VirtualQueryEx / ReadProcessMemory
     
  3. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Я как-то прогу писал, чтобы менять в игрушках деньги и жизни и т.д. По сути тоже самое. немного переработать.

    Код (Text):
    1. #include <windows.h>
    2. #include <ntdll.h>
    3. #include "resource.h"
    4. #include <BaseLibrary.h>
    5.  
    6.  
    7. #pragma comment(linker,"/entry:Main /subsystem:windows")
    8.  
    9. #define VAR_MASSIZE_SIZE 1024*1024
    10.  
    11. static PULONG  VarMassive;
    12. static ULONG   index;
    13. static HANDLE  hProcess;
    14.  
    15.  
    16. /* #######################################################################
    17. */
    18.  
    19. ULONG GetProcessID(PWCHAR ProcessName)
    20. {
    21.     ULONG a;
    22.     PVOID Buff;
    23.     PSYSTEM_PROCESSES pProcesses;
    24.  
    25.     ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,0,0,&a);
    26.     Buff = (PVOID)LocalAlloc(0,a);
    27.     ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,Buff,a,&a);
    28.  
    29.     pProcesses = (PSYSTEM_PROCESSES)Buff;
    30.    
    31.     for(a=1;a;)
    32.     {
    33.         if (!lstrcmpW(ProcessName,pProcesses->ProcessName.Buffer))
    34.         {
    35.             a = pProcesses->ProcessId;
    36.             LocalFree(Buff);
    37.             return a;
    38.         }      
    39.         a = pProcesses->NextEntryDelta;
    40.         pProcesses = (PSYSTEM_PROCESSES)( (PCHAR)pProcesses + a );
    41.     }
    42.  
    43.     LocalFree(Buff);
    44.     return 0;
    45. }
    46.  
    47. /* #######################################################################
    48. */
    49.  
    50. int __stdcall DialogFunc2(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lPara)
    51. {  
    52.     if ( msg == WM_CLOSE ) ExitProcess(0);
    53.  
    54.     if ( (msg != WM_COMMAND) || (wParam != IDC_BUTTON1) )
    55.         return 0;
    56.  
    57.     WCHAR ProcessName[16];
    58.     ULONG Pid;
    59.  
    60.     GetDlgItemTextW(hWnd,IDC_EDIT1,ProcessName,16);
    61.     Pid = GetProcessID(ProcessName);
    62.  
    63.     if(!Pid)
    64.         return MessageBox(hWnd,"Error: bad process name",0,MB_OK);
    65.  
    66.     SetDlgItemInt(hWnd,IDC_EDIT2,Pid,0);
    67.     hProcess = OpenProcess(PROCESS_ALL_ACCESS,0,Pid);
    68.     if (hProcess<=0)
    69.         return MessageBox(hWnd,"Error: can't open process",0,MB_OK);
    70.  
    71.     EndDialog(hWnd,0); 
    72.     return 0;
    73. }
    74.  
    75. /* #######################################################################
    76. */
    77.  
    78. #define MEMORY_PAGE    0x1000
    79.  
    80.  
    81. void ScanProcessMemory(ULONG value)
    82. {
    83.     __asm{
    84.         push    MEM_DECOMMIT
    85.         push    MEMORY_PAGE
    86.        
    87.         push    PAGE_READWRITE
    88.         push    MEM_COMMIT
    89.         push    MEMORY_PAGE
    90.         push    0
    91.         call    dword ptr [VirtualAlloc]
    92.         push    eax
    93.  
    94.         xor     esi,esi
    95.         mov     index,esi
    96.  
    97. aa10:
    98.         mov     edi,[esp]
    99.         add     esi,MEMORY_PAGE
    100.         jl      aa30
    101.  
    102.         push    0
    103.         push    MEMORY_PAGE
    104.         push    edi
    105.         push    esi
    106.         push    dword ptr [hProcess]
    107.         call    dword ptr [ZwReadVirtualMemory]
    108.         test    eax,eax
    109.         jnz     aa10
    110.  
    111.         mov     eax,value
    112.         mov     ecx,(MEMORY_PAGE/4)
    113. aa20:
    114.         repne   scasd
    115.         jecxz   aa10
    116.  
    117.         mov     edx,edi
    118.         sub     edx,[esp]
    119.         lea     edx,[esi+edx-4]
    120.         push    edx
    121.  
    122.         mov     edx,index
    123.         shl     edx,2
    124.         add     edx,[VarMassive]
    125.         pop     dword ptr [edx]
    126.        
    127.         inc     index
    128.         cmp     index,VAR_MASSIZE_SIZE
    129.         jb      aa20
    130. aa30:
    131.         call    dword ptr [VirtualFree] }
    132. }
    133.  
    134. /* #######################################################################
    135. */
    136.  
    137. void TestValue(HANDLE hProcess,ULONG value)
    138. {
    139.     ULONG i,j,a,val;
    140.  
    141.     for(i=0,j=0;i<index;i++)
    142.    
    143.         if (ReadProcessMemory(hProcess,(PVOID)VarMassive[i],&val,4,&a))
    144.    
    145.             if (val == value)
    146.             {
    147.                 VarMassive[j] = VarMassive[i];
    148.                 j++;
    149.             }  
    150.  
    151.     index = j;
    152.                
    153. }
    154.  
    155. /* #######################################################################
    156. */
    157.  
    158. void SetDlgItemMessive(HWND hWnd,ULONG inIDDlgItem,ULONG NumElements,PULONG pMassive)
    159. {
    160.     ULONG a;
    161.     PCHAR pBuff = (PCHAR)LocalAlloc(0,NumElements*10 + 2);
    162.     PCHAR p;
    163.  
    164.     for(a=0,p=pBuff;a<NumElements;a++)
    165.     {
    166.         _ultoa(pMassive[a],p,16);
    167.         p += lstrlen(p);
    168.         *(PWORD)p = '\r\n';
    169.         p += 2;
    170.     }
    171.     *p = '\x0';
    172.     SetDlgItemText(hWnd,inIDDlgItem,pBuff);
    173.     LocalFree(pBuff);
    174. }
    175.  
    176. /* #######################################################################
    177. */
    178.  
    179. int __stdcall DialogFunc1(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lPara)
    180. {  
    181.     if (msg == WM_CLOSE)
    182.         ExitProcess(0);
    183.  
    184.     if (msg == WM_COMMAND)
    185.    
    186. // Scan ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
    187.  
    188.     if(wParam == IDC_BUTTON1)
    189.     {
    190.         ULONG value;
    191.        
    192.         value = GetDlgItemInt(hWnd,IDC_EDIT1,0,0);
    193.         SetDlgItemText(hWnd,IDC_EDIT2,"");
    194.  
    195.  
    196.         ScanProcessMemory(value);
    197.         SetDlgItemText(hWnd,IDC_EDIT3,"Status success");
    198.        
    199.         if (!index)
    200.             return SetDlgItemText(hWnd,IDC_EDIT3,"value wasn't finding");
    201.  
    202.         SetDlgItemMessive(hWnd,IDC_EDIT2,index,VarMassive);    
    203.         return 0;
    204.     }
    205.  
    206. // Rescan ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
    207.  
    208.     else if (wParam == IDC_BUTTON3)
    209.     {
    210.         ULONG value;
    211.  
    212.         value = GetDlgItemInt(hWnd,IDC_EDIT1,0,0);
    213.         SetDlgItemText(hWnd,IDC_EDIT2,"");
    214.  
    215.  
    216.         TestValue(hProcess,value);
    217.         SetDlgItemText(hWnd,IDC_EDIT3,"Status success");
    218.  
    219.         if (!index)
    220.             return SetDlgItemText(hWnd,IDC_EDIT3,"value wasn't finding");
    221.  
    222.         SetDlgItemMessive(hWnd,IDC_EDIT2,index,VarMassive);    
    223.         return 0;
    224.     }
    225.  
    226. // Rewrite ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
    227.  
    228.     else if (wParam == IDC_BUTTON2)
    229.     {      
    230.         char  xxx[16];
    231.         ULONG Address;
    232.         ULONG value;
    233.         ULONG a;
    234.        
    235.         GetDlgItemText(hWnd,IDC_EDIT4,xxx,16);
    236.         value = GetDlgItemInt(hWnd,IDC_EDIT5,0,0);
    237.         Address = StringToHex(xxx);
    238.        
    239.         WriteProcessMemory(hProcess,(PVOID)Address,&value,4,&a);
    240.  
    241.         if (a!=4)
    242.             SetDlgItemText(hWnd,IDC_EDIT3,"Error...");
    243.         else
    244.             SetDlgItemText(hWnd,IDC_EDIT3,"Status success");
    245.        
    246.         return 0;
    247.     }
    248.  
    249.     return 0;
    250. }
    251.  
    252. /* #######################################################################
    253. */
    254.  
    255.  
    256. /* #######################################################################
    257. */
    258.  
    259. void Main()
    260. {
    261.     VarMassive = (PULONG)VirtualAlloc(0,VAR_MASSIZE_SIZE*4,MEM_COMMIT,PAGE_READWRITE);
    262.    
    263.  
    264.     DialogBoxParam(0,MAKEINTRESOURCE(IDD_DIALOG2),0,DialogFunc2,0);
    265.     DialogBoxParam(0,MAKEINTRESOURCE(IDD_DIALOG1),0,DialogFunc1,0);
    266.  
    267. }
     
  4. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    ZwReadVirtualMemory/ReadProcessMemory сами ловят эксепшены по неверным адресам? Т.е. отпадает нужда в Query по памяти?
    Хэндлы отрицательными разве не могут быть?
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    AFAIK, не могут быть по определению. А по определению они являются указателями. Соответственно выражение
    hProcess < 0 всегда ложно. В результате выражение hProcess<=0 равносильно hProcess == 0.
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    +
    -
    +
     
  7. EvilPhreak

    EvilPhreak New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    154
    Ошибочное определение. Они могут бы чем угодно, т.к. их внутренняая структура не документируется.
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    EvilPhreak and IceStudent
    Как же так? В winnt.h написано typedef void *HANDLE. Учитывая, что typedef есть ключевое слово для ОПРЕДЕЛЕНИЯ пользовательского типа, вполне правомерно сказать, что HANDLE является ПО ОПРЕДЕЛЕНИЮ указателем на void. Разумеется, можно вместо windows.h подключить какой-нибудь левый заголовочный файл типа myMegaWindowsDefinitions.h, где HANDLE определен, как массив указателей на структуру с полями bool YaRybko; bool YaKrevedko; bool YaZaycheg;, но от этого определение общепринятого в Windows понятия хэндла не изменится.
    В общем, где я несу бред? :)
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    l_inc
    void* - это указатель неопределённого типа. Хендл может быть как замаскированным указателем (указатель + дополнительные данные), так и (чаще всего) индексом в какой-то таблице.
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    IceStudent
    void * - это указатель НА неопределенный тип. И hProcess < 0 всегда ложно именно потому, что HANDLE (как тип данных) является указателем (а на что именно по сути и не важно). А рассматривать хэндл не как тип данных в контексте вопроса
    просто не имеет смысла, т.к. отрицательность/неотрицательность числа определяется тем, к какому типу данных мы его относим.
    Да... и хэндл (не как тип данных) может быть и прямым указателем без всяких дополнительных данных. Например, HMODULE.
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    GetCurrentProcess() == (ULONG)-1;
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    n0name
    Это в ответ на чей комментарий? Если на мой, то это только подтверждение того, что я говорю. -1 - положительное число, если его рассматривать в контексте типа ULONG. Хотя формально после приведения типа (ULONG) производится также неявное приведение к типу HANDLE, который ПО ОПРЕДЕЛЕНИЮ является типом void *, т.е. указателем.
    P.S. Решил перепроверить. Даже неявного приведения не происходит. Так что выражение GetCurrentProcess() == (ULONG)-1; не имеет смысла: no conversion from 'unsigned long' to 'void *'.
     
  13. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    IMHO без разницы как дать определение: будь то unsigned long GetCurrentProcess () или void* GetCurrentProcess или my_struct* GetCurrentProcess. Только для 64-битной системы для второго случаю пришлось бы делать unsigned longlong. Поэтому наверное и void*. Еще это избавляет некоторых ошибок, т.к. размер void незвестен. Типа нельзя сделать hProcess++ и т.п.

    с нулем тогда тоже не следует сравнивать
     
  14. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Так в том и дело, что зачастую либо 0 либо INVALID_HANDLE_VALUE, т.е. -1 в результате работы АПИшки...
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    KeSqueer
    Да. Без разницы. Но определение уже дала Microsoft. А мы им пользуемся. Да и на ответ на вопрос об отрицательности хэндлов все приведенные Вами примеры не повлияют.
    Следует или нет - это эстетический вопрос. Важно, что приведение нуля к нужному типу осуществляется неявно.
    asmfan
    INVALID_HANDLE_VALUE - это не -1. INVALID_HANDLE_VALUE - это (HANDLE)-1, т.е. неотрицательное число.

    P.S. Теперь чувстую, что влез в чужую тему и развел базар не по теме. Думаю, каждый понимает, когда 0FFh (или 0FFFF FFFFh - не важно) является положительным, а когда отрицательным. Так что все, начиная с восьмого поста, - это уже флуд пошел (я хотел себе плюсик в шестой пост отвоевать :) ).
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    l_inc
    По-своему ты прав, говоря о хендле как о типе данных С/С++. Мы же говорили о нём, как о типе данных Windows.