仮想世界改変報告書。

if(byte[fs:[0x30] + 2] != 0){"DIE!!!"}

Delphiでチートコード実行(蜜柑)

CodeExec(
hProcess: THandle; //ターゲットプロセスのハンドル
Code: string //「Address-Value」形式のチートコード
);


procedure CodeExec(hProcess: THandle; Code: string);
const
SNotFoundHyphenCode = 'コードからハイフンが見つかりません';
SNotHexAddress = 'アドレス ''%s'' は16進数ではありません';
SNotHexValue = '値 ''%s'' は16進数ではありません';
SDigitIsOddValue = '値 ''%s'' は偶数桁ではありません';
STooLongDigitAddress = 'アドレス ''%s'' は8桁以内ではありません';
SEmptyAddress = 'アドレスが空です';
SEmptyValue = '値が空です';
SBadAccessAddress = 'アドレス ''%p'' には書き込めません';
SInvalidAddress = 'アドレス ''%p'' のアクセス保護の状態を変更できません';
var
HyphenPos, ValueLength, E: Integer;
_Addr, _Value: string;
Addr: Pointer;
Value: array of Byte;
Dummy: Cardinal;
begin
//ハイフン検索
HyphenPos := AnsiPos('-', Code);
if HyphenPos = 0 then
raise Exception.Create(SNotFoundHyphenCode);

//アドレス処理
//16進数8桁以内
if HyphenPos = 1 then
raise Exception.Create(SEmptyAddress);
_Addr := Copy(Code, 0, HyphenPos - 1);
if Length(_Addr) > 8 then
raise Exception.CreateFmt(STooLongDigitAddress, [_Addr]);
Val('$'+_Addr, DWORD(Addr), E);
if E <> 0 then
raise Exception.CreateFmt(SNotHexAddress, [_Addr]);

//値処理
if HyphenPos = Length(Code) then
raise Exception.Create(SEmptyValue);
_Value := Copy(Code, HyphenPos + 1, Length(Code));
if Odd(Length(_Value)) then
raise Exception.CreateFmt(SDigitIsOddValue, [_Value]);
SetLength(Value, Length(_Value) div 2);
ValueLength := Length(Value);
if HexToBin(PChar(_Value), PChar(Value), ValueLength) <> ValueLength then
raise Exception.CreateFmt(SNotHexValue, [_Value]);

//メモリ書き込み処理
if not VirtualProtectEx(hProcess, Addr, ValueLength, PAGE_EXECUTE_READWRITE, Dummy) then
raise Exception.CreateFmt(SInvalidAddress, [Addr]);
if not WriteProcessMemory(hProcess, Addr, @Value[0], ValueLength, Dummy) then
raise Exception.CreateFmt(SBadAccessAddress, [Addr]);
end;


名無しさん多謝

次は複数行文字列の処理とか書きたい。
でも改行コードって\r\n、\r、\n(Delphiでは#10#13、#10、#13)の3種類があるから、そこら辺も考えないとナ。

コメント

逆になってね?rが#13でnが#10。
改行で分割するのはTStringList.Textにぶち込めば一発だよ。改行コードがどれでも勝手に判別してくれたと思う。

  • 2009/01/14(水) 20:03:11 |
  • URL |
  • anonymous #-
  • [ 編集]

調べてみたけどホントだった/(^o^)\
今まで#10#13って書いてたよ。

TStringListって便利だなぁ。
ちょっと処理を加えただけで複数行のコードに対応してしまった。
でも、TStringList.Strings[Num]プロパティは変数じゃないから、参照渡しの引数(を含む関数)に直接渡せないのが残念。

  • 2009/01/16(金) 05:43:23 |
  • URL |
  • selen #-
  • [ 編集]

プロパティは単に関数呼び出しをラップしてるだけだしね
TStringListは内部でstringのリスト持ってそれ返してるだけだけど、
クラスによってはプロパティ呼んだ瞬間に文字列生成してるものもあるだろうし、
そういう場合は直接渡せたらまずいことになる

でもそんなに困る場面ってない気がするな
例えばどんな場面で残念なことになるの?

  • 2009/01/16(金) 19:47:12 |
  • URL |
  • anonymous #-
  • [ 編集]

Delete手続きとかに渡す時、新しく変数を用意して、それに代入してから渡し、またStrings[]に戻せばいいのは分かるけど
なんだか二度手間のような気がして。
変数の宣言が比較的メンドクサイDelphiでは、出来るだけ変数の数は抑えたいと言う気持ちがあるんです。

  • 2009/01/17(土) 21:23:07 |
  • URL |
  • selen #-
  • [ 編集]

その場合はStuffString使うとか。
それかそういう関数を定義して自作ライブラリに入れておくみたいな対応でもいいんじゃない?
TStringListが持ってるstringの実体を取り出す裏技みたいなのもあるにはあるけど。

  • 2009/01/19(月) 01:34:17 |
  • URL |
  • anonymous #-
  • [ 編集]

StuffStringにそんな使い方があるとはw
自作ライブラリは使用する手続き毎に作成するしかないみたいだし、Strings[]にあんな事やこんな事いろいろしたい場合は、素直に変数を用意した方が手っ取り早そうだね。

  • 2009/01/19(月) 17:38:24 |
  • URL |
  • selen #-
  • [ 編集]

コメントの投稿



スパム対策により「http://」を禁止ワードにしています。
URLを貼る場合は先頭の h を抜くなりしてください。
例:ttp://example.com
管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://asernobody.blog68.fc2.com/tb.php/841-4a55e277
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

FC2ブログ 一戸建て