Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2012, 14:33   #11
Rock-n-Rolla
Форумчанин
 
Регистрация: 11.01.2012
Сообщений: 177
По умолчанию

Цитата:
Сообщение от L6go1as Посмотреть сообщение
А в чем разница, между ZwQuerySystemInformation и NtQuerySystemInformation ?
Что ту, что другую MSDN рекомендует не использовать.
более того, в user mode разницы между ними никакой нету. разница между функциями Zw* и Nt* есть только в kernel mode, и эта разница совершенно теряет смысл в user mode, поэтому в user mode это просто одна функция с разными именами
progromore.i2p - первый русскоязычный портал программистов в скрытосети
Rock-n-Rolla вне форума Ответить с цитированием
Старый 20.01.2012, 15:31   #12
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Если использовать CreateToolhelp32Snapshot или EnumProcesses, то они не показывают процессы на х64, я уже и не говорю, что с первой функцией вообще черт голову сломит ...
По крайне мере я разобраться не могу ...

Так как все же получить список процессов, как х86, так и х64?
L6go1as вне форума Ответить с цитированием
Старый 20.01.2012, 17:50   #13
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Так, вот что получилось на данный момент ...
Код:
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>

using std::cout;
using std::cin;
using std::endl;

int main()
{
	HANDLE hProcessSnap = NULL;
	hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

	if(hProcessSnap == INVALID_HANDLE_VALUE)
		return -1;

	PROCESSENTRY32 pe32;
	pe32.dwSize = sizeof(PROCESSENTRY32);

	do
	{
		cout << "Process Name: " << pe32.szExeFile << endl;
		cout << "PID: " << pe32.th32ProcessID << endl;
		cout << endl;

	} while(Process32Next(hProcessSnap, &pe32));

	CloseHandle(hProcessSnap);
	system("pause");
}
Пример выполнения программы:


PID определяется как у x86, так и у x64. Однако имя отображается некорректно.
Как и первая строка, буду пока думать как исправить ...

Цитата:
Сообщение от Rock-n-Rolla Посмотреть сообщение
попробуй так

cout << "Process Name: " << &pe32.szExeFile[0] << endl;
Увы, пробовал так, как и вывод с использованием wchar_t*, не работает тоже, хотя странно, ведь pe32.szExeFile - строка длиною [256], по идее должно работать, но нет. Увы...

Последний раз редактировалось L6go1as; 20.01.2012 в 18:16.
L6go1as вне форума Ответить с цитированием
Старый 20.01.2012, 18:07   #14
Rock-n-Rolla
Форумчанин
 
Регистрация: 11.01.2012
Сообщений: 177
По умолчанию

Цитата:
Сообщение от L6go1as Посмотреть сообщение
PID определяется как у x86, так и у x64. Однако имя отображается некорректно.
Как и первая строка, буду пока думать как исправить ...
попробуй так

cout << "Process Name: " << &pe32.szExeFile[0] << endl;
progromore.i2p - первый русскоязычный портал программистов в скрытосети
Rock-n-Rolla вне форума Ответить с цитированием
Старый 20.01.2012, 18:12   #15
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Чутка изменил код, теперь все отображается как надо.
Правда может другие параметры выдавать не будет, но имя и PID - выдает, в принципе мне больше и не нужно.

Код:
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>

using std::cout;
using std::cin;
using std::endl;

int main()
{
	HANDLE hProcessSnap = NULL;
	hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

	if(hProcessSnap == INVALID_HANDLE_VALUE)
		return -1;

	PROCESSENTRY32 pe32;
	pe32.dwSize = sizeof(PROCESSENTRY32);

	if(!Process32First(hProcessSnap, &pe32))
		return -1;

	do
	{
		wprintf(L"Process Name: %s", pe32.szExeFile);
		cout << endl;
		cout << "PID: " << pe32.th32ProcessID << endl;
		cout << endl;

	} while(Process32Next(hProcessSnap, &pe32));

	CloseHandle(hProcessSnap);
	system("pause");
}
Пример выполнения программы:
L6go1as вне форума Ответить с цитированием
Старый 20.01.2012, 18:15   #16
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Rock-n-Rolla, дело не в этом.
у ТС включен юникод в проекте. а std::cout не выводит wchar_t*(выводит как значение указателя, что и видим)
итог, применяем std::wcout.

