通信内容の書き換えに挑戦!パケット書き換えSDK 第一回
こんにちは!code_zeroです。今回はいよいよパケット書き換えをやっていきます。パケット書き換えだけではなく、接続のブロックなどいろいろな使い方が出来ますよ〜。
パケットというのは、あて先情報などが記載されたネットワーク通信の最小単位のことで、この場合はIPパケットです。ただ、実際はアプリケーション TCPIP通信を書き換えます。このほうがデバイスドライバも不要ですし、通信の検出がカンタンなので便利です。ただ、ユーザーモードで動作するので、ゲームによってはうまくやらないと検出されてしまいます。
今回はWinsock2をターゲット環境とします。以下のような感じで6つのAPIをフックすれば大抵大丈夫です。では、次回からさっそくやってみましょう!
Hook(WINSOCK2DLL,’send’, @sendHookProc, @sendNextHook);
Hook(WINSOCK2DLL,’sendto’, @sendtoHookProc, @sendtoNextHook);
Hook(WINSOCK2DLL,’recv’, @recvHookProc, @recvNextHook);
Hook(WINSOCK2DLL,’recvfrom’, @recvfromHookProc, @recvfromNextHook);
Hook(WINSOCK2DLL,’WSASend’, @WSASendHookProc, @WSASendNextHook);
Hook(WINSOCK2DLL,’WSARecv’, @WSARecvHookProc, @WSARecvNextHook);
あと二回信の書き換えの話題を扱って、その次の回からはまた初心者向けの内容に戻ります!
[hr /]
通信内容の書き換えに挑戦!パケット書き換えSDK 第ニ回
こんにちは!code_zeroです。今回も引き続きパケット書き換えの話題です。
パケット書き換えSDKは次のゴーストリプレイのバージョンに付属しています。以下の様に主要メソッドをフックして、接続先の取得も行うコードが実装されているので、後はロジックを組み込むだけです。VC++の場合もIUnknownを継承したインターフェイスを宣言することで、プラグインを作成できます。 C++のサンプルも準備中です。
プラグインを起動したプロセス、具体的にはゴーストリプレイから起動させたゲームでのみ動作するので、他の方法よりはかなり簡単にパケットを書き換えられます。
function sendHookProc(s: TSocket; Buf : Pointer; Len, Flags: Integer): Integer; stdcall;
var saddr : TSockAddrIn; slen : Integer;
begin
if Len > 0 then begin
sLen := sizeof(TSockaddrIn);
if GetPeerName(s, saddr, sLen) = 0 then begin
//接続先がわかった
//Bufがデータのポインタ 必要に応じて書き換える
end;
end;
//元々のWinsockメソッドを呼ぶ
Result := sendNextHook(s, Buf, Len, Flags);
end;
次回から初心者の方向けの企画に戻ります
[hr /]
今回は実際にパケット書き換えを行ってみましょう!
今回はグーグルのホームページのGoogleという表記をGoggleに変えます!サイトのリンクも変わってしまうので、ホームページは正常に動作しなくなるのですが、通信を書き換えられるサンプルとしてご紹介します。まずは画像をみてください
goggle
こんなことができちゃいます。今回は受信するデータを書き換えていますが、同様に送信するデータも変更できますよ!! データの送信にはAPIがいくつかあるので、それらの内部から共通して呼び出すためのメソッドをまずは用意します。今回利用するプログラミングはDelphi 7以降です。APIを呼び出しているだけですので、C++でも同様に作成できます。
procedure PerformReceiveHook(Buf : Pointer; Len:integer;var saddr : TSockAddrIn);
var i:integer;
p:pbyte;
const
sgoogle:pchar=’google’;sgoggle:pchar=’goggle’;
sgoogle2:pchar=’Google’;sgoggle2:pchar=’Goggle’;
begin
if len<6 then exit;
p:=buf;
for i:=0 to Len-6 do begin
if CompareMem(p,sgoogle,6) then
CopyMemory(p,sgoggle,6)
else if CompareMem(p,sgoogle2,6) then
CopyMemory(p,sgoggle2,6);
inc(p);
end;
end;
これで書き換える処理ができました。あとはこれを以下のようにフック関数の中に入れていくだけです。完成したものはゴーストリプレイの次回のアップデートパッチ、SDKフォルダに入っているので、それを見てみてくださいね。
Size := recvNextHook(s, Buf, Len, Flags);//本来のAPI
if Size > 0 then begin
// figure out the ip and port for the communication
sLen := sizeof(TSockaddrIn);
if GetPeerName(s, saddr, sLen) = 0 then begin
//接続先が取得できた
PerformReceiveHook(Buf,Size,saddr);
end;
end;
Result := Size;
次回からは初心者育成企画です。プログラミング環境の構築から行っていきます。お楽しみに!!
[hr /]
http://www.internal.co.jp/products/util/ghostreplay/magazine/files/055.html