Gå til innhold

ProgrammeringsBaren! Småprat, om det du elsker!


Anbefalte innlegg

En liten "ting", når jeg skriver en kodestruktur som skal injectes.

Så trenger den strukturen å kalle en allerede eksisterene funksjon i "The targetProcess" som jeg har offsetten til.

Men hvordan kaller jeg en funksjon via en offsett i C++ ?

:ermm:

9280641[/snapback]

 

Funksjonspeker?

Lenke til kommentar
Videoannonse
Annonse
link.

Joda, jeg vet det.

Så jeg kan angi en offset fremfor navn på en funksjon slik som det er gjort her?

9280977[/snapback]

 

Det må vel bli noe slikt:

 

int (*blah)(int) = adresse til funksjonen;

 

Lenge siden jeg brukte funksjonspekere på denne måten, men tror det skal gå. Kanskje kompilatoren klager.

Endret av Jaffe
Lenke til kommentar

Du får caste adressen til rett pekertype da, så kompilatoren vet litt ting når den skal kalle den:

 

int (*blah)(int) = (int (*)(int))(0xCAFEBABE);

 

Du bytter såklart ut int'ene med retur- og argument-typene til funksjonen du vil kalle. F.eks. om du vil kalle en funksjon som returnerer en char-peker og tar to char-er og en int:

 

char* (*blah)(char, char, int) = (char* (*)(char, char, int))(0xCAFEBABE);

 

Dette tror jeg bør funke.

Lenke til kommentar

Takk for hjelpen her :D

 

Skal vi se, følgende kode fungerte:

#include <iostream>

using std::cout;

int test(int hi);

typedef int* (*blah)(int);

int main(int argc, char* argv[])

{

blah foo = (blah)0x4110F5;

cout << "FunksjonsAdresse: " << *test << "\n";

cout << foo(4) << "\n";

system("pause");

return 0;

}

 

int test(int hi)

{

return hi*2;

}

 

Jeg har bare et spørsmål angående output fra callet til foo, og en linje med kode.

Spørsmål1:

Kan noen gidde å forklare denne linjen:

blah foo = (blah)0x4110F5;

Hvorfor slik, hvorfor må blah stå i parentes før adresssen?

 

Spørsmål2:

Output som blir printa ser slik ut:

00000008

 

Hvorfor ikke bare 8 :p?

 

Edit: Har forsovidt bestillt meg "How to program C++ Sixth edition", gleder meg til den kommer. Har litt sånn hullete C++ kunnskap. :p

Endret av Frysning
Lenke til kommentar
Takk for hjelpen her :D

 

Skal vi se, følgende kode fungerte:

#include <iostream>

using std::cout;

int test(int hi);

typedef int* (*blah)(int);

int main(int argc, char* argv[])

{

blah foo = (blah)0x4110F5;

cout << "FunksjonsAdresse: " << *test << "\n";

cout << foo(4) << "\n";

system("pause");

return 0;

}

 

int test(int hi)

{

return hi*2;

}

 

Jeg har bare et spørsmål angående output fra callet til foo, og en linje med kode.

Spørsmål1:

Kan noen gidde å forklare denne linjen:

blah foo = (blah)0x4110F5;

Hvorfor slik, hvorfor må blah stå i parentes før adresssen?

 

Spørsmål2:

Output som blir printa ser slik ut:

00000008

 

Hvorfor ikke bare 8 :p?

 

Edit: Har forsovidt bestillt meg "How to program C++ Sixth edition", gleder meg til den kommer. Har litt sånn hullete C++ kunnskap. :p

9283967[/snapback]

 

(blah) foran adressen caster den til en peker til en funksjon som returnerer en int og tar en int. Det er vel for å sikre at kompilatoren kaller funksjonen på rett måte (at den vet hvor mange argumenter som skal legges på stack osv.)

 

EDIT: Det er jo av samme grunn man f.eks. caster pekertypen når man allokerer minne med malloc i C:

 

char* streng = (char*)malloc(32);

 

Jeg ser også at du har definert blah som en typedef på en peker som returnerer en peker til int, og ikke en int. Det kan kanskje forklare hvorfor du får 00000008.

 

Forresten, i eksempelkoden du viste trenger du ikke vite adressen til test-funksjonen, du kan bruke address-of-operatøren (&):

 

blah foo = &test;

Endret av Jaffe
Lenke til kommentar

Jeg skrev dette istedet:

typedef int (*blah)(int);

 

Og da returnerer den bare tallet uten alle nullene.

Hehe jeg måtte teste med adressen, koden skal brukes til injection.

 

Update: Nå over til WriteProcessMemory

Headeren ser slik ut:

BOOL WINAPI WriteProcessMemory(
 HANDLE hProcess,
 LPVOID lpBaseAddress,
 LPCVOID lpBuffer,
 SIZE_T nSize,
 SIZE_T* lpNumberOfBytesWritten
);

 

Hva er de datatypene som er definert her, LPVOID, LPCVOID og SIZE_T?

Det er vel ingen som har et eksempel?

:innocent:

 

I det jeg klarer å grave frem på nettet brukes dette:

unsigned long pid;

HANDLE process;

 

GetWindowThreadProcessId(listview, &pid);

process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|

                    PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);

 

Problemet mitt blir jo å få tak i pid uten å bruke GetWindowsThreadProcessId.

Hvorfor er det ikke bare en funksjon som sier "GetProcessHandle". Grrrr.

 

Edit: Når jeg har fått oppsummert alt sammen, skrevet noe kode selv og økt forståelsen skal jeg skrive en introduksjon til reversing i bruker-guider.

Samt samle artikler og linker der.

 

Edit: Greit, jeg må ha PID, når jeg har den bruker jeg bare OpenProcess for å få handle. Nå gjenstår bare resten av parameterne.

 

Update!

 

Jeg testet TatniumInjectoren og den er genial.

Etter den er compilet legger jeg bare min egen kode i en .dll fil med samme navn som loaderen og den festes til angitt program.

Sjekket med Ollydbg, så den fester dll.

Den bruker vel CreateRemoteThread.

Damn så mye kode jeg har fått gratis, det er ikke få folk som har laget den injectoren heller.

Hvis koden skulle være av interresse, for injectoren så bare spør.

Endret av Frysning
Lenke til kommentar

ja, peker av ukjent størrelse.

 

Jeg vet ikke hva som egentlig er poenget med size_t datatypen, utenom å gjøre livet litt surere.

Dessuten er all den typedef-inga i platform sdk fryktelig irriterende når man jobber med windows funksjoner i andre språk, og skal finne ut hva de forskjellige datatypene an byttes ut med.

Lenke til kommentar

Når det kommer til cheating så kom jeg på en liten idé.

Tenk å ha en server, hvor alle spillerne er programmerere som alle bruker sin egen cheat. Det hadde vært genialt, de som har mest programming skills vinner.

Samme hvilket spill egentlig. :p

 

Hadde det vært gøy?

(Finnes det så bare.. Grr)

Endret av Frysning
Lenke til kommentar
Når det kommer til cheating så kom jeg på en liten idé.

Tenk å ha en server, hvor alle spillerne er programmerere som alle bruker sin egen cheat. Det hadde vært genialt, de som har mest programming skills vinner.

Samme hvilket spill egentlig. :p

 

Hadde det vært gøy?

(Finnes det så bare.. Grr)

9303787[/snapback]

Jeg har hørt om at det finnes cs servere der det er lov å cheate.

Endret av sindreij
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...