Solo usuarios registrados pueden comentar y agradecer, Logueate o Registrate

Autor Topic: MultipleLang Season 3 (1.04j)  (Visto 7889 veces)

0 Miembros and 1 Guest are viewing this topic.

Este tema esta marcado como solucionado. Pulsa aqui si quieres ver la solucion de este tema.

Offline zeroalenda Posteado: August 18, 2022, 11:37:23 AM | Modificado: August 19, 2022, 12:21:30 AM by zeroalenda

  • +1 puntos por ventas
  • *
  • Rank: Destacado
  • Posts: 87
  • Gracias recibida: 4142
  • br
Dejo aquí el sistema lang, que en mi opinión es muy importante.

Language.h




Language.cpp


Credit : MasterVendas


Offline InFamous #1 Posteado: August 18, 2022, 05:22:43 PM

  • C++ Coder
  • 0 puntos por ventas
  • *
  • Rank: Destacado
  • Posts: 83
  • Gracias recibida: 3389
  • br

Offline kayito #2 Posteado: August 18, 2022, 10:33:36 PM | Modificado: August 18, 2022, 10:53:28 PM by kayito

  • MAESTRO

  • C++ Coder
  • 0 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 1.083
  • Gracias recibida: 19880
  • ar
No recomiendo utilizar MemoryCpy para este tipo de reemplazos ya que de esa manera extiende el string en el offset indicado, lo cual no es correcto porque podría pisar secciones de memoria contínuas que estén siendo ocupadas por otros valores. La forma correcta de realizar esto es buscar dónde se utiliza dicho valor y reemplazarlo utilizando SetDword colocando un offset de referencia a una variable local static.
Ejemplo:

Code: [Select]
static char m_TextBMD[100];
strcpy_s(this->m_TextBMD, "Data\\Local\\Text_Eng.bmd");
SetDword(0x0063EBB1, (DWORD)&this->m_TextBMD);

Esta es la forma correcta de realizar este tipo de reemplazos.

EJEMPLO LANGUAGE.H Y LANGUAGE.CPP



Offline zeroalenda #3 Posteado: August 18, 2022, 11:38:30 PM

  • +1 puntos por ventas
  • *
  • Rank: Destacado
  • Posts: 87
  • Gracias recibida: 4142
  • br
No recomiendo utilizar MemoryCpy para este tipo de reemplazos ya que de esa manera extiende el string en el offset indicado, lo cual no es correcto porque podría pisar secciones de memoria contínuas que estén siendo ocupadas por otros valores. La forma correcta de realizar esto es buscar dónde se utiliza dicho valor y reemplazarlo utilizando SetDword colocando un offset de referencia a una variable local static.
Ejemplo:

Code: [Select]
static char m_TextBMD[100];
strcpy_s(this->m_TextBMD, "Data\\Local\\Text_Eng.bmd");
SetDword(0x0063EBB1, (DWORD)&this->m_TextBMD);

Esta es la forma correcta de realizar este tipo de reemplazos.

EJEMPLO LANGUAGE.H Y LANGUAGE.CPP
 

exactamente, pero estaba buscando las offset y tuve un problema con SetDword, lo hice de esta manera, una prueba


Offline kayito #4 Posteado: August 19, 2022, 09:11:37 PM | Modificado: August 19, 2022, 09:13:56 PM by kayito

  • MAESTRO

  • C++ Coder
  • 0 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 1.083
  • Gracias recibida: 19880
  • ar
No recomiendo utilizar MemoryCpy para este tipo de reemplazos ya que de esa manera extiende el string en el offset indicado, lo cual no es correcto porque podría pisar secciones de memoria contínuas que estén siendo ocupadas por otros valores. La forma correcta de realizar esto es buscar dónde se utiliza dicho valor y reemplazarlo utilizando SetDword colocando un offset de referencia a una variable local static.
Ejemplo:

Code: [Select]
static char m_TextBMD[100];
strcpy_s(this->m_TextBMD, "Data\\Local\\Text_Eng.bmd");
SetDword(0x0063EBB1, (DWORD)&this->m_TextBMD);

Esta es la forma correcta de realizar este tipo de reemplazos.

EJEMPLO LANGUAGE.H Y LANGUAGE.CPP
 

exactamente, pero estaba buscando las offset y tuve un problema con SetDword, lo hice de esta manera, una prueba

Aquí le comparto los offsets correctos.

Code: [Select]
	SetDword(0x0063EBB0 + 1, (DWORD)&this->m_FileBMD[0]); // "Data\\Local\\Text.bmd"
