Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/55: Рейтинг темы: голосов - 55, средняя оценка - 4.80
2 / 2 / 1
Регистрация: 26.10.2010
Сообщений: 19
1

Карта процессов как в ArtMoney

09.01.2011, 16:03. Показов 11301. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Наверное много людей пользовались подобным обманщиком игр ...
Карта процессов как в ArtMoney

Инетересно какими методами можно "выудить" такую инфу для построения подобной таблицы?
Пробовал из пространства имён System.Diagnostics класс Process, но там только общие данные о процессе, а свойство Process.Modules не даёт модули которые были загруженны этим процессом.
В общем в голове пока каша и что-то в поисковике толком не могу найти намёки в какую сторону двигаться.
Плюс там ещё есть возможность определять закриптованные загруженные библиотеки.
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2011, 16:03
Ответы с готовыми решениями:

Как реализовать поиск в памяти процессов подобно функционалу ArtMoney и Cheat Engine?
Подскажите в какую сторону копать чтобы это реализовать, от сылочек на библиотеки не откажусь....

SD-карта. Как снять блокировку, если карта не блокировалась
Карта используется в фотике. Если стоит в фотике, то невозможно снимать, просматривать отснятое...

Программа в Delphi 7 и Cheat Engine, Artmoney
Появилась проблема. Пишу небольшую программу шифрования, но столкнулся с 1 проблемой, при...

Написание сканера памяти наподобие Cheat Engine или ArtMoney
помогите написать сканер памяти на подобии Cheat Engine или ArtMoney. Все сорсы, что нашел не...

20
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
09.01.2011, 17:18 2
Забудь про пространства имен, это как минимум чистейший WinApi, а может и еще чего похуже вроде ассемблера

Хотя и не совсем понятно что подразумевается под "такой инфой"...на рисунке ее много разной
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
09.01.2011, 17:35 3
X-rayboy, без серьезного знания API, а именно работы с процессами и памятью ты ничего не напишешь. Могу дать направление: VirtualQueryEx - это необходимый минимум.

Если тебе не кипит, то возможно на следующей неделе попробую накидать пример, но ничего не обещаю...

p.s. Тема перемещена в раздел C#.NET, т.к. совершенно не относится к начинающим.
1
2 / 2 / 1
Регистрация: 26.10.2010
Сообщений: 19
10.01.2011, 14:36  [ТС] 4
Цитата Сообщение от m0nax Посмотреть сообщение
Хотя и не совсем понятно что подразумевается под "такой инфой"...на рисунке ее много разной
На изображении изображено какие страницы памяти и сколько выделено, и кому, какой доступ к памяти в этих страницах ... в принципе если можно зацепить с помощью WinAPI для минимума хотя бы это, а там, возможно, будет видно больше информации о процессе.

Хочу написать программу для контроля процесса, его модификации ... что-то типа своего обманщика, но более узко специализированного на определённый процесс. Основное направление сбор статистики по определённым параметрам.

Добавлено через 44 минуты
Цитата Сообщение от SSTREGG Посмотреть сообщение
Могу дать направление: VirtualQueryEx - это необходимый минимум
Спасибо что дали направление ... покапавшись в инете нашёл вот что ...
Работает как в ArtMoney
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[DllImport("Kernel32.dll", EntryPoint = "VirtualQueryEx")]
public static extern long VirtualQueryEx(IntPtr x1, IntPtr x2, IntPtr x3, long x4);
 
//struct MEMORY_BASIC_INFORMATION
public struct MEMORY_BASIC_INFORMATION
{
public IntPtr BaseAddress;
public IntPtr AllocationBase;
public int AllocationProtect;
public int RegionSize;
public int State;
public int Protect;
public int Type;
}
 
//процедура вызова функции
unsafe private void bViQuEx_Click(object sender, System.EventArgs e)
{
this.cbViQuEx.Items.Clear();
IntPtr ptr0 = Proces.Handle;
long ptr1Count = 0;
while (ptr1Count <= 0x7FFE0000)
{
IntPtr ptr1 = new IntPtr(ptr1Count);
MEMORY_BASIC_INFORMATION b = new MEMORY_BASIC_INFORMATION();
IntPtr ptr2 = new IntPtr(&b);
long x = 0;
x = win32API.VirtualQueryEx(ptr0, ptr1, ptr2, sizeof(MEMORY_BASIC_INFORMATION));
this.cbViQuEx.Items.Add(((int)b.BaseAddress).ToString("X") +" "
+ ((int)b.AllocationBase).ToString("X") +" "
+ b.RegionSize.ToString("X") +" "
+ b.State.ToString("X") +" "
+ b.AllocationProtect.ToString("X") +" "
+ b.Protect.ToString("X") +" "
+ b.Type.ToString("X") +" ");
ptr1Count = ptr1Count + b.RegionSize;
this.lViQuEx.Text = this.cbViQuEx.Items.Count.ToString();
}
}