кстати, Леголас, я же давал вам уже функцию.
правда про x64 тогда не проверял.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.01.2012, 18:19   #17
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Rock-n-Rolla, дело не в этом.
у ТС включен юникод в проекте. а std::cout не выводит wchar_t*(выводит как значение указателя, что и видим)
итог, применяем std::wcout.

кстати, Леголас, я же давал вам уже функцию.
правда про x64 тогда не проверял.
Да, давал где-то, но я чего-то не нашел, решил заново раскрыть тему "сисек" ))
Тем более, насколько я помню, у тебя там кода было куда больше ... так что я там даже особо и разбираться не стал, уж больно "много", как мне показалось на тот момент.

P.s
давай уж на Ты, а то как-то я слишком молод на Вы, или это Вы слишком молоды по сравнению со мной ? ))

P.s.s.
Про wcout совсем забыл Т_Т, правда пока не попробовал скомпилировать, был уверен, что отобразит только первый символ имени.

Последний раз редактировалось L6go1as; 20.01.2012 в 18:24.
L6go1as вне форума Ответить с цитированием
Старый 20.01.2012, 18:47   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Про wcout совсем забыл Т_Т, правда пока не попробовал скомпилировать, был уверен, что отобразит только первый символ имени.
такое возникает при насильном(и неверном) касте из wchar_t* в char*.
Цитата:
Тем более, насколько я помню, у тебя там кода было куда больше ... так что я там даже особо и разбираться не стал, уж больно "много", как мне показалось на тот момент.
потому что у меня возвращался std::vector с парой имя->PID.

я возраст не скрываю, мне 19.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.01.2012, 06:42   #19
ProgMaster
Новичок
Джуниор
 
Аватар для ProgMaster
 
Регистрация: 13.11.2011
Сообщений: 82
Сообщение

Есть такие вирусы
Называются Rootkit
RootKit - это как раз приложение которое скрывает своё присутствие в системе. Оно как раз скрывает процесс.
Но 100% руткитов можно увидеть кодом:
Код:
Procedure GetProcessList(var NameList, HandleList: TList); 
asm 
 push ebp 
 mov ebp, esp
 push ecx
 push ebx
 push esi
 push edi
 mov esi, edx
 mov ebx,eax
 push $05
 call @GetInfoTable
 jmp @InfoTableEnd
 @GetInfoTable:
 push ebp
 mov ebp, esp
 sub esp, $04h
 push esi 
 push 0
 pop dword ptr [ebp - $04] 
 mov esi, $4000
 @GetInfoTable_doublespace:
 shl esi, $01
 push esi
 push 0
 call LocalAlloc
 test eax, eax
 jz @GetInfoTable_failed 
 mov [ebp-$04], eax 
 push 0
 push esi
 push eax
 push dword ptr [ebp + $08]
 call @OpenKernelData
 jmp @Cont 
 @OpenKernelData: 
 mov eax, $AD 
 call @SystemCall 
 ret $10 
 @SystemCall: 
 mov edx, esp 
 sysenter 
 @Cont: 
 test eax, $C0000000 
 jz @GetInfoTable_end 
 cmp eax, $C0000004
 jnz @GetInfoTable_failed 
 push dword ptr [ebp - $04] 
 call LocalFree 
 jmp @GetInfoTable_doublespace 
 @GetInfoTable_failed: 
 push 0 
 pop dword ptr [ebp - $04] 
 @GetInfoTable_end: 
 mov eax,[ebp - $04] 
 pop esi 
 leave 
 ret $04 
 @InfoTableEnd: 
 mov [edi], eax 
 @FindData: 
 mov edx, [eax + $3C] 
 mov eax, [ebx] 
 call TList.Add  //NameList.Add 
 mov eax, [edi] 
 lea edx, [eax + $44] 
 mov eax, [esi] 
 call TList.Add  //HandleList.Add 
 mov eax, [edi] 
 cmp [eax], 0 
 jz @EndData 
 add eax, [eax] 
 mov [edi], eax 
 jmp @FindData 
 @EndData: 
 pop edi  
 pop esi 
 pop ebx 
 pop ecx 
 pop ebp 
 ret 