SetDword(0x0063E9C4 + 1, (DWORD)&this->m_FileBMD[1]); // "Data\\Local\\Dialog.bmd"
SetDword(0x0063EA60 + 1, (DWORD)&this->m_FileBMD[2]); // "Data\\Local\\Slide.bmd"
SetDword(0x0063E983 + 1, (DWORD)&this->m_FileBMD[3]); // "Data\\Local\\Item.bmd"
SetDword(0x0063E9D1 + 1, (DWORD)&this->m_FileBMD[4]); // "Data\\Local\\Quest.bmd"
SetDword(0x0063E990 + 1, (DWORD)&this->m_FileBMD[5]); // "Data\\Local\\Skill.bmd"
SetDword(0x0063E9E9 + 1, (DWORD)&this->m_FileBMD[6]); // "Data\\Local\\movereq.bmd"
SetDword(0x00459964 + 1, (DWORD)&this->m_FileBMD[7]); // "Data\\Local\\JewelOfHarmonyOption.bmd"
SetDword(0x004599CA + 1, (DWORD)&this->m_FileBMD[8]); // "Data\\Local\\JewelOfHarmonySmelt.bmd"
SetDword(0x00407DB7 + 1, (DWORD)&this->m_FileBMD[9]); // "Data\\Local\\ItemAddOption.bmd"
SetDword(0x00496EB2 + 1, (DWORD)&this->m_FileBMD[10]); // "Data\\Local\\ItemSetOption.bmd"


Offline zeroalenda #5 Posteado: August 19, 2022, 09:40:26 PM

  • +1 puntos por ventas
  • *
  • Rank: Destacado
  • Posts: 87
  • Gracias recibida: 4142
  • br
No recomiendo utilizar MemoryCpy para este tipo de reemplazos ya que de esa manera extiende el string en el offset indicado, lo cual no es correcto porque podría pisar secciones de memoria contínuas que estén siendo ocupadas por otros valores. La forma correcta de realizar esto es buscar dónde se utiliza dicho valor y reemplazarlo utilizando SetDword colocando un offset de referencia a una variable local static.
Ejemplo:

Code: [Select]
static char m_TextBMD[100];
strcpy_s(this->m_TextBMD, "Data\\Local\\Text_Eng.bmd");
SetDword(0x0063EBB1, (DWORD)&this->m_TextBMD);

Esta es la forma correcta de realizar este tipo de reemplazos.

EJEMPLO LANGUAGE.H Y LANGUAGE.CPP
 

exactamente, pero estaba buscando las offset y tuve un problema con SetDword, lo hice de esta manera, una prueba

Aquí le comparto los offsets correctos.

Code: [Select]
	SetDword(0x0063EBB0 + 1, (DWORD)&this->m_FileBMD[0]); // "Data\\Local\\Text.bmd"
SetDword(0x0063E9C4 + 1, (DWORD)&this->m_FileBMD[1]); // "Data\\Local\\Dialog.bmd"
SetDword(0x0063EA60 + 1, (DWORD)&this->m_FileBMD[2]); // "Data\\Local\\Slide.bmd"
SetDword(0x0063E983 + 1, (DWORD)&this->m_FileBMD[3]); // "Data\\Local\\Item.bmd"
SetDword(0x0063E9D1 + 1, (DWORD)&this->m_FileBMD[4]); // "Data\\Local\\Quest.bmd"
SetDword(0x0063E990 + 1, (DWORD)&this->m_FileBMD[5]); // "Data\\Local\\Skill.bmd"
SetDword(0x0063E9E9 + 1, (DWORD)&this->m_FileBMD[6]); // "Data\\Local\\movereq.bmd"
SetDword(0x00459964 + 1, (DWORD)&this->m_FileBMD[7]); // "Data\\Local\\JewelOfHarmonyOption.bmd"
SetDword(0x004599CA + 1, (DWORD)&this->m_FileBMD[8]); // "Data\\Local\\JewelOfHarmonySmelt.bmd"
SetDword(0x00407DB7 + 1, (DWORD)&this->m_FileBMD[9]); // "Data\\Local\\ItemAddOption.bmd"
SetDword(0x00496EB2 + 1, (DWORD)&this->m_FileBMD[10]); // "Data\\Local\\ItemSetOption.bmd"

Gracias , podria me explicar cual la diferençia destos offsets para los otros ?


Offline kayito #6 Posteado: August 19, 2022, 10:10:57 PM

  • MAESTRO

  • C++ Coder
  • 0 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 1.083
  • Gracias recibida: 19880
  • ar
Gracias , podria me explicar cual la diferençia destos offsets para los otros ?

