Форум программистов, компьютерный форум CyberForum.ru

Внедряемся в память чужого процесса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.66
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
26.03.2012, 16:38     Внедряемся в память чужого процесса #1
Сорри, пока писал, разобрался сам... Удалите тему плз.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
26.03.2012, 16:43     Внедряемся в память чужого процесса #2
Читай Рихтера. Желательно весь книга или только тот глав. http://подобные ссылки запрещены/boo.../59464-16.html
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
26.03.2012, 17:50  [ТС]     Внедряемся в память чужого процесса #3
Цитата Сообщение от taras atavin Посмотреть сообщение
Подглядывание данных?
Да, пока хотел по подглядывать... Думал что все - разобрался, аннет...

Код с хабра сработал нормально...
Внедрились в калькулятор.
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
#include <windows.h>
#include <tlhelp32.h>
#include <winbase.h>
#pragma comment(linker,"/BASE:0x13140000") // сдвигаем базу нашего процесса
 
 
// ------- объявляем функции --------
 
DWORD GetProcessID(char*);
BOOL Inject(HANDLE,DWORD(WINAPI* func)(LPVOID));
DWORD WINAPI func(LPVOID);
 
//-------- главная функция ---------
 
int  main(HINSTANCE,HINSTANCE,LPTSTR,int)
    {
        if(!Inject(OpenProcess(PROCESS_ALL_ACCESS,false,GetProcessID("calc.exe")),&func)){ return false;}
    return true;
 
    }
 
//-------- функция, которая будет выполняться в чужом процессе -------
 
DWORD WINAPI func(LPVOID)
    {
    LoadLibrary((LPCSTR)"kernel32.dll");
    LoadLibrary((LPCSTR)"user32.dll");
    MessageBox(0,(LPCSTR)"Hello from addres area of calc",(LPCSTR)"title",0);
    return true;
    }
 
//-------- поиск процесса ---------
 
DWORD GetProcessID(char* lpNameProcess) // в параметре - имя процесса для внедрения
    {
    HANDLE snap;
    PROCESSENTRY32 pentry32;
    snap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        if(snap==INVALID_HANDLE_VALUE) return 0;
        pentry32.dwSize=sizeof(PROCESSENTRY32);
            if(!Process32First(snap,&pentry32)) {CloseHandle(snap);return 0;}
                do
                {
                    if(!lstrcmpi((LPCSTR)lpNameProcess,&pentry32.szExeFile[0]))
                    {
                    CloseHandle(snap);
                    return pentry32.th32ProcessID;
                    }
                }
        while(Process32Next(snap,&pentry32));
        CloseHandle(snap);
    return 0; 
    }
 
//-------- функция внедрения в чужой процесс -------------------
 
    BOOL Inject(HANDLE hProc,DWORD(WINAPI* func)(LPVOID))
{
    DWORD id;
    DWORD ByteOfWriten;
    HMODULE hModule = GetModuleHandle(NULL);
    DWORD size=((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE*)(hModule)+((PIMAGE_DOS_HEADER)(hModule))->e_lfanew+sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER))))->SizeOfImage;
        char* hNewModule = (char*)VirtualAllocEx(hProc,hModule,size,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
            if(hNewModule==NULL) return false;
            WriteProcessMemory(hProc,hNewModule,hModule,size,&ByteOfWriten);
                if(ByteOfWriten!=size){return false;}
                HANDLE hThread=CreateRemoteThread(hProc,NULL,0,func,(LPVOID)hNewModule,0,&id);
                    if(hThread==0) return false;
return true;
}

Хочу реализовать поиск адреса сигнатуры с выведение его вместо "Hello from addres area of calc"

Попытался совместить этот код с
Тут взять функцию поиска паттерна..
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
#include <iostream>* 
#include <windows.h>
#include <iomanip>
using namespace std;
 
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
{
        for(;*szMask;++szMask,++pData,++bMask)
                if(*szMask=='x' && *pData!=*bMask )
                        return false;
        return (*szMask) == NULL;
}
 
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen, BYTE *bMask, char * szMask) {
        for(DWORD i=0;i<dwLen;i++)
                if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) )
                        return (DWORD)(dwAddress+i);
        return (-1);
}
 
int main ()
{ ::setlocale(LC_ALL,"");
   
        DWORD MyAddress = NULL; // Адрес сигнатуры
        
        HWND hWnd = FindWindowA(0,"Timerocketxby");
 
        if (hWnd == 0) {
                cerr << "Запустите Timerocketxby" << endl;
        }else {
                    cerr << "процесс найден" << endl;
                        DWORD pId;
                        GetWindowThreadProcessId(hWnd, &pId);
                        HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, pId);
 
                        if (!hProc){
                        cerr << "не могу открыть процесс" << endl;
                        }else{
                                                                        
                                        bool findOffsets();{
                
                                                DWORD start = 0x0151D426; //начало сканирования
                                                DWORD dwLen = 0x0151D626 - start;   //  Длина модуля сканирования
                                                cerr << "Длина модуля = " <<dwLen << endl;
                                                
                                                MyAddress = dwFindPattern(start, dwLen, (BYTE*)"\x89\xBE\x0A\x02\x00\x00\xE9\x87\x00\x00\x00\x83\xE8\x00\x74\x12", "xxxxxxxxxxxxxxxx"); //ищем адрес по маске
                                                cout << "Значение MyAddress = " << MyAddress << endl;
                                                 if (MyAddress == -1){
                                                        clog << "Искомой сигнатуры нет" << endl;
                                                        
                                                }else{
                                                        cerr << "Адрес найден" << endl;
                                                }
 
                                        }
 
                                
                                CloseHandle(hProc);
                        }
                }
                
        system("pause");
 
        return 0;
}

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

Ушел гуглить и перечитывать Рихтера...
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.03.2012, 18:05     Внедряемся в память чужого процесса #4
То есть шпионский софт пишешь. И с каких это пор здесь разрешено его обсуждение?

Добавлено через 47 секунд
Цитата Сообщение от Deviaphan Посмотреть сообщение
Рекомендую почитать чуть дальше, чем подзаголовки. У него там и теория и практика описана. Причём множеством способов.
Что то не видно, чтоб у ТС хоть что то было описано.
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
26.03.2012, 18:14  [ТС]     Внедряемся в память чужого процесса #5
Цитата Сообщение от taras atavin Посмотреть сообщение
То есть шпионский софт пишешь. И с каких это пор здесь разрешено его обсуждение?
Причем тут шпонский софт?? Я написал поиск сигнатуры в чужом процессе путем копирования его регионов памяти в свой процесс и последующим поиском. Теперь хочу попробовать сделать тоже внутри чужого процесса - сравнить скорость работы и т.д...

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

Цитата Сообщение от taras atavin Посмотреть сообщение
Что то не видно, чтоб у ТС хоть что то было описано.
Человек про Рихтера писал, а не обо мне... )))
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
26.03.2012, 19:35     Внедряемся в память чужого процесса #6
Я так понимаю, что тебе нужно получить ВСЮ память занятую процессом и сканировать её на наличие совпадений.
Если речь не о поиске вирусов, а о сканировании простых программ, то можно проверять только память, помеченную "на исполнение".
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
26.03.2012, 20:47  [ТС]     Внедряемся в память чужого процесса #7
Цитата Сообщение от Deviaphan Посмотреть сообщение
Я так понимаю, что тебе нужно получить ВСЮ память занятую процессом и сканировать её на наличие совпадений.
Если речь не о поиске вирусов, а о сканировании простых программ, то можно проверять только память, помеченную "на исполнение".
Да какие регионы сканировать мне понятно, вопрос в другом, как запустить сканер в чужой памяти? Сейчас у меня такой код для поиска в чужом процессе из своего:
Код
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
if(DoRtlAdjustPrivilege()){
 
    while (lpMem < si.lpMaximumApplicationAddress) {
 
        VirtualQueryEx(phandle, lpMem, &mbi, sizeof(MEMORY_BASIC_INFORMATION));   // Узнаем о текущем регионе памяти.
    
        if(PAGE_EXECUTE_READWRITE){         // Если он доступен для записи                                              
 
                PBYTE pBuffer = new BYTE[mbi.RegionSize];                                // Буфер под считываемый регион
 
                ReadProcessMemory(phandle, mbi.BaseAddress, pBuffer, mbi.RegionSize, 0); // Считываю весь найденный регион  
                
                int k = 0;
                                for (int  i = 0; i < mbi.RegionSize && k<SIZE; i++) { 
 
                                    if (pBuffer[i] == Prob[k])
                                    {
                                            if ( k == SIZE-1){
                                                cerr << "Маска найдена " <<endl; 
                                                MyAddress = (LPVOID)((DWORD)mbi.BaseAddress + (DWORD)i-SIZE+1);
                                                cerr << "Найденный адрес = " << hex << MyAddress << endl;
                                                k = 0;      j++;        
 
                                                break;
                                            }
                                             k++; //i++;
                                    }
 
                                    else {  k = 0; //i++;
                                    }
                                }
                                if (j > 0){ break;  }
            free(pBuffer); 
            //  } 
        lpMem = (LPVOID)((DWORD)mbi.BaseAddress + (DWORD)mbi.RegionSize);
        }
    }
}

Теперь хочу организовать тоже самое только изнутри чужого процесса. Для этого имеется такая функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
{
    for(;*szMask;++szMask,++pData,++bMask)
        if(*szMask=='x' && *pData!=*bMask )
            return false;
    return (*szMask) == NULL;
}
 
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
{
    for(DWORD i=0; i < dwLen; i++)
        if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) )
            return (DWORD)(dwAddress+i);
 
    return 0;
}
 
MyAddress = dwFindPattern(start, dwLen, (BYTE*)"\x89\xBE\x0A\x02\x00\x00\xE9\x87\x00\x00\x00\x83\xE8\x00\x74\x12", "xxxxxxxxxxxxxxxx"); //ищем адрес по маске
Это я так страдал тут, пока не понял, что сканирую сам себя. Как теперь это использовать для поиска в чужом процессе изнутри?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,267
27.03.2012, 00:24     Внедряемся в память чужого процесса #8
Битл, ещё раз: чтобы как-то дифференцировать байты ты должен их считать. Чтобы их считать тебе необходим какой-то промежуточный буфер (просто участок памяти). Есть рабочее решение. Если тебя оно не устраивает- выставь требования к решению. Но эта вещь, на мой взгляд фундаментальная и незыблемая: тебе не обойтись без промежуточного буфера. Разжёвано же
Не работает поиск сигнатуры

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Вообще я не знаю, что ты имеешь ввиду "запустить сканер в чужом процессе" (повторюсь непосредственно для поиска сигнатур есть нормальное рабочее решеие)

Если ты хочешь чтобы стороний процесс САМ СЕБЯ сканировал чтобы найти сигнатуру в самом себе же- ЗАБЕЙ НА ЭТО ДЕЛО. Если сама сигнатура теб не важна, а её поиск- лишь пример, это тяжело, сразу говорю. Это тебе надо сделать примерно так:

1) Написать код на ассемблере, который бы выполнял всё, что тебе надо- поиск сигнатуры и чего хочешь (ну то есть писать ты можешь его на чём угодно, но сдаётся мне, не обойтись без побайтового кодинга)
2) Внедрить этот код в адресное пространство стороннего процесса
3) Запустить этот код там. Вот тогда и получится, что сторонний процесс в чистом виде сам себя сканирует и даже не обращается к ReadProcessMemory

Это всё в общих чертах. Если это то, то тебе надо, wasm.ru ждёт тебя. Должны помочь

Добавлено через 5 минут

Не по теме:

А Рихтер действительно учитель хакеров и крякеров

Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2012, 06:10     Внедряемся в память чужого процесса #9
Цитата Сообщение от Битл Посмотреть сообщение
как запустить сканер в чужой памяти?
Инъекция dll как раз для того и нужна, чтобы впихнуть свой код в адресное пространство другого процесса. У Рихтера подробно описано и как выполнить инъекцию dll и как запустить функцию из этой dll и много чего ещё у него написано. Хорошая книжка.
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
27.03.2012, 10:30  [ТС]     Внедряемся в память чужого процесса #10
Цитата Сообщение от kravam Посмотреть сообщение
тебе не обойтись без промежуточного буфера.
Посмею не согласится... Если просматриваешь "свое" адресное пространство, то достаточно просто задать диапазон адресов сканирования. В той теме у меня так и получалось...
C++
1
dwFindPattern(start, dwLen, (BYTE*)"\x89\xBE\x0A\x02\x00\x00\xE9\x87\x00\x00\x00\x83\xE8\x00\x74\x12", "xxxxxxxxxxxxxxxx");
Цитата Сообщение от kravam Посмотреть сообщение
Если ты хочешь чтобы стороний процесс САМ СЕБЯ сканировал чтобы найти сигнатуру в самом себе же- ЗАБЕЙ НА ЭТО ДЕЛО.
))) Забить проще всего... Но интересно же... Для моей задачи, вполне подойдет то что уже написал, но хочется поэкспериментировать...
Цитата Сообщение от Deviaphan Посмотреть сообщение
Инъекция dll как раз для того и нужна, чтобы впихнуть свой код в адресное пространство другого процесса. У Рихтера подробно описано и как выполнить инъекцию dll и как запустить функцию из этой dll и много чего ещё у него написано. Хорошая книжка.
Да с ДЛЛ все понятно, но наткнувшись на статью на хабре интересно попробовать реализовать тот же функционал без использования dll.
Суть метода заключается в выделении области памяти строго заданного размера в чужом процессе, копировании туда побайтно кода нашего процесса по тем же адресам и запуске удаленного потока.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,267
27.03.2012, 10:42     Внедряемся в память чужого процесса #11
Цитата Сообщение от Битл Посмотреть сообщение
Если просматриваешь "свое" адресное пространство, то достаточно просто задать диапазон адресов сканирования.
Ну да. Будешь делать инъекцию кода?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2012, 11:12     Внедряемся в память чужого процесса #12
Вот такого не делал. Судя по хабру, инъекция dll и проще реализуется и более стабильна (т.е. нет такого, что по адресу что-то будет и выделить память не сможешь).
В общем, не подскажу я, как инъекцию кода сделать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2012, 11:15     Внедряемся в память чужого процесса
Еще ссылки по теме:

C++ Офсеты и память запущенного процесса
C++ Освобождает ли память процесса менеджер памяти Windows?
C++ Запуск процесса из С++

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

Или воспользуйтесь поиском по форуму:
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
27.03.2012, 11:15  [ТС]     Внедряемся в память чужого процесса #13
Цитата Сообщение от kravam Посмотреть сообщение
Будешь делать инъекцию кода?
Ну так про нее тут уже 2 страницы )) В приведенном примере, как я понимаю, просто нужно правильно составить выражение в этой функции, которая внедряется..
C++
1
2
3
4
5
6
7
8
9
10
11
DWORD WINAPI func(LPVOID)
{
LoadLibrary("kernel32.dll"); // нам необходимо подгрузить в целевой процесс
LoadLibrary("user32.dll"); // требуемые нам библиотеки (их может и не быть изначально)
SYSTEMTIME SysTime;
GetSystemTime(&SysTime);
WORD time=SysTime.wSecond+30;
while(time!=SysTime.wSecond){GetSystemTime(&SysTime);}
MessageBox(0,"Hello from addres area","title",0);
return true;
}
Yandex
Объявления
27.03.2012, 11:15     Внедряемся в память чужого процесса
Ответ Создать тему
Опции темы

Текущее время: 16:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru