#include "stdafx.h" #include #include #include static char *m_cDQ1Table="あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわがぎぐげござじずぜぞだぢづでどばびぶべぼ"; static char *m_cDQ2Table="あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわがぎぐげござじずぜぞばびぶべぼぱぴぷぺぽ"; // 現在emuhaste本体で処理しているエラーコードは以下の3種 #define PROCESS_ID_UNDEFINED 1 // IDが見つからない(Snapしていない) #define CODE_COUNT_ZERO 2 // コードが1つも実行されていない(未入力) #define PROCESS_LOST 3 // SnapしたけどプロセスIDが見つからない // *CodeTyp: より後ろの文字列に改造コードツールの名前(PS2PARとかARDSとかを入れる) // *Comment: より後ろの文字列に作者コメントとか詳細を書く。1行あたり25文字×3行までを推奨 static char m_cCodeTyp[]="*CodeTyp:Password engine"; static char m_cComment[]="*Comment:Password engine Ver1.00\r\nDLL拡張=nothing"; // ENGINETYPE 2。文字列を丸ごと渡すCheatEngine2です。 int EngineType(){ return 2; } // 通常のチートエンジンは即0を返すようにしておく。 int CheatEngine(unsigned long m_ProcessID, // プロセスID unsigned long m_ulRealStartAddress, // プロセスの基準となるベース開始アドレス unsigned long m_ulVirtualStartAddress, // emuhasteのヘキサビューワの開始アドレス unsigned long m_ulCodeCount, // 入力された改造コードの数 unsigned long m_ulWriteAddress[], // 改造コードのアドレス配列 unsigned long m_ulWriteParam[], // 改造コードのパラメータ配列 unsigned char m_ucAdvancedCheck){ // DLL拡張チェックの値(チェック=1) return 0; } // チートエンジン2。コードエンジン枠そのものを処理する。 int CheatEngine2(unsigned long m_ProcessID, // プロセスID unsigned long m_ulRealStartAddress, // プロセスの基準となるベース開始アドレス unsigned long m_ulVirtualStartAddress, // emuhasteのヘキサビューワの開始アドレス char *code_ptr, // 改造コードエディタのテキスト情報 unsigned char m_ucAdvancedCheck){ // DLL拡張チェックの値(チェック=1) unsigned long i=0; int iTitleID=0; char cTitle[256],*cPassPtr,cPassWord=0,cPassTemp[256]; HANDLE hnd; LPVOID lpAddress; if(m_ProcessID==0) return PROCESS_ID_UNDEFINED; // プロセスIDが0のときはリターン // プロセスを開く hnd = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, false,m_ProcessID); if(hnd==NULL){ CloseHandle(hnd); return PROCESS_LOST; // IDがあるのにプロセスが開けないときはリターン } // タイトル抽出 for(i=0;i<=(unsigned)strlen(code_ptr);i++) if(code_ptr[i]==0x0D) break; code_ptr[i]='\0'; strcpy(cTitle,code_ptr); code_ptr = code_ptr + i + 2; // アドレスを抽出 //for(i=0;i<=(unsigned)strlen(code_ptr);i++) if(code_ptr[i]==0x0D) break; //code_ptr[i]='\0'; //ulWriteAddress = strtoul(code_ptr,NULL,16); //code_ptr = code_ptr + i + 2; // タイトルによって処理系を分類 if(strcmp(cTitle,"DRAGONQUEST1")==0 || strcmp(cTitle,"DQ1")==0) iTitleID=1; if(strcmp(cTitle,"DRAGONQUEST2")==0 || strcmp(cTitle,"DQ2")==0) iTitleID=2; // メインのパスワード書き換えルーチン switch(iTitleID){ default: // 未対応タイトルはコード無しとしてリターンさせる case 0: CloseHandle(hnd); return CODE_COUNT_ZERO; case 1: // ドラクエ1 for(i=0;i<20;i++){ // 改行コードを除去してから進行する if(code_ptr[0] == 0x0D) code_ptr+=2; if(code_ptr[1] == 0x0A) code_ptr+=1; cPassTemp[0] = code_ptr[0]; cPassTemp[1] = code_ptr[1]; cPassTemp[2] = '\0'; // 終端文字を発見したら脱出 if(cPassTemp[0]==0x00 || cPassTemp[0]=='*' || strcmp(cPassTemp,"*")==0) break; cPassPtr = strstr(m_cDQ1Table,cPassTemp); cPassWord = (cPassPtr - m_cDQ1Table)/2; code_ptr = code_ptr + 2; lpAddress = (LPVOID)(DWORD)(0x1A + i + m_ulRealStartAddress-m_ulVirtualStartAddress); WriteProcessMemory(hnd,lpAddress,&cPassWord,1,NULL); } case 2: // ドラクエ2 for(i=0;i<52;i++){ // 改行コードを除去してから進行する if(code_ptr[0] == 0x0D) code_ptr+=2; if(code_ptr[1] == 0x0A) code_ptr+=1; cPassTemp[0] = code_ptr[0]; cPassTemp[1] = code_ptr[1]; cPassTemp[2] = '\0'; // 終端文字を発見したら脱出 if(cPassTemp[0]==0x00 || cPassTemp[0]=='*' || strcmp(cPassTemp,"*")==0) break; cPassPtr = strstr(m_cDQ2Table,cPassTemp); cPassWord = (cPassPtr - m_cDQ2Table)/2; code_ptr = code_ptr + 2; lpAddress = (LPVOID)(DWORD)(0x663 + i + m_ulRealStartAddress-m_ulVirtualStartAddress); WriteProcessMemory(hnd,lpAddress,&cPassWord,1,NULL); } cPassWord = i-1; lpAddress = (LPVOID)(DWORD)(0xC4 + m_ulRealStartAddress-m_ulVirtualStartAddress); WriteProcessMemory(hnd,lpAddress,&cPassWord,1,NULL); break; } CloseHandle(hnd); return 0; }