Специ помогите кодом...необходимо чтобы мой процесс искал в задачах EXEL.EXE прошаривал его на наличие строки (определенной)и если таковая строка имеется в памяти EXEL то сразу убивал напрочь этот процесс (exel)..Заранее спасибо
Я как-то прогу писал, чтобы менять в игрушках деньги и жизни и т.д. По сути тоже самое. немного переработать. Код (Text): #include <windows.h> #include <ntdll.h> #include "resource.h" #include <BaseLibrary.h> #pragma comment(linker,"/entry:Main /subsystem:windows") #define VAR_MASSIZE_SIZE 1024*1024 static PULONG VarMassive; static ULONG index; static HANDLE hProcess; /* ####################################################################### */ ULONG GetProcessID(PWCHAR ProcessName) { ULONG a; PVOID Buff; PSYSTEM_PROCESSES pProcesses; ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,0,0,&a); Buff = (PVOID)LocalAlloc(0,a); ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,Buff,a,&a); pProcesses = (PSYSTEM_PROCESSES)Buff; for(a=1;a;) { if (!lstrcmpW(ProcessName,pProcesses->ProcessName.Buffer)) { a = pProcesses->ProcessId; LocalFree(Buff); return a; } a = pProcesses->NextEntryDelta; pProcesses = (PSYSTEM_PROCESSES)( (PCHAR)pProcesses + a ); } LocalFree(Buff); return 0; } /* ####################################################################### */ int __stdcall DialogFunc2(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lPara) { if ( msg == WM_CLOSE ) ExitProcess(0); if ( (msg != WM_COMMAND) || (wParam != IDC_BUTTON1) ) return 0; WCHAR ProcessName[16]; ULONG Pid; GetDlgItemTextW(hWnd,IDC_EDIT1,ProcessName,16); Pid = GetProcessID(ProcessName); if(!Pid) return MessageBox(hWnd,"Error: bad process name",0,MB_OK); SetDlgItemInt(hWnd,IDC_EDIT2,Pid,0); hProcess = OpenProcess(PROCESS_ALL_ACCESS,0,Pid); if (hProcess<=0) return MessageBox(hWnd,"Error: can't open process",0,MB_OK); EndDialog(hWnd,0); return 0; } /* ####################################################################### */ #define MEMORY_PAGE 0x1000 void ScanProcessMemory(ULONG value) { __asm{ push MEM_DECOMMIT push MEMORY_PAGE push PAGE_READWRITE push MEM_COMMIT push MEMORY_PAGE push 0 call dword ptr [VirtualAlloc] push eax xor esi,esi mov index,esi aa10: mov edi,[esp] add esi,MEMORY_PAGE jl aa30 push 0 push MEMORY_PAGE push edi push esi push dword ptr [hProcess] call dword ptr [ZwReadVirtualMemory] test eax,eax jnz aa10 mov eax,value mov ecx,(MEMORY_PAGE/4) aa20: repne scasd jecxz aa10 mov edx,edi sub edx,[esp] lea edx,[esi+edx-4] push edx mov edx,index shl edx,2 add edx,[VarMassive] pop dword ptr [edx] inc index cmp index,VAR_MASSIZE_SIZE jb aa20 aa30: call dword ptr [VirtualFree] } } /* ####################################################################### */ void TestValue(HANDLE hProcess,ULONG value) { ULONG i,j,a,val; for(i=0,j=0;i<index;i++) if (ReadProcessMemory(hProcess,(PVOID)VarMassive[i],&val,4,&a)) if (val == value) { VarMassive[j] = VarMassive[i]; j++; } index = j; } /* ####################################################################### */ void SetDlgItemMessive(HWND hWnd,ULONG inIDDlgItem,ULONG NumElements,PULONG pMassive) { ULONG a; PCHAR pBuff = (PCHAR)LocalAlloc(0,NumElements*10 + 2); PCHAR p; for(a=0,p=pBuff;a<NumElements;a++) { _ultoa(pMassive[a],p,16); p += lstrlen(p); *(PWORD)p = '\r\n'; p += 2; } *p = '\x0'; SetDlgItemText(hWnd,inIDDlgItem,pBuff); LocalFree(pBuff); } /* ####################################################################### */ int __stdcall DialogFunc1(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lPara) { if (msg == WM_CLOSE) ExitProcess(0); if (msg == WM_COMMAND) // Scan ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ if(wParam == IDC_BUTTON1) { ULONG value; value = GetDlgItemInt(hWnd,IDC_EDIT1,0,0); SetDlgItemText(hWnd,IDC_EDIT2,""); ScanProcessMemory(value); SetDlgItemText(hWnd,IDC_EDIT3,"Status success"); if (!index) return SetDlgItemText(hWnd,IDC_EDIT3,"value wasn't finding"); SetDlgItemMessive(hWnd,IDC_EDIT2,index,VarMassive); return 0; } // Rescan ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ else if (wParam == IDC_BUTTON3) { ULONG value; value = GetDlgItemInt(hWnd,IDC_EDIT1,0,0); SetDlgItemText(hWnd,IDC_EDIT2,""); TestValue(hProcess,value); SetDlgItemText(hWnd,IDC_EDIT3,"Status success"); if (!index) return SetDlgItemText(hWnd,IDC_EDIT3,"value wasn't finding"); SetDlgItemMessive(hWnd,IDC_EDIT2,index,VarMassive); return 0; } // Rewrite ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ else if (wParam == IDC_BUTTON2) { char xxx[16]; ULONG Address; ULONG value; ULONG a; GetDlgItemText(hWnd,IDC_EDIT4,xxx,16); value = GetDlgItemInt(hWnd,IDC_EDIT5,0,0); Address = StringToHex(xxx); WriteProcessMemory(hProcess,(PVOID)Address,&value,4,&a); if (a!=4) SetDlgItemText(hWnd,IDC_EDIT3,"Error..."); else SetDlgItemText(hWnd,IDC_EDIT3,"Status success"); return 0; } return 0; } /* ####################################################################### */ /* ####################################################################### */ void Main() { VarMassive = (PULONG)VirtualAlloc(0,VAR_MASSIZE_SIZE*4,MEM_COMMIT,PAGE_READWRITE); DialogBoxParam(0,MAKEINTRESOURCE(IDD_DIALOG2),0,DialogFunc2,0); DialogBoxParam(0,MAKEINTRESOURCE(IDD_DIALOG1),0,DialogFunc1,0); }
ZwReadVirtualMemory/ReadProcessMemory сами ловят эксепшены по неверным адресам? Т.е. отпадает нужда в Query по памяти? Хэндлы отрицательными разве не могут быть?
AFAIK, не могут быть по определению. А по определению они являются указателями. Соответственно выражение hProcess < 0 всегда ложно. В результате выражение hProcess<=0 равносильно hProcess == 0.
EvilPhreak and IceStudent Как же так? В winnt.h написано typedef void *HANDLE. Учитывая, что typedef есть ключевое слово для ОПРЕДЕЛЕНИЯ пользовательского типа, вполне правомерно сказать, что HANDLE является ПО ОПРЕДЕЛЕНИЮ указателем на void. Разумеется, можно вместо windows.h подключить какой-нибудь левый заголовочный файл типа myMegaWindowsDefinitions.h, где HANDLE определен, как массив указателей на структуру с полями bool YaRybko; bool YaKrevedko; bool YaZaycheg;, но от этого определение общепринятого в Windows понятия хэндла не изменится. В общем, где я несу бред?
l_inc void* - это указатель неопределённого типа. Хендл может быть как замаскированным указателем (указатель + дополнительные данные), так и (чаще всего) индексом в какой-то таблице.
IceStudent void * - это указатель НА неопределенный тип. И hProcess < 0 всегда ложно именно потому, что HANDLE (как тип данных) является указателем (а на что именно по сути и не важно). А рассматривать хэндл не как тип данных в контексте вопроса просто не имеет смысла, т.к. отрицательность/неотрицательность числа определяется тем, к какому типу данных мы его относим. Да... и хэндл (не как тип данных) может быть и прямым указателем без всяких дополнительных данных. Например, HMODULE.
n0name Это в ответ на чей комментарий? Если на мой, то это только подтверждение того, что я говорю. -1 - положительное число, если его рассматривать в контексте типа ULONG. Хотя формально после приведения типа (ULONG) производится также неявное приведение к типу HANDLE, который ПО ОПРЕДЕЛЕНИЮ является типом void *, т.е. указателем. P.S. Решил перепроверить. Даже неявного приведения не происходит. Так что выражение GetCurrentProcess() == (ULONG)-1; не имеет смысла: no conversion from 'unsigned long' to 'void *'.
IMHO без разницы как дать определение: будь то unsigned long GetCurrentProcess () или void* GetCurrentProcess или my_struct* GetCurrentProcess. Только для 64-битной системы для второго случаю пришлось бы делать unsigned longlong. Поэтому наверное и void*. Еще это избавляет некоторых ошибок, т.к. размер void незвестен. Типа нельзя сделать hProcess++ и т.п. с нулем тогда тоже не следует сравнивать
Так в том и дело, что зачастую либо 0 либо INVALID_HANDLE_VALUE, т.е. -1 в результате работы АПИшки...
KeSqueer Да. Без разницы. Но определение уже дала Microsoft. А мы им пользуемся. Да и на ответ на вопрос об отрицательности хэндлов все приведенные Вами примеры не повлияют. Следует или нет - это эстетический вопрос. Важно, что приведение нуля к нужному типу осуществляется неявно. asmfan INVALID_HANDLE_VALUE - это не -1. INVALID_HANDLE_VALUE - это (HANDLE)-1, т.е. неотрицательное число. P.S. Теперь чувстую, что влез в чужую тему и развел базар не по теме. Думаю, каждый понимает, когда 0FFh (или 0FFFF FFFFh - не важно) является положительным, а когда отрицательным. Так что все, начиная с восьмого поста, - это уже флуд пошел (я хотел себе плюсик в шестой пост отвоевать ).
l_inc По-своему ты прав, говоря о хендле как о типе данных С/С++. Мы же говорили о нём, как о типе данных Windows.