Обязательно "расширим и углубим" понимание кода ...

Добавлено через 19 часов 48 минут
Определение состояния адресного пространства процесса (Карта процесса (Исследование виртуальной памяти))
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
using System;
using System.Linq;
using System.Diagnostics;
using System.Runtime.InteropServices;
 
 
namespace ConsoleApplication2
{
    class Program
    {
        unsafe static void Main(string[] args)
        {
            string nameproc = "iexplore";
            Process[] proces;
            proces = Process.GetProcessesByName(nameproc); // Получить массив процессов
            if (proces.Count() > 0) // если есть хоть один процесс
            {
 
                Process proc = proces[0];   // Взять первый процесс
                IntPtr ptr0 = proc.Handle;  // Получение дескриптора процесса
                long ptr1Count = 0x00010000; // адресс после недоступной зоны
                MEMORY_BASIC_INFORMATION b; // Объявляем структуру
                IntPtr ptr1 = new IntPtr(ptr1Count);
                uint page = 0;
                while (ptr1Count <= 0x7FFE0000) // До конца виртуальной памяти для данного процесса
                {
                    if (page > 20) // Сколько строк на странице
                    {
                        Console.ReadKey(); // Ожидать нажатие клавиши
                        page = 0; // Сбросить счётчик строк
                    }
                    else
                    {
                        if (page == 0)
                            Console.WriteLine(  // Выводим заголовок для напоминания столбцов
                                "__________________________________________________________________________\n" +
                                "|  Базовый |   Адрес  |         |Состояние|Защита при ре-|     |   Тип   |\n" +
                               @"|   адрес  |  региона |  Размер  \        |зервировании /Защита|ф.памяти |"
                                );
                        page++;
                    }
                    ulong x = VirtualQueryEx(ptr0, ptr1, &b, sizeof(MEMORY_BASIC_INFORMATION));
                    Console.WriteLine(  // Выводим строку
                          "| {0} | {1} | {2} | {3} |     {4}    |  {5}  | {6} |",
                        b.BaseAddress.ToString("X8"),
                        b.AllocationBase.ToString("X8"),
                        b.RegionSize.ToString("X8"),
                        b.State.ToString("X6"),
                        b.AllocationProtect.ToString("X3"),
                        b.Protect.ToString("X3"),
                        b.Type.ToString("X7"));
                    ptr1Count = ptr1Count + (int)b.RegionSize;
                    ptr1 = (IntPtr)ptr1Count;
                }
            }
            else Console.WriteLine("Ниодин процесс под именем {0} небыл найден", nameproc);
            Console.ReadKey(); // При завершении ждать нажатие клавиши
        }
 
        [DllImport("Kernel32.dll", EntryPoint = "VirtualQueryEx")]
        unsafe public static extern ulong VirtualQueryEx // сообщает информацию о памяти в другом процессе
                    (
                        IntPtr hProcess,                // Дескриптора процесса
                        IntPtr pvAddress,               // адрес виртуальной памяти
                        MEMORY_BASIC_INFORMATION* pmbi, // это адрес структуры MEMORY_BASIC_INFORMATION,
                                                        // которую надо создать перед вызовом функции
                        int dwLength                    // задает размер структуры MEMORY_BASIC_INFORMATION
                    );
 
        public struct MEMORY_BASIC_INFORMATION
        {
            public IntPtr BaseAddress;      // Сообщает то же значение, что и параметр pvAddress,
                                            // но округленное до ближайшего меньшего адреса, кратного размеру страницы
            public IntPtr AllocationBase;   // Идентифицирует базовый адрес региона, включающего в себя адрес,
                                            // указанный в параметре pvAddress
            public int AllocationProtect;   // Идентифицирует атрибут защиты, присвоенный региону при его резервировании
            public IntPtr RegionSize;       // Сообщаем суммарный размер (в байтах) группы
            public int State;               // Сообщает состояние (MEM_FRFF, MFM_RFSFRVE или MEM_COMMIT) всех смежных страниц
            public int Protect;             // Идентифицирует атрибут защиты (PAGE *) всех смежных страниц
            public int Type;                // Идентифицирует тип физической памяти (MEM_IMAGE, MEM_MAPPED или MEM PRIVATE)
        }
    }
}

Компиляция производится при разрешении небезопасного кода.
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
10.01.2011, 14:54 5
Без unsafe:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
 
