Bueno mis feliciitaciones a Deilan antes que todo, se nota man que le estas metiendo duro y parejo al tema del desarrollo. Te comento sencillamente vi tu metodo y aunque me trae muy lindos y viejos recuerdos de cuando re-programaba practicamente todos mis codigos utilizando una variacion de C++ con la convencion de llamada: __declspec(naked), vi potenciales fallas en tu codigo y me voy a permitir darte un par de sugerencias, como para que no tengas extraño crashs o bien bugs producto de una mala re-direccion de la memoria del main, primero que todo, los registros de informacion: EAX,EBX,ECX,EDX,EDI,ESI.... se que seguramente no viste esto que voy a explicarte en ningun lado, a mi sencillamente me lo explico hace muchos años atras pinkof, y ahora quiero tratar de explicartelo:
Cuando tengas un codigo en el cual tenes o bien un: CALL o bien un JMP, JMP SHORT, etc, no necesitas hacer esto:
MOV EAX,0x00XXXXXX
JMP EAX
o Esto:
MOV ESI,0x00XXXXXX
CALL ESI
lo podes hacer asi tambien (y de hecho es muy recomendable que lo hagas):
CALL dwBuffer_Call
de donde: "dwBuffer_Call" seria (fuera de lo que es el bloque ensamblador), esto:
DWORD dwBuffer_Call = 0x00XXXXXX;
Me explico ? lo mismo se puede utilizar para los Saltos, Saltos con condicionales, etc.
Saludos Espero te sirva.
PD: Aca abajo te dejo un Ejemplo con el codigo que posteaste, te invito a que pruebes. recorda que si vas a definir por asi decirlo el Buffer tipo DWORD dentro de la funcion y no fuera, es importante setearlo como: "static", para que no te toque el Stack.
#include "stdafx.h"
#include "Util.h"
#include "Description.h"
// Text
char * JewelOfLevel = "Jewel used to Climb Level 0 - 15 in all Items";
// Code
void __declspec(naked) DescriptionLevel()
{
static DWORD dwCall = 0x007DF818;
static DWORD dwJump = 0x00589A68;
// ----
_asm
{
CMP WORD PTR SS:[EDI],ITEMGET(14,200); //Index item
JNZ Return
LEA EAX,DWORD PTR DS:[EAX+EAX*4]
PUSH JewelOfLevel // char text
LEA EDX,DWORD PTR DS:[EAX+EAX*4]
LEA EAX,DWORD PTR DS:[EDX*4+0x7B22A50]
PUSH EAX
CALL dwCall
MOV EAX,DWORD PTR DS:[0x7B553F4]
ADD ESP,8
MOV DWORD PTR DS:[EAX*4+0x7B23BB4],0x08 //cor
MOV DWORD PTR DS:[EAX*4+0x7B52C30],0x01 //borda
INC EAX
MOV DWORD PTR DS:[0x7B553F4],EAX
JMP Return
// ----
Return:
// ----
JMP dwJump
}
void DescriptionInit()
{
SetCompleteHook(0xE9,0x00589A1D,(DWORD)&DescriptionLevel);
}