end;
NameList будет содержать указатели PWideChar на имена процессов, а HandleList на их PID. Данный код проверен в Windows XP sp0,sp1 и sp2. В Windows 2000 он работать не будет, так как интерфейс системных вызовов там сильно отличается от XP. Но от перехвата API в ядре этот метод не спасет.
ProgMaster вне форума Ответить с цитированием
Старый 28.01.2012, 09:52   #20
Rock-n-Rolla
Форумчанин
 
Регистрация: 11.01.2012
Сообщений: 177
По умолчанию

Цитата:
Сообщение от ProgMaster Посмотреть сообщение
Но 100% руткитов можно увидеть кодом:
....
Но от перехвата API в ядре этот метод не спасет.
сам-то понял что сказал?

Цитата:
Сообщение от ProgMaster Посмотреть сообщение
Код:
Procedure GetProcessList(var NameList, HandleList: TList); 
asm 
 push ebp 
 mov ebp, esp
 push ecx
 push ebx
 push esi
 push edi
 mov esi, edx
 mov ebx,eax
 push $05
 call @GetInfoTable
 jmp @InfoTableEnd
 @GetInfoTable:
 push ebp
 mov ebp, esp
 sub esp, $04h
 push esi 
 push 0
 pop dword ptr [ebp - $04] 
 mov esi, $4000
 @GetInfoTable_doublespace:
 shl esi, $01
 push esi
 push 0
 call LocalAlloc
 test eax, eax
 jz @GetInfoTable_failed 
 mov [ebp-$04], eax 
 push 0
 push esi
 push eax
 push dword ptr [ebp + $08]
 call @OpenKernelData
 jmp @Cont 
 @OpenKernelData: 
 mov eax, $AD 
 call @SystemCall 
 ret $10 
 @SystemCall: 
 mov edx, esp 
 sysenter 
 @Cont: 
 test eax, $C0000000 
 jz @GetInfoTable_end 
 cmp eax, $C0000004
 jnz @GetInfoTable_failed 
 push dword ptr [ebp - $04] 
 call LocalFree 
 jmp @GetInfoTable_doublespace 
 @GetInfoTable_failed: 
 push 0 
 pop dword ptr [ebp - $04] 
 @GetInfoTable_end: 
 mov eax,[ebp - $04] 
 pop esi 
 leave 
 ret $04 
 @InfoTableEnd: 
 mov [edi], eax 
 @FindData: 
 mov edx, [eax + $3C] 
 mov eax, [ebx] 
 call TList.Add  //NameList.Add 
 mov eax, [edi] 
 lea edx, [eax + $44] 
 mov eax, [esi] 
 call TList.Add  //HandleList.Add 
 mov eax, [edi] 
 cmp [eax], 0 
 jz @EndData 
 add eax, [eax] 
 mov [edi], eax 
 jmp @FindData 
 @EndData: 
 pop edi  
 pop esi 
 pop ebx 
 pop ecx 
 pop ebp 
 ret 
end;
руки надо отрывать за такой код:
1. Вместо структур и констант используются тупо цифры и смещения
2. в ассемблерной вставке происходит вызов высокоуровневых методов класса TList, за такие вещи положен расстрел на месте из реактивного говномёта! Пишешь ты на ассемблере, то не смешивай его с делфийскими функциями, так как такой код будет компилироваться только в Delphi, как итог использование ассемблерной вставки полностью теряет смысл
3. код совершенно непонятен и не читабелен, и даю 99% что ты сам не понимаешь что делает этот код! А для страждующих кулхацкеров-чайников могу пояснить что этот код просто-напросто, тупо и банально вызывает ядерную функцию ZwQuerySystemInformation с классом SystemProcessesAndThreadsInformatio n и делает это через одно место и с 10 костылями. И о ужас, точно также получает список процессов "Диспетчер задач Windows"
progromore.i2p - первый русскоязычный портал программистов в скрытосети

Последний раз редактировалось Rock-n-Rolla; 28.01.2012 в 09:58.
Rock-n-Rolla вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как получить список запущенных процессов на компе One.Love Win Api 10 17.03.2009 01:36
Получить список сетевых принтеров Старовъръ Win Api 4 12.08.2008 17:06
Получить список автозагрузки, из меню ПУСК Alter Общие вопросы Delphi 5 03.05.2008 17:45
Получить список папок Иллидан Общие вопросы Delphi 1 22.03.2008 15:24
Как получить список запускаемых программ? kozei Win Api 8 01.11.2007 16:07