namespace ConsoleApplication7
{
    class Program
    {
        static void Main ( string[] args ) {
            string nameproc = "iexplorer";
            Process[] proces;
            proces = Process.GetProcessesByName(nameproc); // Получить массив процессов
            if (proces.Length > 0) // если есть хоть один процесс
            {
 
                Process proc = proces[0];   // Взять первый процесс
                IntPtr ptr0 = proc.Handle;  // Получение дескриптора процесса
                long ptr1Count = 0x00000000; // адресс после недоступной зоны
                MEMORY_BASIC_INFORMATION b; // Объявляем структуру
                IntPtr ptr1 = new IntPtr(ptr1Count);
                uint page = 0;
                while (ptr1Count <= 0x7FFE0000) // До конца виртуальной памяти для данного процесса
                {
                    if (page > 20) // Сколько строк на странице
                    {
                        Console.ReadKey(); // Ожидать нажатие клавиши
                        page = 0; // Сбросить счётчик строк
                    } else {
                        if (page == 0)
                            Console.WriteLine(  // Выводим заголовок для напоминания столбцов
                                "__________________________________________________________________________\n" +
                                "|  Базовый |   Адрес  |         |Состояние|Защита при ре-|     |   Тип   |\n" +
                               @"|   адрес  |  региона |  Размер  \        |зервировании /Защита|ф.памяти |"
                                );
                        page++;
                    }
                    VirtualQueryEx(ptr0, ptr1, out b, Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION)));
                    Console.WriteLine(  // Выводим строку
                          "| {0} | {1} | {2} | {3} |     {4}    |  {5}  | {6} |",
                        b.BaseAddress.ToString("X8"),
                        b.AllocationBase.ToString("X8"),
                        b.RegionSize.ToString("X8"),
                        b.State.ToString("X6"),
                        b.AllocationProtect.ToString("X3"),
                        b.Protect.ToString("X3"),
                        b.Type.ToString("X7"));
                    ptr1Count = ptr1Count + (int)b.RegionSize;
                    ptr1 = (IntPtr)ptr1Count;
                }
            } else Console.WriteLine("Ни один процесс под именем {0} небыл найден", nameproc);
            Console.ReadKey(); // При завершении ждать нажатие клавиши
        }
 
        [DllImport("Kernel32.dll", SetLastError = true)]
        public static extern UIntPtr VirtualQueryEx         // сообщает информацию о памяти в другом процессе
                    (
                        IntPtr hProcess,                    // Дескриптора процесса
                        IntPtr pvAddress,                   // адрес виртуальной памяти
                        out MEMORY_BASIC_INFORMATION pmbi,  // это адрес структуры MEMORY_BASIC_INFORMATION,
                                                            // которую надо создать перед вызовом функции
                        int dwLength                        // задает размер структуры MEMORY_BASIC_INFORMATION
                    );
 
        public struct MEMORY_BASIC_INFORMATION
        {
            public IntPtr BaseAddress;      // Сообщает то же значение, что и параметр pvAddress,
                                            // но округленное до ближайшего меньшего адреса, кратного размеру страницы
            public IntPtr AllocationBase;   // Идентифицирует базовый адрес региона, включающего в себя адрес,
                                            // указанный в параметре pvAddress
            public int AllocationProtect;   // Идентифицирует атрибут защиты, присвоенный региону при его резервировании
            public IntPtr RegionSize;       // Сообщаем суммарный размер (в байтах) группы
            public int State;               // Сообщает состояние (MEM_FRFF, MFM_RFSFRVE или MEM_COMMIT) всех смежных страниц
            public int Protect;             // Идентифицирует атрибут защиты (PAGE *) всех смежных страниц
            public int Type;                // Идентифицирует тип физической памяти (MEM_IMAGE, MEM_MAPPED или MEM PRIVATE)
        }
    }
}
0
2 / 2 / 1
Регистрация: 26.10.2010
Сообщений: 19
10.01.2011, 15:54  [ТС] 6
Лучший ответ Сообщение было отмечено XIST как решение

Решение

Почему long ptr1Count = 0x00000000;?
Насколько я информирован, то:
- когда запускается приложение, система резервирует все адресное пространство пользовательского режима, начиная с 0x0000000 до 0x80000000, что обеспечивает выделение памяти исключительно в нижних 2 Гб.
-От 0x00000000 до 0x0000FFFF для выявления нулевых указателей и оно закрыто для доступа.
-От 0x00010000 до 0x7FFEFFFF для кода и данных пользовательского режима.
-От 0x7FFF0000 до 0x7FFFFFFF этот раздел заблокирован, чтобы упростить внутреннюю реализацию операционной системы.

