przeszukanie pamieci Ram

0

witam wszystkich .

juz jakies 8h :) siedze nad dllka do przeszukania pamieci RAM i nie wiem gdzie popelniam blad :(
wzor do przeszukania znalazlem na necie i na jego podstawie napisalem dllke ......

problem polega na tym ze znajduje mi tylko niektore adresy bo Cheat Engine znajduje ich owiele wiecej ....
i nie wiem gdzie popelniam blad :(

czy moze przy string find czy gdzies indziej :(
bardzo prosze o pomoc

pzdr Andrzej

 //dllmain.cpp
#include <windows.h>
#include "dll.h"

#include <iostream>
#include <string>
using namespace std;

EXPORT int    CALLBACK search(int pid,char* text,int start)
{
   SYSTEM_INFO    sys_info;
   GetSystemInfo(&sys_info);
   HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,TRUE,pid);
   if(hProcess)
   {
      const void* p = sys_info.lpMinimumApplicationAddress;
      MEMORY_BASIC_INFORMATION mem_info;
      while(VirtualQueryEx(hProcess,p,&mem_info,sizeof(MEMORY_BASIC_INFORMATION)) == sizeof(MEMORY_BASIC_INFORMATION))
      {
         if(mem_info.State == MEM_COMMIT)
         {
            int lenght = 4096;
            int i=0;
            while (i<(int)mem_info.RegionSize)
            {
               int address = (int)mem_info.BaseAddress+i;
               char buff[lenght];
               ReadProcessMemory(hProcess, (LPVOID)address, buff, lenght, 0); 
               char* newbuff = new char[lenght+1];
               for (int j=0;j<lenght;j++) 
               {
                  newbuff[j] = buff[j];
               }
               newbuff[lenght] ='\0';
               string str1(newbuff);
               string str2(text);
               int found1 = 0;
               int found2 = 0;
               while (true)
               {
                  found1=str1.find(str2,found2);
                  if (found1>=0 && address+found1>start) return(address+found1);
                  else found2 = found1+1;
                  if (found2>found1) break;
                  if (found1==-1) break;
               }       
               i += lenght;
            }
         }
         p = (char*)mem_info.BaseAddress + mem_info.RegionSize;
         if(p >= sys_info.lpMaximumApplicationAddress)break;
      }
      CloseHandle(hProcess);
   }
   else return(-1);
   return(0);
}

0
NieMamJuzPomyslu napisał(a)

wzor do przeszukania znalazlem na necie

Tak z ciekawości, możesz ten wzór pokazać? Swoją drogą to przeszukuje pamięć procesu, nie pamięć RAM.

0

http://programowanie.cal.pl/forum/viewtopic.php?f=2&t=1011&start=0

dziekuje za poprawienie mnie ....

pozdrawiam Andrzej

0

Co się stanie jeżeli część stringa będzie na końcu jednej strony pamięci, zaś jego koniec na początku drugiej? Masz dwie opcje - albo czytać ciągłe bloki, do czasu trafienia na PAGE_NOACCESS albo też szukać po stronie, tak jak to masz mniej/więcej zrealizowane i brać pod uwagę długość danych - jeżeli jesteś 5 bajtów od końca bufora to porównaj tylko 5 bajtów z tej strony, jeżeli równe to zapamiętaj od jakiego miejsca masz kontynuować po pobraniu strony następnej. Poza tym mógłbyś zwalniać pamięć przydzieloną przy pomocy new, system będzie CI wdzięczny... Zamiast std::string::find zainwestuj w memcmp.

0

to jest taki prototyp kodu wiec bede na pewno sie stral go jescze zoptymalizowac ....

szukam tylko dwóch literek wiec tych przelomow nie powinno byc az tak wiele ....

druga sprawa to gdy chce cos wyszukac ze spacja to w ogóle nic nie znajduje np "k b" w CHEAT znjduje

0
NieMamJuzPomyslu napisał(a)

druga sprawa to gdy chce cos wyszukac ze spacja to w ogóle nic nie znajduje np "k b" w CHEAT znjduje

A jak tę funkcję wywołujesz?

0

tak to mniej wiecej wyglada :)

 

	[DllImport("Search.dll")]
	static int search( int pid, char* text, int start);
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
				 
   int pid = 5224;
   int address[1000];
   for (int k=1;k<1000;k++)
   {
      address[k]=0;
   }  
   for (int i=1;i<1000;i++)
   {
	  address[i] = search(pid,"kb",address[i-1]);
      if (address[i]>0 ) richTextBox1->Text += address[i]+"\n";
      if (address[i]==0) break;
	  Refresh();
   } 
   richTextBox1->Text += "koniec\n";
			 }
0

No wiesz, spacji to ja w tym nie widzę.

0

no w tym przykladzie akurat nie bylo :)

search(pid,"Connection status",address[i-1]); 

pzdr Andrzej

0

hmm zamiast

 char* newbuff = new char[lenght+1];
               for (int j=0;j<lenght;j++) 
               {
                  newbuff[j] = buff[j];
               }
               newbuff[lenght] ='\0';
               string str1(newbuff);

dalem

 string newbuff = "";
               for (int j=0;j<lenght;j++) 
               {
                  newbuff += buff[j];
               }

i zadzialalo :)
tak jakby podczas zapisu do char* przy napotkaniu spacji konczylo zapis ??

0

Napotyka w buforze '\0' i na tym kończy stringa, nie wczytuje całości. Dlatego pisałem o użyciu memcmp, które nie traktuje '\0' specjalnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1