Форум: "Начинающим";
Текущий архив: 2009.05.24;
Скачать: [xml.tar.bz2];
ВнизID скрытого процесса Найти похожие ветки
← →
8shar © (2009-03-31 06:30) [0]Доброго дня. Нужно узнать ID скрытого процесса, как это осуществить?
← →
Palladin © (2009-03-31 07:47) [1]А ID не скрытого ты уже умеешь?
← →
KilkennyCat © (2009-03-31 08:16) [2]
> Palladin © (31.03.09 07:47) [1]
а че там уметь? ctrl+alt+del и в "вид"-"выбрать столбцы"-"показать PID"
← →
8shar © (2009-03-31 12:30) [3]Да. Вот так:
function TForm1.RMC: string;
var
HandleWindow, ProcessId, ThreadId : integer;
adr, written : Cardinal;
Const
Name = "C:\WINDOWS\system32\cmd.exe";
Address = $7FF50110;
Bit = 4;
begin
//ProcessId=12345;
ThreadId := GetWindowThreadProcessId(FindWindow(nil,name),@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
ReadProcessMemory(handlewindow,ptr(address),@adr,bit,written);
CloseHandle(HandleWindow);
Form1.Caption:=IntToStr(ProcessId);
Result:=IntToStr(adr);
end;
Задача поставлена так, есть программа, которая запускается через cmd, это программа матмодель работы технической машины, в cmd она выводит давление, температуру и т.д. мне нужно снять эти показания и вывести их. Что я придумал. Находим значения переменных в памяти через ArtMoney теперь зная адрес переменной в памяти и ID процесса их можно легко заполучить, если процесс не скрытый, то все работает на ура (написал маленькую прогу рандомно выводящие числа от 1 до 100 и проверил). Но проблема в том, что процесс скрытый, ID CMD я легко нахожу приведеной выше функцией а что делать со скрытым процессом, родителем которого является CMD не знаю. Знаю только, что его можно заполучить, но как?
Теперь, откуда я знаю что так можно сделать? Есть такая прога, приложение к ArtMoney которая отображает скрытые процессы называется она spydetector315rus, открываем находим нужный нам процесс смотрим ID например 12345 раскоментируя строчку в функции мы получим желаемый результат, давление.
← →
Сергей М. © (2009-03-31 12:45) [4]С чего бы вдруг процессу, выполняющему вполне легальные и нужные вычисления, скрываться от кого бы то ни было ?
> в cmd она выводит давление, температуру и т.д
Вот прямо из консоли и читай поток вывода той самой "хитрозадой" программы.
← →
8shar © (2009-03-31 13:26) [5]
> Вот прямо из консоли и читай поток вывода той самой "хитрозадой"
> программы.
А как это реализовать?
← →
Сергей М. © (2009-03-31 13:54) [6]http://www.google.ru/search?q=Delphi+%D1%87%D1%82%D0%B5%D0%BD%D0%B8%D0%B5+%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE+%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox-a
← →
8shar © (2009-03-31 15:24) [7]Вот скрин проги:
http://antsa.narod.ru/img.jpg
все белые цифры - постоянно меняются они отображают разного рода параметры (в основном температуру и расход). но меня интересуют 14 параметров вверху. оформленных в рамочке. Как их лучше от туда достать?
← →
Сергей М. © (2009-03-31 17:23) [8]Чтол ж ты голову людям морочишь со "скрытостью процесса" ?)
Эта программа не консольная, это MSDOS-приложение !
Процесс вовсе не скрыт и называется он NTVDM.EXE, он является вирт.машиной, исполняющей 16-разрядные ДОС-приложения.
← →
8shar © (2009-04-02 06:13) [9]
> Чтол ж ты голову людям морочишь со "скрытостью процесса"
> ?)
>
> Эта программа не консольная, это MSDOS-приложение !
>
> Процесс вовсе не скрыт и называется он NTVDM.EXE, он является
> вирт.машиной, исполняющей 16-разрядные ДОС-приложения.
Не знал. Так что теперь делать? Как их лучше получить?
← →
Сергей М. © (2009-04-02 08:23) [10]см. ReadConsoleOutput
← →
8shar © (2009-04-05 10:09) [11]Блин. Ниче не могу придумать. Ну как достать эти цифры???
← →
8shar © (2009-04-05 10:55) [12]http://www.delphimaster.ru/articles/console.html
И там есть:
Продвинутые возможности
Ввод с экрана
Экранный буфер - это ведь не только средство отображения. Он может служить промежуточным хранилищем для последующего ввода текста в обработку. Для получения текста с экрана служит вызов ReadConsoleOutputCharacter. Например:
ReadConsoleOutputAttribute(OutHnd,@Buffer[0],12,C,Wr);
Здесь 12 последовательных символов читаются с экрана, начиная с позиции С, и записываются в Buffer.
НО НЕ ПОЛУЧАЕТСЯ, КАК, КАК ЭТО СДЕЛАТЬ?!?!?
← →
Palladin © (2009-04-05 11:00) [13]раз не получается, то никак
← →
8shar © (2009-04-05 11:31) [14]
> Palladin © (05.04.09 11:00) [13]
>
> раз не получается, то никак
ну как так, если я не умею это еще не значит что нельзя, все же как то делают?
← →
Anatoly Podgoretsky © (2009-04-05 11:53) [15]> 8shar (05.04.2009 10:55:12) [12]
И не получится, поскольку
ReadConsoleOutputCharacter <> ReadConsoleOutputAttribute
← →
8shar © (2009-04-05 12:17) [16]
> Anatoly Podgoretsky © (05.04.09 11:53) [15]
>
> > 8shar (05.04.2009 10:55:12) [12]
>
> И не получится, поскольку
> ReadConsoleOutputCharacter <> ReadConsoleOutputAttribute
Не уверен что верно понял. Мне нужно просто заполучить символ с консоли стоящий в позиции X,Y а ReadConsoleOutputAttribute делает снимок с экрана по моему. но даже если и так как это можно использовать для решения моей задачи?
я пишу так:
var
pid: DWORD;
hStdout: thandle;
buffer : array [1..5,1..5] of char;
//buffer:char;
c:coord;
wr: cardinal;
ii:bool;
i,j:byte;
LING : byte;
begin
For i:=1 to 5 do
For j:=1 to 5 do
buffer[i,j]:="0";
wr:=0;
c.X:=1;
c.Y:=1;
LING := 1;
GetWindowThreadProcessId(FindWindow("C:\WINDOWS\system32\cmd.exe",nil), @pid);
hStdout := GetStdHandle(STD_OUTPUT_HANDLE);
ii:=ReadConsoleOutputCharacter(hStdout,@Buffer,LING,C,wr);
///MEMO///
Memo1.Lines.Add(IntToStr(FindWindow(nil,"C:\WINDOWS\system32\cmd.exe")));
if (Not ii) then Memo1.Lines.Add("?");
Memo1.Lines.Add(IntToStr(wr));
For i:=1 to 5 do
begin
For j:=1 to 5 do
Memo1.Lines.Text:=Memo1.Lines.Text + " " + buffer[i,j];
//Memo1.Lines.Add(buffer);
Memo1.Lines.Add("");
end;
///MEMO///
end;
← →
Palladin © (2009-04-05 12:28) [17]вот эта строчка
hStdout := GetStdHandle(STD_OUTPUT_HANDLE);
это что такое?
← →
8shar © (2009-04-05 12:34) [18]
> Anatoly Podgoretsky © (05.04.09 11:53) [15]
>
> > 8shar (05.04.2009 10:55:12) [12]
>
> И не получится, поскольку
>
> ReadConsoleOutputCharacter <> ReadConsoleOutputAttribute
Осознал.
var
pid: DWORD;
hStdout: thandle;
Buffer:array of integer;
c:coord;
wr:cardinal;
begin
c.X:=1;
c.Y:=1;
GetWindowThreadProcessId(FindWindow("C:\WINDOWS\system32\cmd.exe",nil), @pid);
hStdout := GetStdHandle(STD_OUTPUT_HANDLE);
ReadConsoleOutputAttribute(hStdout,@Buffer[0],2,C,Wr);
Memo1.Lines.Add(IntToStr(buffer[0]));
Memo1.Lines.Add(IntToStr(wr));
end;
все согласно http://www.delphimaster.ru/articles/console.html
а именно:
Продвинутые возможности
Ввод с экрана
Экранный буфер - это ведь не только средство отображения. Он может служить промежуточным хранилищем для последующего ввода текста в обработку. Для получения текста с экрана служит вызов ReadConsoleOutputCharacter. Например:
ReadConsoleOutputAttribute(OutHnd,@Buffer[0],12,C,Wr);
Здесь 12 последовательных символов читаются с экрана, начиная с позиции С, и записываются в Buffer.
← →
8shar © (2009-04-05 12:39) [19]
> Palladin © (05.04.09 12:28) [17]
>
> вот эта строчка
>
> hStdout := GetStdHandle(STD_OUTPUT_HANDLE);
>
> это что такое?
This is used to reset the carat/cursor to the top left.
Это используется для сброса карат / курсор в верхнем левом углу.
← →
Palladin © (2009-04-05 12:43) [20]фига себе откровение... главное что бы тебя быстрее отпустило...
← →
8shar © (2009-04-05 12:48) [21]Мне всего лишь нужно достать с проги http://antsa.narod.ru/img.jpg несколько цифр, помогите.... -_-,
← →
Palladin © (2009-04-05 12:49) [22]Найми программиста.
← →
8shar © (2009-04-05 12:57) [23]
> Palladin © (05.04.09 12:49) [22]
>
> Найми программиста.
НЕТ!!! я чувствую что истина где то рядом...
← →
8shar © (2009-04-05 13:14) [24]ReadConsoleOutput
http://winapi.freetechsecrets.com/win32/WIN32ReadConsoleOutput.htm
В ReadConsoleOutput функция читает характер и цвет атрибут данных из прямоугольных блоков характера клеток в буфер экрана консоли, а также функция записывает данные в прямоугольных блоков на указанном месте в буфер назначения.
ReadConsoleOutputAttribute
http://winapi.freetechsecrets.com/win32/WIN32ReadConsoleOutputAttribute.htm
В ReadConsoleOutputAttribute функция копии указанного количества плана и цвет фона атрибуты из последовательных ячеек консольный буфер экрана, начиная с указанного места.
ReadConsoleOutputCharacter
http://winapi.freetechsecrets.com/win32/WIN32ReadConsoleOutputCharacter.htm
В ReadConsoleOutputCharacter функция копии ряда персонажей из последовательных ячеек консольный буфер экрана, начиная с указанного места.
← →
Сергей М. © (2009-04-05 14:38) [25]
> This is used to reset the carat/cursor to the top left.
> Это используется для сброса карат / курсор в верхнем левом
> углу.
>
Какой такой "карат", какой такой "сброс" ?
Ты где увидел описание ф-ции GetStdHandle в таком виде - с "каратами" и "сбросами" ?
Эта ф-ция предназначена совсем для иной цели !
← →
8shar © (2009-04-05 14:50) [26]
> Какой такой "карат", какой такой "сброс" ?
> Ты где увидел описание ф-ции GetStdHandle в таком виде -
> с "каратами" и "сбросами" ?
> Эта ф-ция предназначена совсем для иной цели !
Это перевод с анг сайта там похожий пример рассматривался. да и:
http://www.delphikingdom.com/asp/itemq.asp?ItemID=448
http://www.sql.ru/forum/actualthread.aspx?tid=512514&pg=-1
я много где так встречал, думал мож оно так и нужно.
А что тогда передавать в эту функцию?
hConsoleOutput : Cardinal???????
← →
Тыщ © (2009-04-05 21:40) [27]А почему бы для доставания из досовской проги досовскую прогу не написать?
Текстовый буфер начинается с$B800:0
.
← →
Сергей М. © (2009-04-05 21:56) [28]
> что тогда передавать в эту функцию?
http://www.delphimaster.ru/articles/console.html
> Тыщ © (05.04.09 21:40) [27]
> Текстовый буфер начинается с $B800:0.
Каждая "досовская прога" будет выполняться в контексте отдельного экз-ра VM86-машины, соответственно будет иметь свой собственный текстовый экранный буфер.
← →
8shar © (2009-04-06 06:55) [29]Дескрипторы
Вызовом GetStdHandle можно узнать дескрипторы (handles) буфера ввода, стандартного экранного буфера и обработчика ошибок (не потребуется). Функция SetStdHandle может, при необходимости, переназначить их - это понадобится лишь при создании порожденных консольных процессов.
Довольно похож и вывод с помощью WriteConsole, но здесь писать можно на любой экран, в том числе не активный.
Рассмотрим пример:
var
C: _COORD;
Hnd, Wr: Cardinal;
...
begin
...
Hnd:=GetStdHandle(STD_INPUT_HANDLE);
inpHnd - дескриптор буфера ввода:
inpHnd:=GetStdHandle(STD_INPUT_HANDLE);
Но это все на вывод в консоль, так что по идее мне нужен
hStdout := GetStdHandle(STD_OUTPUT_HANDLE);
← →
Тыщ © (2009-04-06 11:33) [30]> Сергей М. © (05.04.09 21:56) [28]
> Каждая "досовская прога" будет выполняться в контексте отдельного экз-ра VM86-машины
Спасибо, я в курсе. Можно написать TSR.
← →
clickmaker © (2009-04-06 14:04) [31]> [7] 8shar © (31.03.09 15:24)
> Вот скрин проги:
> http://antsa.narod.ru/img.jpg
жесть!
я как-то писал нечто подобное под дос, но до того, что в текстовом режиме можно вентили и конденсаторы рисовать, не додумался.
Делал в графике )
← →
Сергей М. © (2009-04-06 14:10) [32]
> clickmaker © (06.04.09 14:04) [31]
Для хилых допотопных писюков псевдографика - самое то. И ресурсов не шибко много занимает и результаты в более-менее удобоваримом виде представляет.
← →
sniknik © (2009-04-06 14:47) [33]> Делал в графике )
я тоже... вот даже пример остался (не вирус! хоть и маленький)
http://webfile.ru/3339458
(запускать из под дос/интерпретатора например из запущенного NC (нортон командера, far не пойдет), и развернутым на весь экран (Alt+Enter). иначе ничего не видно ;()
← →
AndreyV © (2009-04-06 16:06) [34]> [33] sniknik © (06.04.09 14:47)
> (запускать из под дос/интерпретатора например из запущенного
> NC (нортон командера, far не пойдет), и развернутым на весь
> экран (Alt+Enter). иначе ничего не видно ;()
Из Far с Alt+Enter нормально.
← →
sniknik © (2009-04-06 16:20) [35]> Из Far с Alt+Enter нормально.
странно, а у меня в фаре пустой экран... ;( ну да пофигу это вообще под дос писалась, когда еще и винды то нормальной не было (3.11 вроде еще только была)...
← →
8shar © (2009-04-07 16:05) [36]а мне то что делать????
← →
Сергей М. © (2009-04-07 16:26) [37]
> мне то что делать?
Например, внять совету [22], потому как дело у тебя к 36-му посту нишиша не двинулось)
← →
8shar © (2009-04-07 17:03) [38]
>
> Например, внять совету [22], потому как дело у тебя к 36-
> му посту нишиша не двинулось)
Лед тронулся:
procedure TForm1.Button9Click(Sender: TObject);
type
TAttachConsole = function (dwProcessId: DWORD): LongBOOL stdcall;
var
AttachConsole: TAttachConsole;
mProcessID, Hcwnd, chRead: Cardinal;
BufInfo: _CONSOLE_SCREEN_BUFFER_INFO;
lpCh : PChar;
Coord: _COORD;
i: Integer;
Phwnd:HWND;
ii:bool;
begin
Phwnd:=FindWindow(nil,"C:\WINDOWS\system32\cmd.exe");
@AttachConsole := GetProcAddress(GetModuleHandle("kernel32.dll"), "AttachConsole");
GetWindowThreadProcessId(Phwnd,@mProcessID);
if AttachConsole(mProcessID) then begin
Hcwnd:=GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo (Hcwnd, BufInfo);
GetMem(lpCh, BufInfo.dwMaximumWindowSize.Y*BufInfo.dwMaximumWindowSize.X);
Coord.X:=0;
Coord.Y:=0;
ii := ReadConsoleOutputCharacter(Hcwnd,lpCh,BufInfo.dwMaximumWindowSize.X,Coord,chRead );
If ii then Memo1.Lines.Add("yes"); //успешон забрали с консоли
If not ii then Memo1.Lines.Add("no"); //не забрали с консоли
Memo1.Lines.Add(lpCh); //выводим то что забрали
Memo1.Lines.Add("Phwnd "+IntToStr(Phwnd));
Memo1.Lines.Add("Hcwnd "+IntToStr(Hcwnd));
end else Memo1.Lines.Add("Nea");
end;
Я же умею читать!!!
← →
8shar © (2009-04-07 18:10) [39]есть маленькая проблемка при первом на жатии кнопки все срабатывает при остальных - нет - вывод белеберду. Поработал над этим и:
← →
8shar © (2009-04-07 18:13) [40]
type
TAttachConsole = function (dwProcessId: DWORD): LongBOOL stdcall;
var
AttachConsole: TAttachConsole;
mProcessID, Hcwnd: Cardinal;
procedure TForm1.FormCreate(Sender: TObject);
begin
@AttachConsole := GetProcAddress(GetModuleHandle("kernel32.dll"), "AttachConsole");
GetWindowThreadProcessId(FindWindow(nil,"C:\WINDOWS\system32\cmd.exe"),@mProcess ID);
AttachConsole(mProcessID);
end;
function TForm1.ReadCMD(x, y: byte): string;
const
SMB = 4;
var
chRead: Cardinal;
BufInfo: _CONSOLE_SCREEN_BUFFER_INFO;
lpCh : PChar;
Coord: _COORD;
begin
Hcwnd:=GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo (Hcwnd, BufInfo);
GetMem(lpCh,SMB);
Coord.X:=x;
Coord.Y:=y;
ReadConsoleOutputCharacter(Hcwnd,lpCh,SMB,Coord,chRead);
Result:=copy(lpCh,1,SMB);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(ReadCMD(22,1));
end;
А вот это уже рабочий код, мы получаем 4 символа из CMD стоящие начиная с позиции x y передаваемой аргументами функции.
Спасибо всем огромное!!!
А насчет нанят программиста, я студент, учусь программить....
Вот....
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.05.24;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.006 c