Стоит ли сканировать с 0x00000000, если можно сразу забить 0x00010000?
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
10.01.2011, 16:19 7
Конечно можно сразу забить, я просто придерживался того как это делает ArtMoney
0
2 / 2 / 1
Регистрация: 26.10.2010
Сообщений: 19
11.01.2011, 00:18  [ТС] 8
Определение директории процесса и его модулей:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
 
namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Process[] proces;
            proces = Process.GetProcessesByName("iexplore"); // Получить массив процессов
            if (proces.Length > 0) // если есть хоть один процесс
            {
                Process proc = proces[0];   // Взять первый процесс
                int lpcbNeeded = 0;
                long[] hModule = null;
                EnumProcessModulesEx(proc.Handle, hModule, 0, lpcbNeeded, 0);   // Пробуем получить lpcbNeeded
                hModule = new long [lpcbNeeded / 8];                             // Создаём массив нужного размера
                if (EnumProcessModulesEx(proc.Handle, hModule, lpcbNeeded, lpcbNeeded, 0))
                {
                    char[] nameFile = new char[512];    // Создаём массив, буфер из символов
                    int steps = lpcbNeeded / 8;         // получаем колличество модулей
                    for (int i = 0; i < steps; i++)
                    {
                        GetModuleFileNameEx (proc.Handle, hModule[i], nameFile, 512); // Пытаемся получить полный путь модуля
                        Console.WriteLine(
                            "Расположение модуля: {0}\nЗаголовок модуля: {1}\n\n"
                            + nameFile, hModule[i].ToString()
                            );
                    }
                }
                else Console.WriteLine("У процесса не найдены модули");
            }
            else Console.WriteLine("Не найден процесс");
            Console.ReadKey();
        }
 
        [DllImport("psapi.dll", SetLastError = true)]
        public static extern long GetModuleFileNameEx   // позволяет получить полный путь для указанного модуля
                    (                                   // у другого процесса
                        IntPtr hProcess,        // Дескриптор процесса, который содержит данный модуль
                        long hModule,           // Дескриптор модуля
                        char[] lpFilename,      // Указатель на буфер
                        int nSize               // Размер буфера lpFilename в байтах.
                    );
 
        [DllImport("psapi.dll", SetLastError = true)]
        public static extern bool EnumProcessModulesEx  // позволяет получить массив дескрипторов модулей
                    (                                   // у другого процесса
                        IntPtr hProcess,        // Дескриптор процесса, который содержит данный модуль
                        long[] lphModule,       // Массив дескрипторов полученных модулей
                        int cb,                 // Размер lphModule массива в байтах
                        int lpcbNeeded,         // Количество байт,
                                                // необходимых для хранения всех десткрипторов модуля в lphModule массиве
                        int dwFilterFlag        // 0x00 (LIST_MODULES_DEFAULT) - Use the default behavior
                    );
    }
}
Не получается организовать работу функций.
В разных источниках смотрел и много кусков примеров видел, но у самого что-то не получается заставить работать
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
11.01.2011, 01:26 9
Во, делать было нечего
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//#define UNSAFE
...
        [DllImport("Psapi.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool EnumProcessModules (
            IntPtr hProcess,
#if UNSAFE
            void** lphModules,
#else
            IntPtr[] lphModules,
#endif
            int cb,
#if UNSAFE
            int* lpcbNeeded
#else
            out int lpcbNeeded
#endif
            );
 
        [DllImport("Psapi.dll", SetLastError = true)]
        static extern int GetModuleFileNameEx (
            IntPtr hProcess,
#if UNSAFE
            void* hModule,
#else
            IntPtr hModule,
#endif
            StringBuilder lpFileName,
            int nSize
            );
 
        /// <summary>
        /// Возвращает пути ко всем используем модулям процесса.
        /// </summary>
        /// <param name="PID">Id процесса.</param>
#if UNSAFE
        unsafe
#endif
            string[] GetProcModules ( int PID ) {
            IntPtr hProc = Process.GetProcessById(PID).Handle;
#if UNSAFE
            void** ppModBuff = null;
#else
            IntPtr[] ppModBuff = null;
#endif
            int needed = 0;
            int arrSize = 0;
            StringBuilder sb = new StringBuilder(260);
            string[] modules = null;
            int retLen = 0;
 
            if (EnumProcessModules(hProc, null, 0,
#if UNSAFE
                &needed
#else
                out needed
#endif
                )) {
                arrSize = needed / IntPtr.Size;
                modules = new string[arrSize];
#if UNSAFE
                ppModBuff = (void**)Marshal.AllocHGlobal(needed);
#else
                ppModBuff = new IntPtr[arrSize];
#endif
                {
                    if (EnumProcessModules(hProc, ppModBuff, needed,
#if UNSAFE
                        &needed
#else
                        out needed
#endif
                        )) {
                        for (int i = 0; i < arrSize; i++) {
                            retLen = GetModuleFileNameEx(hProc, ppModBuff[i], sb, sb.Capacity);
                            if (retLen != 0)
                                modules[i] = sb.ToString(0, retLen);
                        }
                    }
                }
#if UNSAFE
                Marshal.FreeHGlobal((IntPtr)ppModBuff);
#endif
            }
            return modules;
        }
Без define'ов
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
        [DllImport("Psapi.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool EnumProcessModules (
            IntPtr hProcess,
            void** lphModules,
            int cb,
            int* lpcbNeeded
            );
 
        [DllImport("Psapi.dll", SetLastError = true)]
        static extern int GetModuleFileNameEx (
            IntPtr hProcess,
            void* hModule,
            StringBuilder lpFileName,
            int nSize
            );
 
        /// <summary>
        /// Возвращает пути ко всем используем модулям процесса.
        /// </summary>
        /// <param name="PID">Id процесса.</param>
        unsafe string[] GetProcModules ( int PID ) {
            IntPtr hProc = Process.GetProcessById(PID).Handle;
            void** ppModBuff = null;
            int needed = 0;
            int arrSize = 0;
            StringBuilder sb = new StringBuilder(260);
            string[] modules = null;
            int retLen = 0;
 
            if (EnumProcessModules(hProc, null, 0, &needed)) {
                arrSize = needed / IntPtr.Size;
                modules = new string[arrSize];
 
                ppModBuff = (void**)Marshal.AllocHGlobal(needed);
                {
                    if (EnumProcessModules(hProc, ppModBuff, needed, &needed)) {
                        for (int i = 0; i < arrSize; i++) {
                            retLen = GetModuleFileNameEx(hProc, ppModBuff[i], sb, sb.Capacity);
                            if (retLen != 0)
                                modules[i] = sb.ToString(0, retLen);
                        }
                    }
                }
                Marshal.FreeHGlobal((IntPtr)ppModBuff);
            }
            return modules;
        }
C#
1
2
            foreach (var mod in GetProcModules(Process.GetCurrentProcess().Id))
                Console.WriteLine(mod);
1
2 / 2 / 1
Регистрация: 26.10.2010
Сообщений: 19
11.01.2011, 19:53  [ТС] 10
SSTREGG, я заметл, что код выкладываемый Вами имеет разный тип по безопасности.
Когда я выкладывал код с небезопасным кодом, то Вы выложили в безопасном.
После использовали макрос, а потом без макроса, то выбрали код с небезопасным кодом.

Я, следуя по макросу, выбрал ветку с безопасным кодом.

Может это само собой так получилось, а может просто для практики, но почему Вы выбрали с небезопасным кодом? Хочется услышать некий опыт по этому поводу.

Вот мой исправленный код, по вашей безопасной ветке, может есть косяки, то я с радостью их "выслушаю", чтобы усовершенствоваться :)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
 
namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Process[] proces;
            proces = Process.GetProcessesByName("iexplore"); // Получить массив процессов
            if (proces.Length > 0) // если есть хоть один процесс
            {
                Process proc = proces[0];   // Взять первый процесс
                int lpcbNeeded = 0;
                IntPtr[] hModule = null;
                EnumProcessModulesEx(proc.Handle, null, 0, out lpcbNeeded, 0);  // Пробуем получить lpcbNeeded
                int arrSize = lpcbNeeded / IntPtr.Size;                         // получаем колличество модулей
                hModule = new IntPtr[arrSize];                            // Создаём массив нужного размера
                if (EnumProcessModulesEx(proc.Handle, hModule, lpcbNeeded, out lpcbNeeded, 0))
                {
                    StringBuilder nameFile = new StringBuilder(260);    // Создаём массив, буфер из символов
                    for (int i = 0; i < arrSize; i++)
                    {
                        GetModuleFileNameEx(proc.Handle, hModule[i], nameFile, nameFile.Capacity); // Пытаемся получить полный путь модуля
                        Console.WriteLine(
                            "Расположение модуля: {0}\nЗаголовок модуля: {1}\n\n",
                            nameFile, hModule[i].ToString()
                            );
                    }
                }
                else Console.WriteLine("У процесса не найдены модули");
            }
            else Console.WriteLine("Не найден процесс");
            Console.ReadKey();
        }
 
        [DllImport("psapi.dll", SetLastError = true)]
        public static extern int GetModuleFileNameEx   // позволяет получить полный путь для указанного модуля
                    (                                  // у другого процесса
                        IntPtr hProcess,            // Дескриптор процесса, который содержит данный модуль
                        IntPtr hModule,             // Дескриптор модуля
                        StringBuilder lpFilename,   // Указатель на буфер
                        int nSize                   // Размер буфера lpFilename в байтах.
                    );
 
        [DllImport("psapi.dll", SetLastError = true)]
        public static extern bool EnumProcessModulesEx  // позволяет получить массив дескрипторов модулей
                    (                                   // у другого процесса
                        IntPtr hProcess,        // Дескриптор процесса, который содержит данный модуль
                        IntPtr[] lphModules,    // Массив дескрипторов полученных модулей
                        int cb,                 // Размер lphModule массива в байтах
                        out int lpcbNeeded,     // Количество байт,
                                                // необходимых для хранения всех десткрипторов модуля в lphModule массиве
                        int dwFilterFlag        // 0x00 (LIST_MODULES_DEFAULT) - Use the default behavior
                    );
    }
}
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
11.01.2011, 20:04 11
X-rayboy, я сначала пишу unsafe, т.к. при переводе прототипов с MSDN мне так легче\удобней, а потом при желании переделываю под managed.

