他人の空似自作物置場

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;
}