RO-SHOW-IT(6) Games Manual RO-SHOW-IT(6)

NAME

Ragnarok Online ShowIt — A UI enhancement utility that displays raw experience values and adds new console commands to the RO client.

METADATA

Platform: Ragnarok Online
Release: 2002-02-18
Status: Archived — binary/source preserved

SYNOPSIS

ShowIt.exe

DESCRIPTION

ShowIt (also known as the Exp Viewer) was a popular quality-of-life hack for the Ragnarok Online English Beta client. Its primary goal was to provide players with more transparency regarding their character progression by replacing the default percentage-based experience display with actual numerical values.

While the original compiled binary and source code have been lost, the archive includes the following functional components:

  • hackcodes.h — Memory offsets and binary data for experience display and command hooking.

KEY FEATURES

  • Raw Exp Display — Replaces the % experience display with a detailed current / required numerical format.
  • Command Injection Framework — Adds a new /exp command to the game chat, showing session statistics and detailed gains.
  • Full Screen & Windowed Support — Unlike other overlays of the era, ShowIt was optimized to function correctly in both full-screen and windowed modes.

NOTES

One of the earlier harmless cheats I released for RO.

There were a few variants released by other people at the time, but mostly were external GUI tools. Mine was the first to hook into the game client itself allowing it to work in full screen mode.

ATTACHMENTS (Browsing /usr/games/hacks/)

Path: /usr/games/hacks/ragnarok_online/ShowIt/readme.txt2089 bytes
Ragnarok Online ShowIt v2.0 By Arsenic 
				
What's new in version 2.0
-------------------------
- Moved the command framework to another memory space in order to fix incompabilities with other
  OS.
- Changed the colors for the /exp command messages.
- Fixed a little bug that was showing wrong job exp when switching of characters.

Compabilities with different OS
-------------------------------
This program has been tested and works fine under:
- Windows 98 1st and 2nd edition
- Windows XP
- Windows XP Pro
- Windows 2000

This program applies a patch into the Ragnarok Online process memory, therefore you need to have
it running before applying.
It is compatible with the English Beta client patch level 51 and 52.

Steps to activate the hack:
1) Run your RO client.
2) While in game, press Alt+Tab on your keyboard to minimize the game window.
3) Run this program.
4) Click on "Apply".
5) Come back to the game and enjoy.

What the hack does:
Shows the real experience values of your character. The usual percentage value of the base and
job exp will be replaced by the real value, as of %d / %d.

Also, this hack adds a new in-game command '/exp'. It works like any other game commands, you
need to type "/exp" without the quotes in the text chat box. This command tells you your current
base and job experience and how much exp you have gained from the last monster killed.

By the way, for those who have tried other Exp Viewer programs, my hack will work for both full
screen or windowed mode.

This being said, have fun!

--------------------------------------------------------------
PROGRAMMER NOTE:                                             -
    							     -
This hack uses Arsenic's command framework at offset 596000. -
--------------------------------------------------------------


--------------------------------------

