Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 16:07

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[C++] Eintrittspunkt/Basis-Addresse eines Programms finden.

Discussion on [C++] Eintrittspunkt/Basis-Addresse eines Programms finden. within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Sep 2008
Posts: 18
Received Thanks: 4
Thumbs up [C++] Eintrittspunkt/Basis-Addresse eines Programms finden.

#Edit:


Hallo!
Hab mal angefangen mit memory read/write rum zu experimentieren, funktioniert soweit auch ganz gut.
Bei Solitär bereitet mir jedoch etwas probleme, sieht im CheatEngine folgendermaßen aus:


Mit 'normalen' statischen addressen komm ich klar, aber hier weiß ich nich wie ich 'solitaire.exe+97074' in C++ handhaben soll.
Bräuchte also etwa sowas:

Code:
DWORD entryPoint = blablabla; 
//Wie bekomm ich den Einstiegspunkt von solitaire.exe hier rein, 
//so wie's im CE angezeigt wird? (0x0150ACE8)
DWORD offset = 0x2C; 
DWORD address = entryPoint+offset;
Danke schon mal im Voraus.
Pasukaru is offline  
Old 12/16/2011, 18:32   #2
 
HardCore.1337's Avatar
 
elite*gold: 1
Join Date: Feb 2009
Posts: 1,726
Received Thanks: 729
<-- Link
HardCore.1337 is offline  
Old 12/16/2011, 21:36   #3


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,905
Received Thanks: 25,407
kannst auch einfach direkt 0x400000 addieren und die absolute adresse nehmen.
MrSm!th is offline  
Old 12/16/2011, 22:32   #4


 
Ende!'s Avatar
 
elite*gold: 1
Join Date: Feb 2009
Posts: 6,379
Received Thanks: 7,996
Quote:
Originally Posted by MrSm!th View Post
kannst auch einfach direkt 0x400000 addieren und die absolute adresse nehmen.
Nur dann, wenn das Programm, welches er manipulieren will, kein ASLR verwendet und auch tatsächlich 0x400000 als ImageBase verwendet. Und ja: es gibt Spiele, die dort nicht die Standardwerte benutzen. WoW z.B..
Ende! is offline  
Thanks
1 User
Old 12/17/2011, 01:12   #5


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,905
Received Thanks: 25,407
Ist aber nicht die Regel und dann nimmt man halt die andere Base, ist ja nicht schwer herauszufinden.
Und eine dynamische Base haben die wenigsten Games.
MrSm!th is offline  
Old 12/17/2011, 01:57   #6
 
elite*gold: 0
Join Date: Sep 2008
Posts: 18
Received Thanks: 4
Danke and HardCore.1337 und link, genau danach hab ich gesucht.

Hier der code, den ich jetzt hab - vielleicht hilfts später jemandem:

Code:
#include "stdafx.h" 
#include <windows.h> 
#include <TlHelp32.h> 
#include <iostream> 

using namespace std; 

DWORD dwGetModuleBaseAddress(DWORD dwProcessIdentifier, TCHAR *lpszModuleName) 
{ 
   HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessIdentifier); 
   DWORD dwModuleBaseAddress = 0; 
   if(hSnapshot != INVALID_HANDLE_VALUE) 
   { 
      MODULEENTRY32 ModuleEntry32 = {0}; 
      ModuleEntry32.dwSize = sizeof(MODULEENTRY32); 
      if(Module32First(hSnapshot, &ModuleEntry32)) 
      { 
         do 
         { 
            if(_tcscmp(ModuleEntry32.szModule, lpszModuleName) == 0) 
            { 
               dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr; 
               break; 
            } 
         } 
         while(Module32Next(hSnapshot, &ModuleEntry32)); 
      } 
      CloseHandle(hSnapshot); 
   } 
   return dwModuleBaseAddress; 
} 

int main() 
{ 
   HWND window = FindWindow(0, _T("Solitaire")); 
   if( window == 0 ){ 
      printf("Window not found!\n"); 
      char f; 
      cin >> f; 
      return 0; 
   } 

   DWORD pID = 0; 
   GetWindowThreadProcessId(window, &pID); 
    
   DWORD baseAddr = dwGetModuleBaseAddress(pID, _T("solitaire.exe")); 
   DWORD staticOffset = 0x97074; 
    
   HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID); 
    
   DWORD value; 
   DWORD numBytesRead; 
   ReadProcessMemory(handle, (LPCVOID)(baseAddr+staticOffset), &value, sizeof(DWORD), &numBytesRead); 
   value+=0x2C; 
   ReadProcessMemory(handle, (LPCVOID)value, &value, sizeof(DWORD), &numBytesRead); 
   value+=0x10; //Points offset 
   ReadProcessMemory(handle, (LPCVOID)value, &value, sizeof(DWORD), &numBytesRead); 
    
   CloseHandle(handle); 
   printf("Found value: %d", value); 

   char f; 
   cin >> f; 
   return 0; 
}
Pasukaru is offline  
Thanks
2 Users
Old 12/17/2011, 12:03   #7
 
Tyrar's Avatar
 
elite*gold: 0
Join Date: Oct 2008
Posts: 1,637
Received Thanks: 1,119
würde nicht auch RtlImageNtHeader ne gute lösung bieten?

PoC code:
Code:
; DWORD __stdcall GetImageBaseThread(LPVOID pModuleName)
call GetModuleHandleA
push eax
call RtlImageNtHeader
mov eax, [eax+24] ; eax=((PIMAGE_NT_HEADERS)eax)->OptionalHeader;
mov eax, [eax+28] ; eax=((IMAGE_OPTIONAL_HEADER)eax)->ImageBase;
ret
Tyrar is offline  
Old 12/17/2011, 13:52   #8
 
Tyrar's Avatar
 
elite*gold: 0
Join Date: Oct 2008
Posts: 1,637
Received Thanks: 1,119
Quote:
Originally Posted by link View Post
Wie jetzt?
GetModuleHandle liefert dir doch schon die ImageBase zurueck.
Ausserdem wuerde es halt nur im eigenen Adressraum funktionieren und man muesste den Code injizieren, um die korrekten Werte zu bekommen.
Daher geht es mit den TlHelp-Funktionen am sichersten und schoensten.
gut das war jetzt vielleicht nicht ein tolles beispiel ImageBase aus dem header zu lesen, aber man könnte so z.b. den entrypoint finden usw. das war der gedanke dahinter

und ja wenn man keinen code injizieren will is das ne unschöne methode.. beschäftige mich momentan einfach ein wenig mehr mit den NtXX funktionen
Tyrar is offline  
Old 12/17/2011, 17:57   #9
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,228
Quote:
Originally Posted by Pasukaru View Post
Hallo!
Hab mal angefangen mit memory read/write rum zu experimentieren, funktioniert soweit auch ganz gut.
Bei Solitär bereitet mir jedoch etwas probleme, sieht im CheatEngine folgendermaßen aus:


Mit 'normalen' statischen addressen komm ich klar, aber hier weiß ich nich wie ich 'solitaire.exe+97074' in C++ handhaben soll.
Bei der .exe musst du statt der GetModuleHandle(0) den process schreiben, weil es so bei einer .dll aussieht.
Basepointer definierst als:
Code:
DWORD BasePointer = 0;
Code:
DWORD ImageBase = (DWORD)GetModuleHandle(0);
BasePointer = ImageBase + 0x00097074;
XxharCs is offline  
Old 12/17/2011, 20:34   #10


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,905
Received Thanks: 25,407
Quote:
Originally Posted by HeavyHacker View Post
gut das war jetzt vielleicht nicht ein tolles beispiel ImageBase aus dem header zu lesen, aber man könnte so z.b. den entrypoint finden usw. das war der gedanke dahinter

und ja wenn man keinen code injizieren will is das ne unschöne methode.. beschäftige mich momentan einfach ein wenig mehr mit den NtXX funktionen
Nur ist das hier völlig irrelevant.
MrSm!th is offline  
Thanks
2 Users
Reply


Similar Threads Similar Threads
Frage: Arena-Eintrittspunkt ändern?
05/15/2011 - Flyff Private Server - 1 Replies
Hey Leutz, ich hab da ma ne kurze Frage. Wie kann ich den Arena-Eintrittspunkt verändern? Ich hab ne Custommap, wo der arena Verwalter wo anders steht. Jedoch wird man bei Eintreten in die PVP an der alten Stelle gespawnt. Ich hoffe auch schnelle Hilfe :)
[Suche] Hilfe beim finden eines DL für '10er
03/12/2011 - Metin2 Private Server - 3 Replies
Hallo, da es ja verboten ist nach einem DL von den Serverfiels zu fragen, frag ich einfach nach jemand der ihn hat und mir netterweise weiterhilft. Danke MfG
[VB.NET] Automatisch Addresse finden
11/16/2010 - .NET Languages - 23 Replies
Hallo, ich habe ein Wallhack-Tool in VB.Net gecodet Writememory(Prozess, &H1672F868, "2", "4") Funktioniert auch, jedoch ändert sich die Adresse immer. Also mal ist sie 1672F868 und mal XXXXF868. Das F868 bleibt immer gleich, der Rest ändet sich wieder. Wie kann ich in VB.Net das Lösen? Ich hab mir das so gedacht:
Addresse Finden!
04/29/2010 - General Coding - 8 Replies
Hey :) Ich such momentan für so ein Adventure alle SMAs zusammen :D Nur eine finde ich die ganze Zeit nicht. Das ist die Zeit die man in jedem Levelabschnitt hat. Ich habs schon mit allen Scan Typen versucht aber ich finde die SMa einfach nicht :( Kann mir jemand helfen? MFG, TheEcoMaster
Brauche hilfe bei der Programmierung eines raid such programms
11/02/2009 - General Coding - 0 Replies
Hey Leute Ich spiele das spiel lineage2. Dar sich in den letzten monaten, einiges an dem privi server verändert hat (bessere waffen (Raid stats runtergestufft) wurden, möchte ich mir ein programm coden, was mir zeigt ob der genannte raid noch da ist oder nicht. Weiss bloss leider nicht wie ich genau damit anfangen soll



All times are GMT +1. The time now is 16:08.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.