Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
1

Портирование С++ -> С#

25.12.2009, 16:22. Показов 1292. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, помогите портировать выложенный ниже код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#define OFFSET      0x012705C4
#define RC4_KEY_OFFSET  0x508
#define RC4_KEY_LENGTH  40
 
char read_rc4_key(HANDLE process)
{
    char rc4_key[RC4_KEY_LENGTH] = {'\0'};
    DWORD number_of_read_bytes=0;
    char pointer[4] = {'\0'};
    unsigned int rc4_key_Position = 0;
 
    ReadProcessMemory(process, (LPCVOID)OFFSET, pointer, 4, &number_of_read_bytes); 
    CloseHandle(process);
 
    memcpy(&rc4_key_Position, pointer, 4);
    
    number_of_read_bytes = 0;
    ReadProcessMemory(process, (LPCVOID)(RC4_KEY_OFFSET + rc4_key_Position), rc4_key, RC4_KEY_LENGTH, &number_of_read_bytes);
    CloseHandle(process);
    
    return rc4_key;
}
Добавлено через 25 минут
НАсколько я понимаю, функция memcpy(&rc4_key_Position, pointer, 4);, делает следующее,
из pointer перемещает 4 байта в rc4_key_Position, тобиш меняет его розмещение.
Проблема, незнаю как реализовать это средствами C#, потому как не работал с небезопасным кодом, и незнаю как сделать указатель

с функцией ReadProcessMemory() - вообще туго, то что прочитал в тут, пока ни о чем не говорит
само описание понятно, но опять таки указатели...
hProcess [in]

A handle to the process with memory that is being read. The handle must have PROCESS_VM_READ access to the process.
lpBaseAddress [in]

A pointer to the base address in the specified process from which to read. Before any data transfer occurs, the system verifies that all data in the base address and memory of the specified size is accessible for read access, and if it is not accessible the function fails.
lpBuffer [out]

A pointer to a buffer that receives the contents from the address space of the specified process.
nSize [in]

The number of bytes to be read from the specified process.
lpNumberOfBytesRead [out]

A pointer to a variable that receives the number of bytes transferred into the specified buffer. If lpNumberOfBytesRead is NULL, the parameter is ignored.
Добавлено через 1 час 31 минуту
Такс, кое что еще, сама функция ReadProcessMemory() делает следущее,
ReadProcessMemory(
1) Читает процесс,
2) По указанному адресу,
3) Указатель на буффер, в который надо записать новые данные,
4) Размер данных,
5) Сколько было передано байт)

Добавлено через 33 минуты
Вот что собственно получилось от части:
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
public static byte[] read_rc4_key(Process process)
{
    byte[] rc4_key = new byte[40];
    byte[] pointer = new byte[4];
    uint rc4_key_Position = 0;
    
    pointer = process.ReadBytes(0x00C923D4, 4); // нашел библиотеку для роботы с памятью
    
    int i = 0;
    foreach(byte b in pointer)
        if(b!=0) i++;
 
    if(i!=4) 
    {
        rc4_key = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
        return rc4_key;
    }
       
    memcpy(&rc4_key_Position, pointer, 4); // осталось реализовать эту функцию
    
    rc4_key = process.ReadBytes((0x00C923D4 + rc4_key_Position), 40);
        
    return rc4_key;
}
но, не могу пеализовать функцию memcpy(&rc4_key_Position, pointer, 4);, помогите пожалуйста
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2009, 16:22
Ответы с готовыми решениями:

Портирование
Доброго времени суток :) Помогите пожалуйста с портирование задаси на яп си. Код мой на паскале:...

С++ портирование
Преобразовать строчные буквы (как латинские, так и русские) в прописные. uses crt; var ...

Портирование из Qt в С++
Перевести из Qt в VS C++: QFile base_data("./program_inf/base_data.txt");...

портирование
на сколько сложно портировать программу на c++ на разные платформы(windows, Linux, Mac OS) и...

2
5 / 5 / 0
Регистрация: 10.12.2009
Сообщений: 12
25.12.2009, 20:02 2
С вызовом WinApi функций в C# вообще туго! Почитайте про маршаллинг! класс по-моему называется MarshalByRefObject. Мне это помогло))
1
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
26.12.2009, 13:03  [ТС] 3
Вот что получилось, методом проб и тыка:
C#
1
2
3
4
5
6
7
public static byte[] read_rc4_key(Process process)
{
    byte[] pointer = process.ReadBytes(0x00C923D4, 4);
    uint rc4_key_Position = BitConverter.ToUInt32(pointer, 0);
    byte[] rc4_key = process.ReadBytes((0x508 + rc4_key_Position), 40);
    return rc4_key;
}
Никаких проверок не делал, это так для тестирования, но в отладчике вернуло нужное значение.
Возможно это и не правильно, но пока работает, только в "боевых условиях" покажет так это или нет.

Добавлено через 15 часов 10 минут
вот так будет проще:
C#
1
2
3
4
5
6
public static byte[] read_rc4_key(Process process)
{
    uint rc4_key_Position = process.ReadUInt(0x00C923D4);
    byte[] rc4_key = process.ReadBytes((0x508 + rc4_key_Position), 40);
    return rc4_key;
}
0
26.12.2009, 13:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2009, 13:03
Помогаю со студенческими работами здесь

Портирование кода
Добрый день, часто вижу, что при портировании кода с ПК версии до мобильной версии, вставляют...

Портирование драйвера с XP на 7
Здравствуйте. Возможно ли драйвер написанный для WinXP переделать (переконвертить и т.д.) для Win7?...

Портирование регулярки
Здравствуйте! Есть одна регулярка, которую мне помог написать один хороший человек. Она...

Портирование кода с c++ на c#
Добрый день! Помогите, пожалуйста, перевести на с# такой код#include<stdio.h> #include<stdlib.h>...

Портирование на Android
Здравствуйте! В своё время насмотрелся "Во все тяжкие" и запилил программку на Java под ПК...

Портирование кода с С# на С++
Доброго времени суток! Помогите, пожалуйста, перевести на с++ такой код(желательно очень близко к...


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

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