В некоторых случаях мне удобней сразу писать с использованием unsafe, т.к. кода будет написано меньше (например когда приходится работать со структурами), да и иногда с unsafe немного быстрее выходит и код становится более воспринимаемым (имхо).

з.ы. Я не зря выбрал EnumProcessModules, т.к. EnumProcessModulesEx введена только в Vista и выше (по словам MS).
Цитата Сообщение от X-rayboy Посмотреть сообщение
Заголовок модуля: {1}
Ну это не заголовок ) это адрес по которому расположен модуль.
0
2 / 2 / 1
Регистрация: 26.10.2010
Сообщений: 19
11.01.2011, 22:48  [ТС] 12
ArtMoney как то определяет некоторые модули, которые нельзя выявить простым рассмотренным выше способом.
Регионы, конечно, находятся и их тип Image (образ), но программа ArtMoney "видит" нахождение этого модуля типа "\Device\TrueCryptVolume< буква диска >\<директория с именем модуля> " (Смотрите фото).

Может кто знает как это сделать? Для начала направление хотелось бы знать.
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
11.01.2011, 22:58 13
А где фотка-то?
0
2 / 2 / 1
Регистрация: 26.10.2010
Сообщений: 19
11.01.2011, 23:04  [ТС] 14
Цитата Сообщение от SSTREGG Посмотреть сообщение
А где фотка-то?
Фото в первом посте