~ Arsenic  a.k.a  Artemis`Entreri

E-mails : DumbassSk8er@hotmail.com
          arsenic@rootshell.be
        
Web page : http://onesided.cjb.net 
           www.onesided.da.ru  (Mirror)
Path: /usr/games/hacks/ragnarok_online/ShowIt/hackcodes.h5911 bytes
//Game
char *gameTitle = "Ragnarok";

//Commands framework for beta 51
DWORD CFPATCH1ADDR = 0x4e999c;
BYTE cfpatch1[] = {0xe9,0x6f,0x46,0x2a,0x00};
BYTE oldcfPatch1[] = {0x8b,0x4c,0x24,0x10,0x50};
int cfpatch1Len = sizeof(cfpatch1);

DWORD COMMANDFRAME1ADDR = 0x78e010;
BYTE commandFrame1[] = {0xa3,0x08,0xe0,0x78,0x00,0x89,0x15,0x0c,0xe0,0x78,0x00,0x8b,0x4c,0x24,0x10,0x50,
			0xe9,0x7c,0xb9,0xd5,0xff};
int commandFrame1Len = sizeof(commandFrame1);

DWORD CFPATCH2ADDR = 0x4E99AA;
BYTE cfpatch2[] = {0xe8,0x81,0x46,0x2a,0x00};
BYTE oldcfPatch2[] = {0x83,0xCD,0xFF,0x89,0x02};
int cfpatch2Len = sizeof(cfpatch2);

DWORD COMMANDFRAME2ADDR = 0x78e030;
BYTE commandFrame2[] = {0x3d,0x03,0x00,0x00,0x00,0x75,0x30,0x60,0x8b,0x15,0x0c,0xe0,0x78,0x00,0x42,0xbd,
			0xe0,0xe0,0x78,0x00,0x33,0xdb,0x8d,0x3c,0x2b,0x8a,0x07,0x84,0xc0,0x74,0x0c,0x8b,
			0x35,0x08,0xe0,0x78,0x00,0x8b,0xca,0xf3,0xa6,0x74,0x12,0x83,0xc3,0x20,0x81,0xfb,
			0x20,0x0c,0x00,0x00,0x76,0xe0,0x61,0x83,0xcd,0xff,0x89,0x02,0xc3,0x8d,0x44,0x2b,
			0x10,0xa3,0x00,0xe0,0x78,0x00,0x61,0x33,0xc0,0x83,0xcd,0xff,0x89,0x02,0xa1,0x00,
			0xe0,0x78,0x00,0xff,0x20};
int commandFrame2Len = sizeof(commandFrame2);

//Exp Viewer for beta 51
DWORD EXPPATCH1ADDR = 0x435477;
BYTE exppatch1[] = {0x68,0xd8,0x74,0x54,0x00};
BYTE oldexpPatch1[] = {0x68,0x4C,0x55,0x54,0x00};
int exppatch1Len = sizeof(exppatch1);

DWORD EXPPATCH2ADDR = 0x435452;
BYTE exppatch2[] = {0x83,0xec,0x04,0x8b,0x01,0x50,0x8b,0x02,0x50,0x8d,0x54,0x24,0x1c,0xeb,0x16};
BYTE oldexpPatch2[] = {0x68,0x54,0x55,0x54,0x00,0x8b,0x02,0x83,0xec,0x08,0x8d,0x04,0x80,0x8d,0x04};
int exppatch2Len = sizeof(exppatch2);

DWORD EXPPATCH3ADDR = 0x44ADD0;
BYTE exppatch3[] = {0x68,0x00,0x10,0x56,0x00};
BYTE oldexpPatch3[] = {0x68,0x34,0x67,0x54,0x00};
int exppatch3Len = sizeof(exppatch3);

DWORD EXPPATCH4ADDR = 0x561000;
BYTE exppatch4[] = {0x4c,0x76,0x2e,0x20,0x25,0x32,0x64,0x20,0x2f,0x20,0x25,0x73,0x20,0x2f,0x20,0x4c,
		    0x76,0x2e,0x20,0x25,0x32,0x64,0x20,0x2f,0x20,0x45,0x78,0x70,0x2e,0x20,0x25,0x64,
		    0x20,0x2f,0x20,0x25,0x64,0x00};
int exppatch4Len = sizeof(exppatch4);

DWORD EXPPATCH5ADDR = 0x44AD92;
BYTE exppatch5[] = {0x55,0x51,0x50,0xeb,0x07};
BYTE oldexpPatch5[] = {0x8D,0x04,0x80,0x8d,0x04};
int exppatch5Len = sizeof(exppatch5);

DWORD EXPPATCH6ADDR = 0x44ADB4;
BYTE exppatch6[] = {0xeb,0x05};
BYTE oldexpPatch6[] = {0x55,0x68};
int exppatch6Len = sizeof(exppatch6);


//exp command for beta 51
DWORD EXPCOMMANDADDR = 0x78e0e0;
char expCommand[] = "/exp";
int expCommandLen = sizeof(expCommand);

DWORD COMMANDPTRADDR = 0x78e0f0;
DWORD commandPtr = 0x561090;
int commandPtrLen = sizeof(commandPtr);

DWORD CMDPATCH1 = 0x4B2F5A;
BYTE cmdPatch1[] = {0xe8,0xd1,0xe0,0x0a,0x00};
BYTE oldcmdPatch1[] = {0xB9,0x78,0xA8,0x59,0x00};
int cmdPatch1Len = sizeof(cmdPatch1);

DWORD BACKUPHPADDR = 0x561030;
BYTE backupHp[] = {0xa1,0x34,0xaa,0x59,0x00,0xa3,0x70,0x10,0x56,0x00,0xa1,0xd8,0xaa,0x59,0x00,0xa3,
		 0x74,0x10,0x56,0x00,0xB9,0x78,0xa8,0x59,0x00,0xc3};
int backupHpLen = sizeof(backupHp);

DWORD CMDPATCH2 = 0x4B2FCC;
BYTE cmdPatch2[] = {0xe8,0x7f,0xe0,0x0a,0x00};
BYTE oldcmdPatch2[] = {0xB9,0x78,0xA8,0x59,0x00};
int cmdPatch2Len = sizeof(cmdPatch2);

DWORD BACKUPNEXTHPADDR = 0x561050;
BYTE backupNextHp[] = {0xa1,0x38,0xAA,0x59,0x00,0xa3,0x80,0x10,0x56,0x00,0xB9,0x78,0xa8,0x59,0x00,0xc3};
int backupNextHpLen = sizeof(backupNextHp);

DWORD CMDPATCH3 = 0x4B2fe4;
BYTE cmdPatch3[] = {0xe8,0x77,0xe0,0x0a,0x00};
BYTE oldcmdPatch3[] = {0xB9,0x78,0xA8,0x59,0x00};
int cmdPatch3Len = sizeof(cmdPatch3);

DWORD BACKUPNEXTSPADDR = 0x561060;
BYTE backupNextSp[] = {0xa1,0xdc,0xaa,0x59,0x00,0xa3,0x84,0x10,0x56,0x00,0xB9,0x78,0xa8,0x59,0x00,0xc3};
int backupNextSpLen = sizeof(backupNextSp);

DWORD EXPFCTADDR = 0x561090;
BYTE expFct[] = {0x60,0xa1,0x38,0xaa,0x59,0x00,0x50,0xa1,0x34,0xaa,0x59,0x00,0x50,0x68,0xd0,0x11,
		 0x56,0x00,0x68,0x90,0x12,0x56,0x00,0xe8,0xed,0xcb,0xfa,0xff,0x83,0xc4,0x10,0x68,
		 0xff,0x66,0x33,0x00,0x68,0x90,0x12,0x56,0x00,0xe8,0xd2,0x00,0x00,0x00,0xa1,0xdc,
		 0xaa,0x59,0x00,0x50,0xa1,0xd8,0xaa,0x59,0x00,0x50,0x68,0xf0,0x11,0x56,0x00,0x68,
		 0x90,0x12,0x56,0x00,0xe8,0xc0,0xcb,0xfa,0xff,0x83,0xc4,0x10,0x68,0xff,0x66,0x33,
		 0x00,0x68,0x90,0x12,0x56,0x00,0xe8,0xa5,0x00,0x00,0x00,0x8b,0x15,0x74,0x10,0x56,
		 0x00,0xa1,0xd8,0xaa,0x59,0x00,0x3b,0xd0,0x77,0x04,0x2b,0xc2,0xeb,0x0c,0x8b,0x1d,
		 0x84,0x10,0x56,0x00,0x2b,0xda,0x03,0xd8,0x8b,0xc3,0x50,0x8b,0x15,0x70,0x10,0x56,
		 0x00,0xa1,0x34,0xaa,0x59,0x00,0x3b,0xd0,0x77,0x04,0x2b,0xc2,0xeb,0x0c,0x8b,0x1d,
		 0x80,0x10,0x56,0x00,0x2b,0xda,0x03,0xd8,0x8b,0xc3,0x50,0x68,0x10,0x12,0x56,0x00,
		 0x68,0x90,0x12,0x56,0x00,0xe8,0x5f,0xcb,0xfa,0xff,0x83,0xc4,0x10,0x68,0x66,0x66,
		 0x99,0x00,0x68,0x90,0x12,0x56,0x00,0xe8,0x44,0x00,0x00,0x00,0x61,0xc3};
int expFctLen = sizeof(expFct);

//The next strings are 0x0140 bytes further than the EXPFCTADDR

DWORD BASEXPSTRINGADDR = 0x5611d0;
char baseXpString[] = "Base level exp: %d / %d";
int baseXpStringLen = sizeof(baseXpString);

DWORD JOBXPSTRINGADDR = 0x5611f0;
char jobXpString[] = "Job level exp: %d / %d";
int jobXpStringLen = sizeof(jobXpString);

DWORD GAINEDXPSTRINGADDR = 0x561210;
char gainedXpString[] = "You gained %d base exp and %d job exp from the last monster killed";
int gainedXpStringLen = sizeof(gainedXpString);

//Buffer to work with is 0x80 bytes further than the GAINEDSTRINGADDR

//Print msg routine
DWORD PRINTMSGADDR = 0x561190;
BYTE printMsg[] = {0x8b,0xec,0x8b,0x55,0x04,0x8b,0x45,0x08,0x6a,0x00,0x50,0x52,0x6a,0x01,0xb9,0x28,
		   0x1e,0x56,0x00,0xb8,0xb0,0xe3,0x47,0x00,0xff,0xd0,0xc2,0x08,0x00};
int printMsgLen = sizeof(printMsg);

//Reset backup HP/SP
DWORD RESETMEM1ADDR = 0x561070;
DWORD RESETMEM2ADDR = 0x561080;
BYTE resetMem[16] = {0x00};
int resetMemLen = sizeof(resetMem);

TECHNOLOGIES

  • C++
  • UI Modding
  • Memory Patching
int03h.com circa 2002 RO-SHOW-IT(6)