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"