Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
5 / 3 / 2
Регистрация: 24.06.2017
Сообщений: 219
1

Запуск приложения из памяти

31.07.2019, 18:16. Показов 2263. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
все работает под x32 нормально но как я начинаю добавлять arr( Vector.data() ) как x64 приложение то не чего не происходит
если под x64 то nameProc равено пути приложению x64 битного
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
bool cMemory::mapProcces(void* arr)
{
    string nameProc = "путь до приложения";
    
    IMAGE_SECTION_HEADER* SectionHeader;
 
    PROCESS_INFORMATION Pi;
    STARTUPINFOA Si;
 
    CONTEXT* Ctx;
 
    DWORD* ImageBase;
    void* pImageBase;
 
    IMAGE_DOS_HEADER* DOSHeader = PIMAGE_DOS_HEADER(arr);
    IMAGE_NT_HEADERS* NtHeader = PIMAGE_NT_HEADERS(DWORD(arr) + DOSHeader->e_lfanew);
 
 
    if (NtHeader->Signature == IMAGE_NT_SIGNATURE)
    {
        memset(&Si, 0, sizeof(Si));
        memset(&Pi, 0, sizeof(Pi));
        
        Si.cb = sizeof(STARTUPINFO);
        if (CreateProcessA(NULL, (LPSTR)nameProc.c_str(), NULL, NULL, FALSE,
            CREATE_SUSPENDED | CREATE_NO_WINDOW, NULL, NULL, &Si, &Pi))
        {
            Ctx = LPCONTEXT(virtualAlloc(NULL, sizeof(Ctx), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));
            Ctx->ContextFlags = CONTEXT_FULL;
 
            if (getThreadContext(Pi.hThread, LPCONTEXT(Ctx)))
            {
#ifdef _WIN64
                readMemory(Pi.hProcess, PVOID(Ctx->Rbx + 8), LPVOID(&ImageBase), sizeof(PVOID), 0);
#else
                readMemory(Pi.hProcess, PVOID(Ctx->Ebx + 8), LPVOID(&ImageBase), sizeof(PVOID), 0);
#endif
                pImageBase = virtualAllocEx(Pi.hProcess, LPVOID(NtHeader->OptionalHeader.ImageBase), NtHeader->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
                
                //cout << GetLastError() << endl;
                writeMemory(Pi.hProcess, pImageBase, arr, NtHeader->OptionalHeader.SizeOfHeaders, NULL);
 
                for (int i = 0; i < NtHeader->FileHeader.NumberOfSections; i++)
                {
                    SectionHeader = PIMAGE_SECTION_HEADER((LPBYTE)arr + DOSHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS) + (i * sizeof(IMAGE_SECTION_HEADER)));
                    writeMemory(Pi.hProcess, (PVOID)((LPBYTE)pImageBase + SectionHeader->VirtualAddress), (PVOID)((LPBYTE)arr + SectionHeader->PointerToRawData), SectionHeader->SizeOfRawData, 0);
                }
#ifdef _WIN64
                Ctx->Rax = (DWORD)((LPBYTE)pImageBase + NtHeader->OptionalHeader.AddressOfEntryPoint);
#else
                Ctx->Eax = (DWORD)((LPBYTE)pImageBase + NtHeader->OptionalHeader.AddressOfEntryPoint);
#endif
                //writeMemory(Pi.hProcess, LPVOID(Ctx->Ebx + 8), LPVOID(&NtHeader->OptionalHeader.ImageBase), 4, 0);
 
#ifdef _WIN64
                writeMemory(Pi.hProcess, (PVOID)(Ctx->Rbx + 8), &NtHeader->OptionalHeader.ImageBase, sizeof(PVOID), NULL);
#else
                writeMemory(Pi.hProcess, (PVOID)(Ctx->Ebx + 8), &NtHeader->OptionalHeader.ImageBase, sizeof(PVOID), NULL);
#endif
 
                setThreadContext(Pi.hThread, LPCONTEXT(Ctx));
 
                resumeThread(Pi.hThread);
 
                return true;
            }
            else
                cout << "error getThreadContext " << GetLastError() << endl;
        }
        else
            cout << "error create procces " << GetLastError() << endl;
    }
    else
        cout << "error signature " << GetLastError() << endl;
    return false;
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2019, 18:16
Ответы с готовыми решениями:

Запуск .NET C# программы из памяти C++ приложения
Понадобилось реализовать запуск .NET C# программы прямо из памяти C++ приложения. Использую...

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

Запустить параллельного приложения / Запуск приложения в новом консольном окне
Доброго времени суток! Хотел спросить как в коде консольного приложения запустить ещё одно...

Возможен ли запуск стороннего приложения в окне моего приложения?
Возможно ли запускать стороннее приложение в окне моего приложения ? В Идеале не терять...

3
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
01.08.2019, 08:58 2
Цитата Сообщение от zapolarnik16 Посмотреть сообщение
все работает под x32 нормально но как я начинаю добавлять arr( Vector.data() ) как x64 приложение то не чего не происходит
если под x64 то nameProc равено пути приложению x64 битного
Цитата Сообщение от zapolarnik16 Посмотреть сообщение
#ifdef _WIN64
* * * * * * * * Ctx->Rax = (DWORD)((LPBYTE)pImageBase + NtHeader->OptionalHeader.AddressOfEntryPoint);
#else
Здесь, наверное, нужно DWORD64
0
Эксперт С++
3574 / 2828 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 22
01.08.2019, 09:59 3
там везде нужен unsigned __int64

IMAGE_NT_HEADERS есть 32 и 64, соответственно приводить PVOID со смапленным адресом нужно к (DWORD64)arr

PVOID(Ctx->Ebx + 8) - почему здесь 8?

неправильно
SectionHeader = PIMAGE_SECTION_HEADER((LPBYTE)arr + DOSHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS) + (i * sizeof(IMAGE_SECTION_HEADER)));

SectionHeader = (PIMAGE_SECTION_HEADER)((DWORD64)arr + DOSHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS));
0
5 / 3 / 2
Регистрация: 24.06.2017
Сообщений: 219
06.08.2019, 23:32  [ТС] 4
извините то что не смог тогда ответить да это помогло убрал 8 и заменил SectionHeader и DWORD -> DWORD64 но консолька не появляется получается я маплю консольное приложение
0
06.08.2019, 23:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.08.2019, 23:32
Помогаю со студенческими работами здесь

Запуск приложения из другого приложения
Всем привет, подскажите как решить следующую задачу. Есть приложение &quot;A&quot; которое запускает два...

Запуск не .Net приложения в памяти
Подскажите, пожалуйста, возможен ли запуск не .Net приложения прямо в памяти из массива байт. Знаю...

Запуск модуля приложения из памяти
Есть приложение, в нем находится некий модуль с процедурой. Мне нужно выполнить эту процедуру не...

Запуск стартовой активити при выгрузке приложения из памяти
Заметил в некоторых приложениях, что после их сворачивания и разворачивания через некоторое время -...

Запуск консольного приложения из другого приложения
Я понимаю, что мой вопрос уже разжеван. Однако точного ответа я пока на него не нашел. У меня...

Запуск приложения через батник из приложения
Суть такая, у меня есть батник который выполняет некую команду записывая результат в файл и после...


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

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