З.Ы. Если компилить и запускать как x64 приложение, то, если сканировать x32 приложение, в основном видны только сам процесс и WoW64 (это подсистема операционной системы Windows, позволяющая запускать 32-битные приложения на всех 64-битных версиях Windows).
Наверное получается, что если для x64, как и для x32, нет возможности посмотреть "внутренности" приложения другой битности, то для каждобитного процесса требуется тойжебитности сканер или можно обойтись меньшей "кровью"?
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
11.01.2011, 23:17 15
Ну так это совсем не то. ArtMoney показывает файлы которые отображены в данном регионе памяти по данному адресу. Вот твой переделанный пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
 
namespace ConsoleApplication8
{
    class Program
    {
        static void Main ( string[] args ) {
            string nameproc = "iexplorer";
            Process[] proces;
            proces = Process.GetProcessesByName(nameproc); // Получить массив процессов
            if (proces.Length > 0) // если есть хоть один процесс
            {
 
                Process proc = proces[0];   // Взять первый процесс
                IntPtr ptr0 = proc.Handle;  // Получение дескриптора процесса
                long ptr1Count = 0x00000000; // адресс после недоступной зоны
                MEMORY_BASIC_INFORMATION b; // Объявляем структуру
                IntPtr ptr1 = new IntPtr(ptr1Count);
                StringBuilder sb = new StringBuilder(260);
                uint page = 0;
                while (ptr1Count <= 0x7FFE0000) // До конца виртуальной памяти для данного процесса
                {
                    if (page > 20) // Сколько строк на странице
                    {
                        Console.ReadKey(); // Ожидать нажатие клавиши
                        page = 0; // Сбросить счётчик строк
                    } else {
                        if (page == 0)
                            Console.WriteLine(  // Выводим заголовок для напоминания столбцов
                                "__________________________________________________________________________\n" +
                                "|  Базовый |   Адрес  |         |Состояние|Защита при ре-|     |   Тип   |\n" +
                               @"|   адрес  |  региона |  Размер  \        |зервировании /Защита|ф.памяти |"
                                );
                        page++;
                    }
                    VirtualQueryEx(ptr0, ptr1, out b, Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION)));
 
                    if (b.Type == 0x1000000 /* MEM_IMAGE */) {
                        GetMappedFileName(ptr0, ptr1, sb, sb.Capacity);
                        Console.WriteLine(sb);
                    }
 
                    Console.WriteLine(  // Выводим строку
                          "| {0} | {1} | {2} | {3} |     {4}    |  {5}  | {6} |",
                        b.BaseAddress.ToString("X8"),
                        b.AllocationBase.ToString("X8"),
                        b.RegionSize.ToString("X8"),
                        b.State.ToString("X6"),
                        b.AllocationProtect.ToString("X3"),
                        b.Protect.ToString("X3"),
                        b.Type.ToString("X7"));
                    ptr1Count = ptr1Count + (int)b.RegionSize;
                    ptr1 = (IntPtr)ptr1Count;
                }
            } else Console.WriteLine("Ни один процесс под именем {0} небыл найден", nameproc);
            Console.ReadKey(); // При завершении ждать нажатие клавиши
        }
 
        [DllImport("Psapi.dll", SetLastError = true)]
        public static extern uint GetMappedFileName (
            IntPtr hProcess,
            IntPtr lpv,
            StringBuilder lpFilename,
            int nSize
            );
 
        [DllImport("Kernel32.dll", SetLastError = true)]
        public static extern UIntPtr VirtualQueryEx         // сообщает информацию о памяти в другом процессе
                    (
                        IntPtr hProcess,                    // Дескриптора процесса
                        IntPtr pvAddress,                   // адрес виртуальной памяти
                        out MEMORY_BASIC_INFORMATION pmbi,  // это адрес структуры MEMORY_BASIC_INFORMATION,
            // которую надо создать перед вызовом функции
                        int dwLength                        // задает размер структуры MEMORY_BASIC_INFORMATION
                    );
 
        public struct MEMORY_BASIC_INFORMATION
        {
            public IntPtr BaseAddress;      // Сообщает то же значение, что и параметр pvAddress,
            // но округленное до ближайшего меньшего адреса, кратного размеру страницы
            public IntPtr AllocationBase;   // Идентифицирует базовый адрес региона, включающего в себя адрес,
            // указанный в параметре pvAddress
            public int AllocationProtect;   // Идентифицирует атрибут защиты, присвоенный региону при его резервировании
            public IntPtr RegionSize;       // Сообщаем суммарный размер (в байтах) группы
            public int State;               // Сообщает состояние (MEM_FRFF, MFM_RFSFRVE или MEM_COMMIT) всех смежных страниц
            public int Protect;             // Идентифицирует атрибут защиты (PAGE *) всех смежных страниц
            public int Type;                // Идентифицирует тип физической памяти (MEM_IMAGE, MEM_MAPPED или MEM PRIVATE)
        }
    }
}
Цитата Сообщение от X-rayboy Посмотреть сообщение
З.Ы. Если компилить и запускать как x64 приложение, то, если сканировать x32 приложение, в основном видны только сам процесс и WoW64 (это подсистема операционной системы Windows, позволяющая запускать 32-битные приложения на всех 64-битных версиях Windows).
Наверное получается, что если для x64, как и для x32, нет возможности посмотреть "внутренности" приложения другой битности, то для каждобитного процесса требуется тойжебитности сканер или можно обойтись меньшей "кровью"?
Это тоже относится к этому:
Цитата Сообщение от X-rayboy Посмотреть сообщение
ArtMoney как то определяет некоторые модули, которые нельзя выявить простым рассмотренным выше способом.
Регионы, конечно, находятся и их тип Image (образ), но программа ArtMoney "видит" нахождение этого модуля типа "\Device\TrueCryptVolume< буква диска >\<директория с именем модуля> " (Смотрите фото).
Или уже про другое?
0
2 / 2 / 1
Регистрация: 26.10.2010
Сообщений: 19
14.01.2011, 20:54  [ТС] 16
Исследование виртуальной памяти оказалось недостаточно. Искомая информация находится за пределами пользовательского режима.

