forked from KolibriOS/kolibrios
- GameHack 0.1 alpha
git-svn-id: svn://kolibrios.org@8507 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
d3ab9923c4
commit
c45b7e611a
16
programs/other/GameHack/Makefile
Executable file
16
programs/other/GameHack/Makefile
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
KTCC_DIR=../../develop/ktcc/trunk
|
||||||
|
|
||||||
|
NAME=gamehack
|
||||||
|
|
||||||
|
KTCC=$(KTCC_DIR)/bin/kos32-tcc
|
||||||
|
KPACK=kpack
|
||||||
|
|
||||||
|
SRC=gh_shell.c
|
||||||
|
CFLAGS=-I $(KTCC_DIR)/libc/include
|
||||||
|
LIBS = -lck
|
||||||
|
|
||||||
|
all:
|
||||||
|
$(KTCC) $(CFLAGS) $(SRC) $(LIBS) -o $(NAME)
|
||||||
|
$(KPACK) $(NAME)
|
||||||
|
clean:
|
||||||
|
rm $(NAME)
|
72
programs/other/GameHack/gh_core.c
Normal file
72
programs/other/GameHack/gh_core.c
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
int PID=-1;
|
||||||
|
|
||||||
|
int kdebugger_write(unsigned ID, unsigned n, unsigned addr, unsigned* buff)
|
||||||
|
{
|
||||||
|
int num;
|
||||||
|
__asm__ __volatile__(
|
||||||
|
"int $0x40"
|
||||||
|
:"=a"(num)
|
||||||
|
:"a"(69), "b"(7), "c"(ID), "d"(n),"S"(addr),"D"(buff)
|
||||||
|
);
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
int kdebugger_read(unsigned ID, unsigned n, unsigned addr, unsigned* buff)
|
||||||
|
{
|
||||||
|
int num;
|
||||||
|
__asm__ __volatile__(
|
||||||
|
"int $0x40"
|
||||||
|
:"=a"(num)
|
||||||
|
:"a"(69), "b"(6), "c"(ID), "d"(n),"S"(addr),"D"(buff)
|
||||||
|
);
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
void kdebugger_pause(unsigned ID)
|
||||||
|
{
|
||||||
|
__asm__ __volatile__(
|
||||||
|
"int $0x40"
|
||||||
|
::"a"(69), "b"(4), "c"(ID)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void kdebugger_play(unsigned ID)
|
||||||
|
{
|
||||||
|
__asm__ __volatile__(
|
||||||
|
"int $0x40"
|
||||||
|
::"a"(69), "b"(5), "c"(ID)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void kdebugger_disconnect(unsigned ID)
|
||||||
|
{
|
||||||
|
__asm__ __volatile__(
|
||||||
|
"int $0x40"
|
||||||
|
::"a"(69), "b"(3), "c"(ID)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
int load_game(char *app_name, char *args)
|
||||||
|
{
|
||||||
|
#pragma pack(push, 1)
|
||||||
|
struct file_op_t
|
||||||
|
{
|
||||||
|
unsigned fn;
|
||||||
|
unsigned flags;
|
||||||
|
char* args;
|
||||||
|
unsigned res1, res2;
|
||||||
|
char zero;
|
||||||
|
char* app_name __attribute__((packed));
|
||||||
|
} file_op;
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
memset(&file_op, 0, sizeof(file_op));
|
||||||
|
file_op.fn = 7;
|
||||||
|
file_op.flags = 1;
|
||||||
|
file_op.args = args;
|
||||||
|
file_op.app_name = app_name;
|
||||||
|
|
||||||
|
register int val;
|
||||||
|
asm volatile ("int $0x40":"=a"(val):"a"(70), "b"(&file_op));
|
||||||
|
return val;
|
||||||
|
}
|
96
programs/other/GameHack/gh_shell.c
Normal file
96
programs/other/GameHack/gh_shell.c
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
#include <conio.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <kos32sys1.h>
|
||||||
|
#include "gh_core.c"
|
||||||
|
|
||||||
|
#define CMD_LEN 255
|
||||||
|
#define TITLE "GameHack 1.0 ALPHA "
|
||||||
|
|
||||||
|
char cmd_line[CMD_LEN];
|
||||||
|
char cmd_line_tmp[CMD_LEN];
|
||||||
|
|
||||||
|
void notify_show(char *text)
|
||||||
|
{
|
||||||
|
start_app("/sys/@notify", text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmd_processing()
|
||||||
|
{
|
||||||
|
strcpy(cmd_line_tmp, cmd_line);
|
||||||
|
char *cmd = strtok(cmd_line_tmp, " \n");
|
||||||
|
if(!strcmp(cmd, "pause")){
|
||||||
|
kdebugger_pause(PID);
|
||||||
|
}
|
||||||
|
else if(!strcmp(cmd, "play")){
|
||||||
|
kdebugger_play(PID);
|
||||||
|
}
|
||||||
|
else if(!strcmp(cmd, "exit")){
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if(!strcmp(cmd, "write")){
|
||||||
|
unsigned addr=0;
|
||||||
|
int val =0;
|
||||||
|
if(sscanf(cmd_line, "%s %x %d %d",cmd_line, &addr, &val, &val)==3){
|
||||||
|
if(kdebugger_write(PID, sizeof(int), addr, &val)==-1){
|
||||||
|
puts("Memory write error!");
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
puts("Invalid arguments!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(!strcmp(cmd, "read")){
|
||||||
|
unsigned addr=0;
|
||||||
|
int val =0;
|
||||||
|
if(sscanf(cmd_line, "%s %x %x",cmd_line, &addr, &addr)==2){
|
||||||
|
if(kdebugger_read(PID, sizeof(int), addr, &val)==-1){
|
||||||
|
puts("Memory read error!");
|
||||||
|
}
|
||||||
|
printf("0x%.8X: %d\n", addr, val);
|
||||||
|
}else{
|
||||||
|
puts("Invalid arguments!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
else if(!strcmp(cmd, "help"))
|
||||||
|
{
|
||||||
|
puts("Commands:");
|
||||||
|
puts(" write [addres] [value] - Write DWORD value by address.");
|
||||||
|
puts(" read [addres] [value] - Read DWORD value by address.");
|
||||||
|
puts(" pause - Suspend the game (process)." );
|
||||||
|
puts(" play - Resume running the game(process).");
|
||||||
|
puts(" find [value] - Search for DWORD value in memory(VIP).");
|
||||||
|
}
|
||||||
|
else if(!strcmp(cmd, "find"))
|
||||||
|
{
|
||||||
|
puts("Not yet implemented ...");
|
||||||
|
}
|
||||||
|
else if(cmd != NULL){
|
||||||
|
puts("Unknown command!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
if (argc!=2 ){
|
||||||
|
notify_show("'No game selected!' -E");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
con_init_console_dll();
|
||||||
|
con_set_title(TITLE);
|
||||||
|
PID = load_game(argv[1], NULL);
|
||||||
|
PID = 2;
|
||||||
|
if(PID<0){
|
||||||
|
notify_show("'Game not loaded!' -E");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
kdebugger_play(PID);
|
||||||
|
while (1){
|
||||||
|
printf("GameHack> ");
|
||||||
|
con_gets(cmd_line, CMD_LEN);
|
||||||
|
cmd_processing();
|
||||||
|
memset(cmd_line, '\n', CMD_LEN);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user