rep2prof.zip/rep2prof.c
#include <windows.h>
#include <stdio.h>
#include <time.h>
HANDLE ph;
int seen,mode;
char prof1[20],prof2[20];
int s_win,c_win,s_char,c_char,s_hp,c_hp,s_rei,c_rei,s_rmax,c_rmax;
float x,ex,y,ey;
char *id2char(int id){
static char db[][11] = {
{"霊夢"},{"魔理沙"},{"咲夜"},{"アリス"},
{"パチュリー"},{"妖夢"},{"レミリア"},{"幽々子"},
{"紫"},{"萃香"},{"優曇華"},{"文"},
{"小町"},{"衣玖"},{"天子"}};
return db[id];
}
void rep2profmode(void){
static void *fn = NULL;
void *fnp;
time_t timer;
struct tm *t_st;
char str[256],code[20];;
time(&timer);
t_st = localtime(&timer);
sprintf(str,"replay/%02d%02d%02d_%02d%02d_%s(%s)_%s(%s).rep",t_st->tm_year%100,t_st->tm_mon+1,t_st->tm_mday,t_st->tm_hour,t_st->tm_min,prof1,id2char(s_char),prof2,id2char(c_char));
ReadProcessMemory(ph,(void *)0x004282BA,&fnp,4,NULL);
if((int)fnp != 0x40000000){
fn = (void *)((int)fnp+0x004282BE);
} else if(fn == NULL){
fn = (void *)VirtualAllocEx(ph,NULL,strlen(str)+15+1,MEM_COMMIT,PAGE_READWRITE);
code[0] = 0x68;
*(int *)&code[1] = 0x40000000;
code[5] = 0x68;
*(int *)&code[6] = (int)fn+15;
code[10] = 0xe9;
*(int *)&code[11] = 0x004282BF-((int)fn+15);
WriteProcessMemory(ph,fn,(void *)code,15,NULL);
}
WriteProcessMemory(ph,(void *)((int)fn+15),(void *)str,strlen(str)+1,NULL);
if(fnp != fn){
code[0] = 0xe9;
*(int *)&code[1] = (int)fn-0x004282BE;
WriteProcessMemory(ph,(void *)0x004282B9,(void *)code,5,NULL);
}
}
void repmodereset(void){
void *fnp;
unsigned char code[7];
ReadProcessMemory(ph,(void *)0x004282BA,&fnp,4,NULL);
if((int)fnp == 0x40000000)return;
VirtualFreeEx(ph,fnp,0,MEM_RELEASE);
code[0] = 0x68;
*(int *)&code[1] = 0x40000000;
code[5] = 0x50;
WriteProcessMemory(ph,(void *)0x004282B9,(void *)code,6,NULL);
}
HANDLE GetProcessHandle(void){
HWND wh;
DWORD pid;
SetConsoleTitle("緋想天を検索しています");
while(1){
Sleep(1000);
wh = FindWindow("th105_102","東方緋想天 Ver1.02");
if(wh == NULL)continue;
pid = 0;
GetWindowThreadProcessId(wh,&pid);
if(pid == 0)continue;
ph = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
if(ph == 0)continue;
return ph;
}
}
void title_message(void){
unsigned int root,l,r;
char str[256] = "",s[256];
switch(seen){
case 0x00:
SetConsoleTitle("starting");
break;
case 0x01:
SetConsoleTitle("OP Movie");
break;
case 0x02:
if(mode != seen)repmodereset();
SetConsoleTitle("Start Menu");
break;
case 0x03:
SetConsoleTitle("Character Select");
break;
case 0x06:
case 0x0a:
case 0x0b:
case 0x0c:
SetConsoleTitle("少女祈祷中");
break;
case 0x0f:
SetConsoleTitle("少女観戦中");
break;
case 0x05:
SetConsoleTitle("Battle");
break;
case 0x0d:
case 0x0e:
ReadProcessMemory(ph,(void *)0x006D7224,&root,4,NULL);
ReadProcessMemory(ph,(void *)(root+0x0c),&l,4,NULL);
ReadProcessMemory(ph,(void *)(l+0x4E4), &s_win,1,NULL);
ReadProcessMemory(ph,(void *)(root+0x10),&r,4,NULL);
ReadProcessMemory(ph,(void *)(r+0x4E4), &c_win,1,NULL);
ReadProcessMemory(ph,(void *)0x006D7FD0,&s_char,4,NULL);
ReadProcessMemory(ph,(void *)0x006D7FF0,&c_char,4,NULL);
if(mode != seen)rep2profmode();
strcpy(s,"Net %s(%s:%d) VS %s(%s:%d) ");
sprintf(str,s,prof1,id2char(s_char),s_win,prof2,id2char(c_char),c_win);
SetConsoleTitle(str);
break;
case 0x08:
case 0x09:
if(s_win==2 || c_win==2){
if(seen == 0x08){
sprintf(s,"%s\t%s\t%d\t%d\t%d\t%d\n",prof1,prof2,s_char,c_char,s_win,c_win);
} else {
sprintf(s,"%s\t%s\t%d\t%d\t%d\t%d\n",prof2,prof1,c_char,s_char,c_win,s_win);
}
s_win = c_win = 0;
}
ReadProcessMemory(ph,(void *)0x006D72DC,&root,4,NULL);
root += 0x04;
ReadProcessMemory(ph,(void *)root,&prof1,20,NULL);
root += 0x20;
ReadProcessMemory(ph,(void *)root,&prof2,20,NULL);
strcpy(s,"Net %s VS %s ");
if(seen == 0x08)strcat(s,"(Server)");
if(seen == 0x09)strcat(s,"(Client)");
sprintf(str,s,prof1,prof2);
SetConsoleTitle(str);
break;
case 0x10:
SetConsoleTitle("Scenario Select");
break;
case 0x14:
SetConsoleTitle("Scenario Ending");
break;
default:
sprintf(s,"Unknown Seen(0x%02x)",seen);
SetConsoleTitle(s);
break;
}
mode = seen;
}
main(){
unsigned int root,base1,base2,count,temp;
int time,time2;
ph = GetProcessHandle();
seen = mode = 0;
s_win = c_win = 0;
s_hp = c_hp = 0;
s_rei = c_rei = 0;
s_rmax = c_rmax = 0;
while(1){
if(0 == ReadProcessMemory(ph,(void *)0x006DDE08,&seen,1,NULL)){
ph = GetProcessHandle();
}
switch(seen){
case 0x05:
case 0x0d:
case 0x0e:
ReadProcessMemory(ph,(void *)0x006D721C,&root,4,NULL);
ReadProcessMemory(ph,(void *)(root+0x28),&base1,4,NULL);
ReadProcessMemory(ph,(void *)(root+0x2C),&base2,4,NULL);
if(base2 != 0){
ReadProcessMemory(ph,(void *)(base1+0xEC),&x,4,NULL);
ReadProcessMemory(ph,(void *)(base2+0xEC),&ex,4,NULL);
ReadProcessMemory(ph,(void *)(base1+0xF0),&y,4,NULL);
ReadProcessMemory(ph,(void *)(base2+0xF0),&ey,4,NULL);
ReadProcessMemory(ph,(void *)(base1+0x174),&s_hp,2,NULL);
ReadProcessMemory(ph,(void *)(base2+0x174),&c_hp,2,NULL);
ReadProcessMemory(ph,(void *)(base1+0x482),&s_rei,2,NULL);
ReadProcessMemory(ph,(void *)(base2+0x482),&c_rei,2,NULL);
ReadProcessMemory(ph,(void *)(base1+0x484),&s_rmax,2,NULL);
ReadProcessMemory(ph,(void *)(base2+0x484),&c_rmax,2,NULL);
} else {
break;
}
break;
}
title_message();
Sleep(1000);
}
CloseHandle(ph);
return 0;
}