Не уж то потребуется вникать в ZwXxx Routines функции для исследования адресов в памяти ядра(0x80000000 - 0xFFFDF000)?

ArtMoney как раз сканит до 0xFFFDF000 ...
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
14.01.2011, 22:50 17
X-rayboy, ArtMoney использует только эти функции из ntdll:
  • ZwQueryInformationProcess;
  • ZwQuerySystemInformation;
  • NtWow64ReadVirtualMemory64;
  • NtWow64WriteVirtualMemory64;
  • NtWow64QueryVirtualMemory64.
Если поможет напиши о результатах

Добавлено через 1 час 34 минуты
И кстати, ArtMoney сканит только до 0xBFFFFFFF, не больше И Native API к этому никакого отношения не имеют.

з.ы. Перенес тему в WinApi.
0
2 / 2 / 1
Регистрация: 26.10.2010
Сообщений: 19
15.01.2011, 02:54  [ТС] 18
Цитата Сообщение от SSTREGG Посмотреть сообщение
И кстати, ArtMoney сканит только до 0xBFFFFFFF, не больше .
Как я понимаю всё таки зависит от процесса ... или глюки ArtMoney, но я своей программой не могу найти те значения, которые она находит в адресном пространстве ядра(по "словам" ArtMoney). Может это в данных созданных каким-то драйвером или ещё что.
Таблица результатов поиска ArtMoney
Название: Snap_2011.01.15_02h27m33s_008.png
Просмотров: 559