En la memoria del main se encuentra guardado el string que corresponde a ese archivo.
Por ejemplo si usted va a 0x0077C7C0 encontrará el string que corresponde a "Data\\Local\\Text.bmd"

El problema es si usted hace un MemoryCpy y le inserta un string más grande, podría suceder que usted pise un valor alojado en la memoria continua. Por ejemplo:
"Data\\Local\\Text.bmd" tiene 21 caracteres en total, por lo que ocupará en memoria desde el offset 0x0077C7C0 hasta 0x0077C7C0 + 21 como máximo, entonces el main puede guardar otro valor en 0x0077C7C0 + 22 que podría ser otro string, otra variable, lo que sea.
Si usted coloca con MemoryCpy un string más grande, por ejemplo "Data\\Local\\Text_%s.bmd" este string tiene más caracteres (24 exactamente) por lo que cuando aplique MemoryCpy usted está modificando para que el dato ocupe desde 0x0077C7C0 hasta 0x0077C7C0 + 24 pero si existía un dato en 0x0077C7C0 + 22 usted ya lo acaba de pisar con el nuevo string que extendió. No sé si me logra comprender con esto que expliqué.

Respecto al SetDword... La funcionalidad de SetDword es asignar un valor DWORD (4 bytes) a un offset específico. Todas las referencias a otro offset se utilizan a través de un valor DWORD que contiene el offset en cuestión. Por ejemplo 0x0077C7C0 es un DWORD. Cuando usted lee en asm "Push Offset variable" lo que está haciendo es empujar la dirección de memoria de "variable" que sería un valor DWORD como por ejemplo 0x0077C7C0. Entonces cuando dice "Push Offset variable" es lo mismo que "Push 0x0077C7C0".
Entonces si usted busca donde diga "Push offset item_a" (ese item_a es el offset donde está almacenado "Data\\Local\\Item.bmd" por ejemplo) usted puede intervenir y cambiar ese "offset item_a" por un string que usted tenga almacenado en una variable suya lo que resultaría en esto "Push offset miVariable".
Entonces cuando usted hace SetDword(0x..., (DWORD)&miVariable); le está indicando a esa instrucción asm en ese offset que en lugar de usar "offset item_a" utilice "offset miVariable" y de esa manera usted puede hacer referencias a strings almacenados en variables propias en su DLL sin necesidad de pisar o perjudicar datos en la memoria del main.

Es difícil de explicar el funcionamiento del ASM, lo siento si no fui muy claro.

Gracias:


Offline zeroalenda #7 Posteado: August 19, 2022, 10:27:16 PM | Modificado: August 19, 2022, 10:30:25 PM by zeroalenda

  • +1 puntos por ventas
  • *
  • Rank: Destacado
  • Posts: 87
  • Gracias recibida: 4142
  • br
Gracias , podria me explicar cual la diferençia destos offsets para los otros ?

En la memoria del main se encuentra guardado el string que corresponde a ese archivo.
Por ejemplo si usted va a 0x0077C7C0 encontrará el string que corresponde a "Data\\Local\\Text.bmd"

El problema es si usted hace un MemoryCpy y le inserta un string más grande, podría suceder que usted pise un valor alojado en la memoria continua. Por ejemplo:
"Data\\Local\\Text.bmd" tiene 21 caracteres en total, por lo que ocupará en memoria desde el offset 0x0077C7C0 hasta 0x0077C7C0 + 21 como máximo, entonces el main puede guardar otro valor en 0x0077C7C0 + 22 que podría ser otro string, otra variable, lo que sea.
Si usted coloca con MemoryCpy un string más grande, por ejemplo "Data\\Local\\Text_%s.bmd" este string tiene más caracteres (24 exactamente) por lo que cuando aplique MemoryCpy usted está modificando para que el dato ocupe desde 0x0077C7C0 hasta 0x0077C7C0 + 24 pero si existía un dato en 0x0077C7C0 + 22 usted ya lo acaba de pisar con el nuevo string que extendió. No sé si me logra comprender con esto que expliqué.

Respecto al SetDword... La funcionalidad de SetDword es asignar un valor DWORD (4 bytes) a un offset específico. Todas las referencias a otro offset se utilizan a través de un valor DWORD que contiene el offset en cuestión. Por ejemplo 0x0077C7C0 es un DWORD. Cuando usted lee en asm "Push Offset variable" lo que está haciendo es empujar la dirección de memoria de "variable" que sería un valor DWORD como por ejemplo 0x0077C7C0. Entonces cuando dice "Push Offset variable" es lo mismo que "Push 0x0077C7C0".
Entonces si usted busca donde diga "Push offset item_a" (ese item_a es el offset donde está almacenado "Data\\Local\\Item.bmd" por ejemplo) usted puede intervenir y cambiar ese "offset item_a" por un string que usted tenga almacenado en una variable suya lo que resultaría en esto "Push offset miVariable".
Entonces cuando usted hace SetDword(0x..., (DWORD)&miVariable); le está indicando a esa instrucción asm en ese offset que en lugar de usar "offset item_a" utilice "offset miVariable" y de esa manera usted puede hacer referencias a strings almacenados en variables propias en su DLL sin necesidad de pisar o perjudicar datos en la memoria del main.

Es difícil de explicar el funcionamiento del ASM, lo siento si no fui muy claro.

gracias, sí, estaba claro que entendí toda la parte de MemoryCpy y SetDword , pero

SetDword(0x0077C7C0, (DWORD)&this->m_FileBMD[0]); < esta formula con esto offset donde esta almacenados "Data\\Local\\Text.bmd"  puede causar algún conflicto esto no se pode hacer esta alteraçion direto  a este offset correcto ?

ou tanto esto >SetDword(0x0063EBB0 + 1, (DWORD)&this->m_FileBMD[0]); // "Data\\Local\\Text.bmd"
quanto esto SetDword(0x0077C7C0, (DWORD)&this->m_FileBMD[0]);  hace la miesma funcion o no ?


Marcado como mejor respuesta por: zeroalenda Posteado August 19, 2022, 06:34:49 PM

Offline kayito #8 Posteado: August 19, 2022, 10:33:22 PM

  • MAESTRO

  • C++ Coder
  • 0 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 1.083
  • Gracias recibida: 19880
  • ar
gracias, sí, estaba claro que entendí toda la parte de MemoryCpy y SetDword , pero

SetDword(0x0077C7C0, (DWORD)&this->m_FileBMD[0]); < esta formula con esto offset donde esta almacenados "Data\\Local\\Text.bmd"  puede causar algún conflicto esto no se pode hacer esta alteraçion direto  a este offset correcto ?

Si, causa conflicto utilizar esos offsets porque usted estaría almacenando donde dice "Data\\Local\\Text.bmd" la dirección de memoria a su variable m_FileBMD[0] pero no su valor. Entonces cuando el main lea "Push offset text_a" y usted hizo SetDword en ese offset con el valor de m_FileBMD[0] lo que hará es empujar la dirección de memoria que tiene almacenada otra dirección de memoria y no un string. Entonces cuando quiera leer ese valor, en lugar de leer "Data\\Local\\%s\\Text_%s.bmd" leerá 0x12312312 (este 0x12312312 sería el offset donde está almacenado m_FileBMD[0] en su DLL) y por eso fallará.


Offline zeroalenda #9 Posteado: August 19, 2022, 10:35:38 PM | Modificado: August 19, 2022, 11:01:00 PM by zeroalenda

  • +1 puntos por ventas
  • *
  • Rank: Destacado
  • Posts: 87
  • Gracias recibida: 4142
  • br
gracias, sí, estaba claro que entendí toda la parte de MemoryCpy y SetDword , pero

SetDword(0x0077C7C0, (DWORD)&this->m_FileBMD[0]); < esta formula con esto offset donde esta almacenados "Data\\Local\\Text.bmd"  puede causar algún conflicto esto no se pode hacer esta alteraçion direto  a este offset correcto ?

Si, causa conflicto utilizar esos offsets porque usted estaría almacenando donde dice "Data\\Local\\Text.bmd" la dirección de memoria a su variable m_FileBMD[0] pero no su valor. Entonces cuando el main lea "Push offset text_a" y usted hizo SetDword en ese offset con el valor de m_FileBMD[0] lo que hará es empujar la dirección de memoria que tiene almacenada otra dirección de memoria y no un string. Entonces cuando quiera leer ese valor, en lugar de leer "Data\\Local\\%s\\Text_%s.bmd" leerá 0x12312312 (este 0x12312312 sería el offset donde está almacenado m_FileBMD[0] en su DLL) y por eso fallará.


gracias por las explicaciones



Solo usuarios registrados pueden comentar y agradecer, Logueate o Registrate


 

Related Topics

  Subject / Started by Replies Last post
0 Replies
3193 Views
Last post February 23, 2018, 11:12:30 AM
by Rescate
16 Replies
20382 Views
Last post June 07, 2023, 06:58:43 PM
by dakosmu
1 Replies
2853 Views
Last post April 08, 2020, 02:25:07 PM
by dinomat
2 Replies
1504 Views
Last post April 17, 2020, 01:53:44 PM
by juanse23
4 Replies
1645 Views
Last post October 18, 2023, 12:31:05 PM
by baolove000