Вверх ↑
Этот топик читают: Гость
Ответов: 704
Рейтинг: 44
#16: 2013-11-23 17:59:52 ЛС | профиль | цитата
flint2 писал(а):
За всё надо платиь, а за цырк, тем более.

Батенька, вы сколько литров съели? Такая длинная проза....
карма: 0

0
Ответов: 2059
Рейтинг: 132
#17: 2013-11-23 18:13:47 ЛС | профиль | цитата
Два, но на двоих.
Наверное ящик девятки подкосил.
Водка без пива, деньги на ветер.
Тык только субота. Есть время оклиматься.

Такая длинная проза....

Чувствую, что не только по фифектам речи заметно, но и по почерку.

карма: 6

0
Ответов: 16884
Рейтинг: 1239
#18: 2013-11-23 18:27:09 ЛС | профиль | цитата
flint2 писал(а):
но " Му Му" - это класика
Мы решили проверить, придумали самые придурочные вопросы, и наш корреспондент поехал в центр Москвы. Вот, что мы узнали: Ленин, настоящая фамилия которого была Медведев, взял псевдоним Ленин потому, что родился в Ленинграде. А Никита Михалков, который написал слова к гимну России, сделал это лучше, чем его папа, написавший слова к гимну СССР. Ни один человек, (ни один!!!!) не усомнился, что Никита Михалков – автор текста к гимну России. Гоголь написал трилогию, первая часть которой называлась «Мать». Он же – автор романа «Гроза», в котором главная героиня изменила мужу, потом сделала аборт и бросилась под поезд. По мнению опрашиваемых, это произведение нельзя исключать из школьной программы, потому что школьникам нужно учиться на чужом опыте, чтобы не совершать подобных ошибок. Станиславский, Немирович и Данченко основали театр, а когда он стал приносить прибыль, Станиславский и Немирович «кинули» Данченко – вот сволочи, плохо поступили. В Великой Отечественной Войне погибло 50 тысяч человек. Наполеон был круче Бонапарта. Жуков за победу над Наполеоном в битве на Курской дуге 350 лет назад получил звание фельдмаршала. Ну, и Базаров утопил Муму – гад!
А ты говориш -классика.
http://www.youtube.com/watch?v=i8zBji44Jfg&list=PLMq9dPXd4COFTE6VFfkMD8c5ByDSDiAKr&index=34
Кстати, "классика" пишется с двумя "с", а
flint2 писал(а):
цырк
цирк, а
flint2 писал(а):
оклиматься
оклематься

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#19: 2013-11-23 18:35:22 ЛС | профиль | цитата


Пятницо продолжается
карма: 22

0
Ответов: 2059
Рейтинг: 132
#20: 2013-11-23 18:57:02 ЛС | профиль | цитата
nesco
Странно, какую неделю летим, а всё пятница.

Кстати, "классика" пишется с двумя "с", а

Абсолютно согласен.
flint2 писал(а)оклиматься оклематься
Согласен.
Что с воза упало, то не вырубишь топором.


карма: 6

0
Ответов: 5227
Рейтинг: 587
#21: 2013-11-24 08:23:43 ЛС | профиль | цитата
flint2 писал(а):
Два, но на двоих.
Наверное ящик девятки подкосил.
эх, здоровье уже не то, а то бы составил компанию, опыт распития спиртных напитков по скайпу уже имеется
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 2059
Рейтинг: 132
#22: 2013-11-24 10:16:26 ЛС | профиль | цитата
опыт распития спиртных напитков по скайпу уже имеется

Просто диву даешься, как технологии шагнули.
здоровье уже не то

Да, с молодыми теперь тягаться стало тяжело.
А ведь и мы, когдато были рысаками!
Вот и на утро, здоровье не то.
а еслиб водку гнать не из опилок, то чтоб нам было с пяти бутылок.
Да и водка была раньше слаще.
карма: 6

0
Ответов: 1343
Рейтинг: 31
#23: 2013-11-24 11:27:22 ЛС | профиль | цитата
просто компонент ProcMemory не может менять байты в защищённых секторах памяти а в C++ есть функция:

MEMwrite((void*)("тут адресок"),(void*)"x00x00x00x00x00x00x00",7);

а где 00 00 это байтики на которые нужно менять

впринципе то и всё
главное это реализовать именно от с++ так как эта функция может менять любые байтики в играх


или может кто то подскажет как снять защиту
карма: 2

0
Ответов: 5446
Рейтинг: 323
#24: 2013-11-24 13:21:40 ЛС | профиль | цитата
Rysik, судя по всему MEMwrite - это не WinAPI и не библиотечная функция. Если будет код этой функции - будет и дальнейший разговор.
карма: 1

0
Ответов: 1343
Рейтинг: 31
#25: 2013-11-24 15:57:54 ЛС | профиль | цитата
iarspider писал(а):
Rysik, судя по всему MEMwrite - это не WinAPI и не библиотечная функция. Если будет код этой функции - будет и дальнейший разговор.


Вот код записи\чтения

#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#define PROC_NAME "Game.exe"
#define MAX_READ 128


// Проверка наличия подстроки в строке. При этом под "строкой" подразумевается просто последовательность байт.
int fMatchCheck (char *mainstr, int mainstrLen, char *checkstr, int checkstrLen)

{

BOOL fmcret=TRUE;
int x,y;

for (x=0; x<mainstrLen; x++)
{
fmcret=TRUE;
for (y=0; y<checkstrLen; y++)
{
if (checkstr[y]!=mainstr[x+y])
{
fmcret=FALSE;
break;
}
}

if (fmcret)
return x+checkstrLen;
}
return -1;
}
// Выделяем у себя память, в которой будем хранить копию данных из памяти чужой программы.//
char *getMem(char *buff, size_t buffLen, int from, int to)
{
size_t ourSize = buffLen*2;
char *ret = (char*)malloc(ourSize);
memset(ret, 0, ourSize);
memcpy(ret, &buff[from], buffLen-from);
memset(&ret[to-from], 0, to-from);
return ret;
}

//Высвобождаем память
char *delMem(char *buff, size_t buffLen, int from, int to)
{
size_t ourSize = buffLen*2;
char *ret = (char*)malloc(ourSize);
int i,x=0;
memset(ret, 0, ourSize);
for (i=0; i<buffLen; i++) {
if (!(i>=from&&i<to)) {
ret[x]=buff[i];
x++;
}
}
return ret;
}

//Запись в память.
char *addMem(char *buff, size_t buffLen, char *buffToAdd, size_t addLen, int addFrom)
{
size_t ourSize = (buffLen+addLen)*2;
char *ret = (char*)malloc(ourSize);
int i,x=0;
memset(ret, 0, ourSize);
memcpy(ret, getMem(buff, buffLen, 0, addFrom), addFrom);
x=0;
for (i=addFrom; i<addLen+addFrom; i++) {
ret[i]=buffToAdd[x];
x++;
}
x=0;
for (i; i<addFrom+buffLen; i++) {
ret[i]=buff[addFrom+x];
x++;
}
return ret;
}


//Заменяем найденную "строку" на свою.
char *replaceMem(char *buff, size_t buffLen, int from, int to, char *replaceBuff, size_t replaceLen)
{
size_t ourSize = (buffLen)*2;
char *ret = (char*)malloc(ourSize);
memset(ret, 0, ourSize);
memcpy(ret, buff, buffLen); // copy 'buff' into 'ret'
ret = delMem(ret, buffLen, from, to); // delete all memory from 'ret' betwen 'from' and 'to'
ret = addMem(ret, buffLen-to+from, replaceBuff, replaceLen, from);
return ret;
}



DWORD fGetPID( char *szProcessName )
{
PROCESSENTRY32 pe = {sizeof(PROCESSENTRY32)};
HANDLE ss;
DWORD dwRet = 0;
ss = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
if (ss) {
if (Process32First(ss, &pe))
while (Process32Next(ss, &pe)) {
// if (!strcmp(pe.szExeFile, szProcessName)) {
dwRet = pe.th32ProcessID;
break;
// }
}
CloseHandle( ss );
}
return dwRet;
}


/*Важная функция. Получаем привилегии дебаггера.
Именно это позволит нам получить нужную информацию
о доступности памяти.
*/
BOOL DoRtlAdjustPrivilege()

{
#define SE_DEBUG_PRIVILEGE 20L
#define AdjustCurrentProcess 0
BOOL bPrev = FALSE;
LONG (WINAPI *RtlAdjustPrivilege)(DWORD, BOOL, INT, PBOOL);
*(FARPROC *)&RtlAdjustPrivilege = GetProcAddress(GetModuleHandleA("ntdll.dll"), "RtlAdjustPrivilege");
if(!RtlAdjustPrivilege) return FALSE;
RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, TRUE, AdjustCurrentProcess, &bPrev);
return TRUE;
}



int _tmain(int argc, _TCHAR* argv[])
{
/*** VARIABLES ***/
HANDLE hProc; //--Тут будеt хенд процесса
MEMORY_BASIC_INFORMATION mbi;//--Выделения фрагмента памяти
SYSTEM_INFO msi;// Содержит сведения о диапазоне страниц в виртуальном адресном пространстве нашего процесса.
ZeroMemory(&mbi, sizeof(mbi));//затирка содержимого памяти.
GetSystemInfo(&msi);//Получаем системную информацию

//Получаем информацию о памяти в текущей системе.
DWORD dwRead=0;
char *lpData = (LPSTR)GlobalAlloc(GMEM_FIXED, MAX_READ),lpOrig[] = "reload_duration", // что ищем
lpReplacement[] = "xeload_daration"; // на что меняем
int x,at;
/*****************/
if (!lpData)
return -1;

ZeroMemory(lpData, MAX_READ);
// открываем процесс
// do {
// hProc = OpenProcess (PROCESS_ALL_ACCESS, FALSE, fGetPID(PROC_NAME));
// if (!hProc) {
// Sleep(500);
// puts ("Cant open process!\n" "Press any key to retry.\n");
// getch();
// system("pause");
// }
// } while(!hProc);


// ----- Почему код выше не работает???

HWND hWnd = FindWindowA(0,"Warface");//Подключаемся к процессу по названию окна

if (hWnd == 0)
{//если окно не найденно
// puts ("Cтартаните warface и перезапустите программу\n");
// system ("pause");
}
else
{
DWORD pId;
GetWindowThreadProcessId(hWnd, &pId);//получаем Ай Ди процесса
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);

if (!hProc){
//puts ("не могу открыть процесс\n");
//system ("pause");
}else{
// puts ("warface найден\n");
//system ("pause");
}
}





if(DoRtlAdjustPrivilege()){
//Привилегии отладчика для работы с памятью.
puts ("Process opened sucessfully\nScanning memory...\n");
for(LPBYTE lpAddress = (LPBYTE)msi.lpMinimumApplicationAddress;
lpAddress <= (LPBYTE)msi.lpMaximumApplicationAddress;
lpAddress += mbi.RegionSize){
/*Этот цикл отвечает как раз за то, что наша программа не совершит
лишних действий. Память в Windows в процессе делится на "регионы".
У каждого региона свой уровень доступа: к какому-то доступ запрещен,
какой-то можно только прочитать. Нам нужны регионы доступные для записи.
Это позволит в разы ускорить работу поиска по памяти и избежать ошибок
записи в память. Именно так работает ArtMoney.*/
if(VirtualQueryEx(hProc, lpAddress, &mbi, sizeof(mbi))){
//Узнаем о текущем регионе памяти.
if((mbi.Protect & PAGE_READWRITE) || (mbi.Protect & PAGE_WRITECOPY)){
// Если он доступен для записи, работаем с ним.
for (lpAddress; lpAddress<(lpAddress + mbi.RegionSize);
lpAddress+=0x00000100) {
//Проходим по адресам указателей в памяти чужого процесса от начала, до конца региона и проверяем, не в них ли строка поиска.
dwRead=0;
if (ReadProcessMemory (hProc, (LPCVOID)lpAddress, lpData, MAX_READ, &dwRead) == TRUE) {
//Читаем по 128 байт из памяти чужого процесса от начала и проверяем, не в них ли строка поиска.
if (fMatchCheck(lpData, dwRead, lpOrig, sizeof(lpOrig)-1)!=-1) {
//Нашли, сообщим об успехе и поменяем в чужом процессе искомую строку на нашу.
printf ("MEMORY ADDRESS: 0x00%x\n" "DATA:\n", lpAddress);
for (x=0;x<dwRead;x++) {
printf("%c", lpData[x]);
} puts("\n");
at = fMatchCheck (lpData, dwRead, lpOrig, sizeof(lpOrig)-1);
if (at!=-1) {
at-=sizeof(lpOrig)-1;
lpData = replaceMem (lpData, dwRead, at, at+sizeof(lpOrig)-1, lpReplacement, /*sizeof(lpReplacement)-1*/sizeof(lpOrig)-1);
puts("REPLACEMENT DATA:");
for (x=0;x<dwRead-sizeof(lpOrig)-1+sizeof(lpReplacement)-1;x++) {
printf("%c", lpData[x]);
} puts("\n");
puts("Replacing memory...");
if (WriteProcessMemory (hProc, (LPVOID)lpAddress, lpData, /*dwRead-sizeof(lpOrig)-1+sizeof(lpReplacement)-1*/dwRead, &dwRead)) {
puts("Success.\n");
} else puts("Error.\n");
} else puts("Error.\n");
}
}
}
}else puts("Error.\n");
}else puts("Error.\n");
}
}else puts("Error.\n");

//// Cleanup
if (hProc)
CloseHandle(hProc);
if (lpData)
GlobalFree(lpData);
///////////////
puts ("Done. Press any key to quit...");
return 0;//getch();
}

void asassasa()
{
while(1)
{
HANDLE hProc; //--Тут будеt хенд процесса
int at;
DWORD dwRead=0;
char *lpData = (LPSTR)GlobalAlloc(GMEM_FIXED, MAX_READ),lpOrig[] = "reload_duration", lpReplacement[] = "xeload_daration";
ZeroMemory(lpData, MAX_READ);
HWND hWnd = FindWindowA(0,"Warface");//Подключаемся к процессу по названию окна

if (hWnd != 0)
{
DWORD pId;
GetWindowThreadProcessId(hWnd, &pId);//получаем Ай Ди процесса
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);
}
at = fMatchCheck (lpData, dwRead, lpOrig, sizeof(lpOrig)-1);
if (GetAsyncKeyState(VK_F3)&1)
{
lpData = replaceMem (lpData, dwRead, at, at+sizeof(lpOrig)-1, lpReplacement, /*sizeof(lpReplacement)-1*/sizeof(lpOrig)-1);
}


}
}

и самое главное то что там есть кусочек кода для привилегий и я как понял это онон и есть то что позволяет записывать байтики в защищённые сектора памяти
карма: 2

0
Ответов: 16884
Рейтинг: 1239
#26: 2013-11-24 17:11:38 ЛС | профиль | цитата
Твой код выше писал(а):
/*Этот цикл отвечает как раз за то, что наша программа не совершит лишних действий.
Память в Windows в процессе делится на "регионы".
У каждого региона свой уровень доступа: к какому-то доступ запрещен, какой-то можно только прочитать.
Нам нужны регионы доступные для записи.
Это позволит в разы ускорить работу поиска по памяти и избежать ошибок записи в память. Именно так работает ArtMoney.*/
if(VirtualQueryEx(hProc, lpAddress, &mbi, sizeof(mbi))){
//Узнаем о текущем регионе памяти.
if((mbi.Protect & PAGE_READWRITE) || (mbi.Protect & PAGE_WRITECOPY)){
// Если он доступен для записи, работаем с ним.
где ты увидел, что можно писать в недоступные - пальчиком покажи.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 1343
Рейтинг: 31
#27: 2013-11-24 17:25:19 ЛС | профиль | цитата
Tad писал(а):
где ты увидел, что можно писать в недоступные - пальчиком покажи.


вобщем так:

в Cheat Engine есть обзор памяти и там же редактирование
и выходит так:
если в ОБЗОРЕ байты не меняются то выходит что они защищены и моя программа не может их перезаписать, только читает
есл же в ОБЗОРЕ можно менять байтики то и моя программа в силах их сменить

а увидел в дллке
тоесть та самая функция MEMwrite какраз таки и записывает байтики по СТАТИЧЕСКОМУ ЗАЩИЩЁННОМУ адресу (статик байты в CE зелёненькие)

вот и хочу реализовать функцию MEMwrite в HIASM так как не умею ПИСАТЬ программы на с++


во всяком случаи из дллки через с++ можно изменить байтики и через CE можно а вот моя программа что то не может причём оба компонента (ProcMemory и MemPatch)
карма: 2

0
Ответов: 5446
Рейтинг: 323
#28: 2013-11-24 19:28:16 ЛС | профиль | цитата
Rysik, погуглил на эту тему. Вроде как есть два момента: первый - процесс, совершающий насилие над памятью другого, должен иметь привилегию Debug, иначе шиш с маслом. Этого достаточно для изменения данных (текущего числа патронов, например). Однако для изменения кода (максимального числа патронов, например) надо сначала распротектить память (VirtualProtect), потом внести изменения и вернуть защиту на место.
карма: 1

0
Ответов: 1343
Рейтинг: 31
#29: 2013-11-24 19:33:06 ЛС | профиль | цитата
iarspider писал(а):
надо сначала распротектить память (VirtualProtect), потом внести изменения и вернуть защиту на место.



Syntax
C++

а на синтаксисе HIASM это можно склепать?
карма: 2

0
Ответов: 5446
Рейтинг: 323
#30: 2013-11-24 23:34:43 ЛС | профиль | цитата
Rysik, можно. Это WinAPI, а он что в Hiasm-е, что в C++ одинаков.


карма: 1

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)