Размер: 7.1 Кб
Карта процесса ArtMoney:
Карта процессов как в ArtMoney


Как видно из карты процесса значение адреса состоит из 11 разрядов.
Бывает самое прикольное что адрес в конце достигает до 7FFF....000(11 разрядов). У меня физической памяти всего 4 ГБ.

Собственноручная прога сканит как положено, в пределах виртуального пространства, и находит значения как и в ArtMoney, но только 0x0002CC72470, 0x0002CC724F0 (картинка результатов).
А 0x000F00D0D44, 0x000F00D0D7C конечно моя прога не найдёт.

Как быть и что делать?

Начал копаться в Zw... функциях, но инфы мало, даже у мелкософта. Тем более в x32 и в x 64 возврат у функций разный по структуре.

Как прыгнуть в адресное пространство больше 0x80000000 обычным способом не знаю и возможно ли?
0
2 / 2 / 1
Регистрация: 26.10.2010
Сообщений: 19
15.01.2011, 18:42  [ТС] 19
и ещё ... если работать в режимах, позволяющих работать в адресах выше 0x80000000, то использование структуры типа
C#
1
IntPtr hProcess,        // Дескриптор процесса
приведёт к тому, что выше 2ГБ не шагнуть.
C#
1
2
3
public IntPtr(
    int value
)
Я пробовал компилить для x64 и скармливал для конструктора
C#
1
IntPtr a1 = new IntPtr(long)
но a1 получается всё равно типа int32

Даже изменяя на тип UIntPtr функция с 0x7FFFFFFF "сбрасывает" на 0x00010000

Добавлено через 1 час 47 минут
Или ArtMoney "вытягивает" адреса из других процессов, "складывая" к этому же процессу, но регионы распологает как стек регионов сверху вниз эмитируя как будто у процесса доступно от 0x00010000 до 0xFFFFFFFF.

Добавлено через 23 минуты
Наверное получается требуется найти связи между процессом, где ищем, с другими процессами чтобы "выйти из процесса" и сканировать связанные данные в других процессах.

Добавлено через 1 час 33 минуты
Лобовой перебор всех процессов запущеных на компьютере и поиск в них требуемой информации ни к чему не привёл.
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
15.01.2011, 19:01 20
X-rayboy, ты углубляешься в дебри. Всё проще. Если ты разбираешься в ASM и C++, и знаешь хоть примерно как работать с дизассемблером (IDA например) я могу прислать распакованный exe ArtMoney для изучения.

Если надо пиши в ЛС. Сейчас у самого нет времени заниматься изучением данной проблемы, так бы помог чем-нибудь.
0
15.01.2011, 19:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.01.2011, 19:01
Помогаю со студенческими работами здесь

Правда ли, что в материнской плате уже встроена звуковая карта и сетевая карта?
У меня возник вопрос, говорят, что в материнской плате уже встроена звуковая карта и сетевая карта....

Найти среди выполняющихся процессов имена процессов, имеющих одинаковые ProductVersion
нахождения среди выполняющихся процессов имен процессов, имеющих одинаковые ProductVersion. ...

Нахождение среди выполняющихся процессов имён процессов с наименьшим значением BasePriority
Разработать командлет для нахождения среди выполняющихся процессов имен процессов с наименьшим...

Раз - карта, два - карта. Много карт
Здравствуйте. Пару - тройку месяцев тому купил я новый комп(стационарный) i7 7700 3,6 Гц, 8...

Нахождение среди выполняющихся процессов имён 3-х процессов, использовавших более всего процессорного времени
Помогите выполнить задание! Нахождения среди выполняющихся процессов имен трех процессов,...

Завершение всех запущенных процессов из находящегося в текстовом файле списка запрещенных к запуску процессов
пожалуйста помогите написать батник. Задать в текстовом файле список процессов, запрещенных к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru