←  Tutoriale

AMXX.pl: Support AMX Mod X i SourceMod

»

Podmienianie łańcuchów pamięci

  • +
  • -
Ortega - zdjęcie Ortega 24.09.2010

Dziś przedstawię tak jak już wspominałem kiedyś o tak zwanym patchowaniu stringów w bibliotece swds lub mp.

Najpierw aby zacząć wypada przeczytać ten poradnik.
[Orpheu] Podstawowe zagadnienia. - Nieoficjalny polski support AMX Mod X

Stopujemy się w punkcie deassemblacji. Gdy mamy już otworzoną gotową do czytania bibliotekę, która nas interesuje możemy użyć magicznego skrótu klawiaturowego w IDA Pro, shift + F12.
Wygeneruje nam się lista stringów. Teraz dla dalszego odczytu tudzież prostszego szukania stringów powinniśmy ustawić sortowanie po kolumnie 'string'. To może zająć chwilę, więc nie stresujcie się, idźcie na kawę.

Chcemy stworzyć, a raczej musimy stworzyć sygnaturę do Orpheu, która będzie pokazywała gdzie ma się odbywać cały proces i jaki typ danych ma być uwzględniany.
Nie pozostaje nam nic jak tylko użycie struktury bazowej i jej edycja wedle potrzeb.

Spoiler


NAZWA_SYGNATURY, można dać byle jaką nazwę lecz ważne jej późniejsze zapamiętanie w korzystaniu z pluginu, który będzie wykonywał operacje.
BIBLIOTEKA - mod dla mp.dll, engine dla swds.dll
TYP_DANYCH
Posłużę się tutaj obrazkiem z alliedmods:
Posted Image
Jak widać na obrazku mamy 3 typy danych: data, rdata i text
aby je poprawnie zapisać w Orpheu użyjemy takich odpowiedników:
data - data
rdata - rodata
text - code


Mamy więc sygnaturę, pozostaje nam stworzyć plugin, który będzie ów sygnaturę wykorzystywał do podmiany właśnie łańcuchów w DLL.

#include < amxmodx >
#include < orpheu >
#include < orpheu_memory >

public plugin_precache( ) {
//
}


Do podmiany stringów potrzebne sa nam w zasadzie 2 funkcje, z czego z każdej korzystamy w zależności od potrzeb.
OrpheuMemoryReplace( const memoryDataName[] count, any:... );
OrpheuMemoryReplaceAtAddress( address, const memoryDataName[], count, any:... );


Bardzo ważną , rzeczą o której nie możemy zapomnieć jest długość stringów, string który zamierzamy podmienić ma odpowiednia długość i nowy nie może być dłuższy !

Przyjmijmy, że chcemy podmienić "models/w_c4.mdl", na c5.mdl, zatem:
#include < amxmodx >
#include < orpheu >
#include < orpheu_memory >

public plugin_precache( ) {
OrpheuMemoryReplace( "NAZWA_SYGNATURY", "models/w_c4.mdl", "models/w_c5.mdl" );

}

W zasadzie to już koniec tego pluginu, a więc i poradnika. Nie wspomniałem o drugiej funkcji, której używa się zdecydowanie rzadziej, ponieważ jako pierwszy parametr podmiany trzeba podać adres komórki który będzie podmieniany.
Dobre jest to w przypadku gdy nie chcemy podmieniać wszystkich możliwych stringów podanych w funkcji pierwszej a tylko jedną z danego adresu, jeśli mamy pewność, że właśnie ona nam jest potrzebna ;)
Odpowiedz