おもちゃバコ

中身スカスカ♡

「HTML+JavaScriptによるプログラミング入門」を読んだ

こんにちは

「HTML+JavaScriptによるプログラミング入門」を読んだ感想/備忘録です。



書籍

2018年5月21日に発行された第2版を読みました。

対象

HTML5(CSS)/JavaScriptを初めて学ぶ人向けで,大学の教科書っぽい文体です。
必要な内容だけを簡潔にまとめてあり,(自分は)とても読みやすかったです。

フレームワーク的なのは利用しないので,今時のイケイケ感を期待している人には向かないかも。
HTMLとJavaScriptの基礎をサクサク学びたい人向け。


メモ

基本的に雑。
JavaScript部分はほとんど省略してるかも

第1部 HTML編

Webとは
  • CERNを含めたHTMLの歴史
HTMLの基礎知識
  • タグや属性などのHTMLの基本解説
  • XHTMLではタグは小文字
  • titleタグはhead部に必須
よく使うタグ
  • 光を重ねて色を作る方法は加算混合
  • 色フィルタを重ねて色を作る方法は減算混合
  • 加算混合の3原色はRGB
  • 減算混合の3原色はCMY
  • 環境によらず表示できる216色はWebセーフカラー
  • lintで構文誤りチェックをするのがよい
スタイルシート

第2部 JavaScript

JavaScriptとは
プログラミングの話題
  • テストする処理を呼び出すのがテスト・ドライバ
  • テストの代役がテスト・スタブ
オブジェクト
  • classを基礎としたオブジェクトの扱いをクラスベース
  • JavaScriptはプロトタイプベース
オブジェクト・モデル
  • ブラウザ情報に関するモデルはBrowser Object Model
  • ブラウザによって挙動が異なるのはクロス・ブラウザ問題
  • HTMLなどで書かれた文章を表すモデルはDocument Object Model
  • jQueryJavaScriptから呼び出せる便利ライブラリ
グラフィックスのプログラム
  • ドラゴン曲線
  • シェルピンスキーの三角形
  • リサジュー図形

感想

なんとなくHTML5(CSS)とJavaScriptを学んどくか~って感じで読み始めました。
必要最低限の知識を簡潔にまとめてあり,サクサク読めたので良かったです。

そのうち趣味で何か作りたいと思います。



JavaScriptでゲームを開発する環境を考えてみた

こんにちは

HTML5/CSSJavascriptでゲーム開発する方法を個人的にまとめてみました。

ちなみにWeb系の知識はほとんどないです。


動機

UnityやUE5よりお手軽にゲームを開発出来る環境を模索したかった。
ゲームエンジンは便利だけど,インストールに時間がかかることやPCスペックが要求されるからね...

DirectXやVulkanはライブラリの用意で力尽きそうだし...


あくまで自分用なので,そこんとこよろしく。

開発環境

Web系の開発でよく使用されるツールが分からない。
とりあえずVSCodeを使用しとけば問題なさそう。

ブラウザは常用しているVivaldiでいく。

VSCodeプラグイン

Live Serverはお手軽にローカルサーバを立てられるやつ。
Edgeのプラグインと組み合わせるといい感じになる。

VSCodeVimとVSCode Neovimはどちらか選択。
(vimを使わない人には関係ない)

とりあえずHTML5/CSSJavascriptのsyntaxなどはデフォルトで行く。
必要性を感じた時に何か入れたいと思います。

ライブラリ

最近のブラウザはローカルファイルに対するアクセス制限が強力っぽい。
Live Serverなどを使用してローカルサーバ上で開発していくのが良さそう。

チュートリアル

日本語は無さそうだね。


キャラ絵

SEやBGMは無理だけど,キャラチップとかの絵は頑張りたい。
MSPaintは最終手段にしたい。

昔々に購入した本を参考に頑張ってみる。

基本は8x8で,主要キャラクタは16x16の省エネ体制で頑張りたいと思います。

サウンド

SEとかBGMを一括りにすると怒られそうな気がする...

超有名な最強の音楽配信サイト。
利用規約をよく読んでから利用しようね。

作曲に入門したい人におススメの本を紹介します。


昔々の研修でDesktop Music (DTM)に入門したのですが,素人の自分でもそれっぽいBGMが作れました。
何より挫折しにくいのが良かった。

Unity Asset Store

Unityには頭が上がらない。

Unityは利用しないけど,Unity Asset Storeは積極的に利用したい。
Unity以外でも使用可能っぽい (2023年7月31日現在)

公開先の候補

Github Pagesとitch.ioは無料(利用方法による)でいけるっぽい (2023年7月31日現在)
Steamは無料公開でも掲載料がかかるみたい (2023年7月31日現在)

作品を公開したい場合は,事前に公開先のテストを済ませておくとよいかも。
開発後に掲載できない事が判明したら悲しいからね。

アップロードできる形式も確認しよう。
itch.ioならUnity5.3以下っぽい(?)とかとか。
プロジェクトの種類を選べばよさそう。
そもそもUnity5.3ってなんだよ。


テスト

CDNってすごい便利だね。

PixiJS/Phaser サンプル

画像とmp3は自力で用意した。

Githubリポジトリ
github.com

VSCodeのLive Serverプラグインすごいね。
感動しちゃった。

Github Pages

こんな感じ。
音が鳴らない理由はわからない。

HELLO, PixiJS
HELLO, Phaser

所感

  • PixiJS: ライブラリを作りながらゲーム開発したい。
  • Phaser: ゲーム開発に注力したい。

PixiJSはSDL,PhaserはUnityって感じがしました。


感想

Web系に初めて触れてみたけど,開発環境の構築が楽でいいね。
開発環境構築で力尽きる自分には革新的な技術に感じます。

HTML5/CSSJavascriptは全く分かりませんが,何か作ってみたいと思います。
クソゲーでいいから何か作品を公開するのが今年の目標。

unity(jumbo)ビルドについてのメモ

こんにちは

unityビルド(別名: jumboビルド)についての備忘録です。
ゲームエンジンのUnityじゃないよ。


unityビルドとは

unityビルドとは,複数のソースコードを1つのソースコードにまとめ,翻訳単位毎に生成されるオブジェクトファイルの数を減らすことでコンパイルを高速化する手法です。
近頃はゲームエンジンのUnityと区別するためJumboビルドやUnifiedビルドとも呼ばれています。
(個人的にですが)日本語で検索するよりもunity build, jumbo build, unified buildなど,英語で検索した方がunityビルドに関する情報を手に入れやすい気がします。

austinmorlan.com
参考抄録 -> https://dl.acm.org/doi/10.1145/3302516.3307347

Unityビルドは,オープンソースではChromiumやGenntooLinux,ゲームエンジンではUnrealEngine4など,分散ビルドシステムなどの高速ビルド環境を持たない個人環境でコンパイルされることが想定されるプロジェクトで採用されているようです。

chromium.googlesource.com
packages.gentoo.org
historia.co.jp

また,Visual Studioでは,Visual Studio 2017以降でunityビルドに関するオプションが追加されていますね。

devblogs.microsoft.com


利用方法

unityビルドに含めたいソースコードをunityビルド専用のソースコード上でインクルードするだけです。
ポイントは.cppをインクルードすること。


メリット・デメリット

unityビルドのメリット・デメリットとして,以下の要素が考えられます。

メリット

  • オブジェクトファイルの生成にかかるオーバヘッドが減少する。
  • 複数の処理が1つのオブジェクトファイルにまとまるため,unityビルド未使用時よりリンクが高速化される。

デメリット

  • 1つのソースコード上に複数の処理が展開されるため,翻訳単位に含まれる処理を参照・使用できる。
  • 無名名前空間などに定義された変数・関数名が他のソースコードと衝突する可能性がある。
  • 1つのソースコードだけ処理を変更した場合も,翻訳単位に含まれるソースコード全てが再コンパイルされる。
  • 翻訳単位が大きい場合,コンパイル時に使用されるメモリが増大する。
  • 翻訳単位が1つになるため,分散ビルドの恩恵を受けにくい。

unityビルドはコンパイルやリンクなどが高速化されるメリットがありますが,翻訳単位を意識しないで活用すると軽微な修正のはずなのに却ってコンパイル時間が肥大化するなどのデメリットがあります。
特にunityビルドに含まれていればインクルードしていないソースコード中の処理が参照できるため,IntelliSenseの違反検知が正常に動作しないことで無意識にコーディング規約に違反してしまうなど,プロジェクト運用上のリスクが考えられます。

より詳しく知りたい方は各種参考URLを見てね。


まとめ

unityビルドを採用する場合は,メリットだけでなくデメリットにも注意したいですね。

C++: 簡単なホットリロードを実装してみた

ちは

簡単なホットリロードを実装した時の備忘録です。
誇大表現かも


ホットリロードとは

Microsoftの解説を引用します。

アプリケーションのコード ファイルを編集し、そのコード変更を実行中のアプリケーションに対して直ちに適用できるようにすることで、これを実現します ("ホット リロード" とも呼ばれます)。

learn.microsoft.com

自分は「実行中に再ビルド無しに新たな変更を適用すること」ぐらいの認識でいます。
大きく間違ってはないはず...


環境


ざっくり方針

1. DLLのプログラムを作る
 ついでにクラスを利用する方法も考えてみた。

2. DLLを呼び出すプログラムを作る
 プロジェクト設定で.libを利用しないのがポイント。
 あたしゃ動的リンクしたいからね。

当たり前な気がしますが,エンジン部分と実装部分を分離できるのも良いですね。


プロジェクト設定

DLLとそれを動的リンクするプログラムを用意しましょう。
DLLと動的リンクのプログラムは別のソリューションで用意しました。

  • DLL用プログラム
    Bodyと命名しました。
    「構成の種類」を「ダイナミック ライブラリ (.dll)」にするのをお忘れなく。
  • 動的リンク用プログラム
    Engineと命名しました。
    最終的にエンジンを開発したいからね。

こだわりが無ければビルドはx64がおススメ。


DLL: プログラム

IBody.h/Body.h/Body.cppを実装します。
エクスポート関数以外はお好きに。

IBody.h

#ifndef MYLIB_IBODY_H
#define MYLIB_IBODY_H

// インタフェース

namespace mylib
{
    class IBody
    {
    public:
        IBody() {}
        virtual ~IBody() {}
        virtual int Expr(const int num) const = 0;
    };
}

#endif // MYLIB_IBODY_H

Body.h

#ifndef MYLIB_BODY_H
#define MYLIB_BODY_H

// 実装

#include "IBody.h"

namespace mylib
{
    class Body final : public IBody
    {
    public:
        Body();
        ~Body();
        int Expr(const int num) const override;
    };
}

extern "C" __declspec(dllexport) mylib::IBody * GetBodyInstance();

#endif // MYLIB_BODY_H

Body.cpp

#include "Body.h"

#include <memory>

namespace mylib
{
    Body::Body()
    {
    }
    Body::~Body()
    {
    }
    int Body::Expr(const int num) const
    {
        return num * 2;
    }
}

mylib::IBody* GetBodyInstance()
{
    return new mylib::Body{};
}

クラスをエクスポートして使用したかったけど,よく分からないから一般的な方式にしました。
名前マングリングはdumpbin /exports *.dllなどで確認できます。

また,リロードするときにクラスサイズをチェックする必要がある点に注意。
その管理が面倒なのでインタフェースで誤魔化している。

追記: よい記事を見つけました。
ダウンキャストと似た印象を受けました。
qiita.com
www2s.biglobe.ne.jp

再追記: エクスポート関数のファイルも分けると良いですね。

エンジン: プログラム

動的リンクするプログラムを書きます。
そんなに難しくないはず。

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN

#include <iostream>
#include <thread>

// ↓ここ人によるから気を付けてね
#include "../Solution1/Body/IBody.h"

int LoadLib()
{
    // DLLロード
    HMODULE hModule = LoadLibrary(L"Body.dll");
    if (hModule == nullptr) { return -1; } // GetLastError()でエラー確認できる

    // アドレス取得
    using type = mylib::IBody*(*)();
    type func = reinterpret_cast<type>(GetProcAddress(hModule, "GetBodyInstance"));
    if (func == nullptr) { return -1; } // GetLastError()でエラー確認できる

    // 呼び出し: インタフェースを呼び出すことに注意
    mylib::IBody* const pBody = func();
    if (pBody == nullptr) { return -1; }
    const int num = pBody->Expr(100);

    delete pBody;

    // DLLアンロード
    if (FreeLibrary(hModule) == FALSE) { return -1; }
    return num;
}

int main()
{
    // 1回目
    std::cout << LoadLib() << std::endl;

    // Body.dllを差し替える
    // - ビルドするプログラムを書くのが良いけど,面倒なので30秒以内に手動で書き換える。
    std::this_thread::sleep_for(std::chrono::milliseconds(30000));

    // 2回目
    std::cout << LoadLib() << std::endl;

    return 0;
}

エラー時の処理は適当です。
実行するときはDLL用プログラムで作成したBody.dllをバイナリのあるフォルダにコピーしましょう。

本当はBody.dllをビルドして差し替えるプログラムを書けると良かったのですが,気力と能力が無かったので30秒以内に手動で差し替える方針でお茶を濁しました。
Body::Expr()の計算を変えて確かめてみるとリロード出来ていることが分かると思います。

あと,シングルトンなどを実装するときは色々な管理に注意が必要な気がしました。


まとめ

ホットリロードの基礎的なプログラムを実装してみました。
ゲームエンジンなどに実装されているホットリロードはもっと複雑なことをやっていると思いますが,雰囲気は掴めたのでとりあえずはヨシッ!!

プロセスのメモリ領域に書き込んでみた

こんにちは

起動中のプロセスのメモリ領域に任意の数値を書き込んだ時の備忘録です。


環境

注意

ソースコードの実行は自己責任で。
何が起きても知りません。

検証用のテストプログラムを作成して, それ対して実行することを推奨します。


手順

1. プロセスオブジェクトを取得
 OpenProcess()関数ですね。
2. プロセスの仮想アドレス空間のメモリ領域を予約
 VirtualAllocEx()関数を利用します。
 アクセス権として「PROCESS_VM_OPERATION」が必要です。
 lpAddressの引数にnullptrを指定するとこの関数が自動で割り当て領域を決定してくれるそうです。
3. プロセスの予約したメモリ領域にデータを書き込む
 WriteProcessMemory()関数を利用します。
 アクセス権として「PROCESS_VM_WRITE」と「PROCESS_VM_OPERATION」が必要です。

特に難しい要素は無く,概ね予想通りの手順ですね。

書き込むデータはバイト単位です。
floatなどを書き込みたい場合は,キャストで頑張りましょう。

ソースコード

検証用プログラム

メモリを弄られてしまうプログラム君です。

#include <iostream>
int main()
{
    while (true)
    {
        std::cout << "Hello World!" << std::endl;
    }
    return 0;
}

メモリ書き込みプログラム

検証用プログラムのメモリ領域を弄るプログラムです。
検証用プログラムを実行させ,そのプロセスIDを事前に記述しておきましょう。
プロセスIDはタスクマネージャなどから確認できます。

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN

#include <cstdint>

#include <iostream>
#include <string>

int main()
{
    // 書き込みたいプロセスのプロセスID
    const DWORD targetProcessId = 0u;
    // 書き込みたい内容
    const uint8_t writeData[] = "AIUEO=KAKIKUKEKO-123456@";

    // 1. プロセスを取得
    const DWORD flags = PROCESS_VM_OPERATION | PROCESS_VM_WRITE;
    HANDLE processHandle = OpenProcess(flags, /*bInheritHandle=*/FALSE, targetProcessId);
    if (processHandle == nullptr) { std::cerr << GetLastError() << std::endl; return 1; }

    // 2. プロセスのメモリ領域を予約
    LPVOID pAddress = VirtualAllocEx(processHandle, /*lpAddress=*/nullptr, _countof(writeData), MEM_COMMIT, PAGE_READWRITE);
    if (pAddress == nullptr)
    {
        std::cerr << GetLastError() << std::endl;
        CloseHandle(processHandle);
        return 1;
    }

    // 3. メモリ領域に書き込み
    SIZE_T numberOfBytesWritten = 0u; // 転送されたバイト数
    if (WriteProcessMemory(processHandle, pAddress, writeData, _countof(writeData), &numberOfBytesWritten) == FALSE)
    {
        std::cerr << GetLastError() << std::endl;
        CloseHandle(processHandle);
        return 1;
    }

    std::cout << "Success" << std::endl;
    std::cout << "\t" << "Address = " << pAddress << std::endl;
    std::cout << "\t" << "WriteBytes = " << numberOfBytesWritten << std::endl;

    CloseHandle(processHandle);
    return 0;
}

実行手順

1. 検証用プログラムを起動
 無限ループしているはず。
2. メモリ書き込みプログラムを起動
 何事もなければ即終了するはず。
 アドレスの数値をコピーしておく。
3. Visual Studioのデバッガで検証用プログラムのメモリを確認
 コピーしたアドレスのメモリを確認する。

メモリ領域が覗ければ何でも良いです。
こだわりがなければVisual Studioのデバッガを使ったほうが早いです。

デバッグ>ウィンドウ>メモリ>メモリ1~4のどれかを選択。
アドレスにコピーした数値を貼り付け。

確認するときは「すべて中断(Ctr+Alt+Break)」してからね。

実行結果

書き込みプログラム

Success
    Address = 0000019C3B280000
    WriteBytes = 25

検証用プログラムのメモリ領域

0x0000019C3B280000  41 49 55 45 4f 3d 4b 41 4b 49 4b 55 4b 45 4b 4f 2d 31 32 33 34 35 36 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  AIUEO=KAKIKUKEKO-123456@.......................
0x0000019C3B28002F  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ...............................................

書き込めてますね。


まとめ

プロセス間通信が面倒な時に役立つかもと思い,やってみましたがいい感じでした。

任意のコードを書き込んでGetThreadContext()とSetThreadContext()を駆使してレジスタを操作すれば,いろいろ遊べそうだと思いました。
(関数戻りのスタック操作などが面倒で,そんなに単純ではなさそうでした。)

C++: プロセスを取得して色々やってみた

こんにちは

Windowsでプロセスを取得してスナップショットを取ったり,仮想キーコードを送信したりしてみた時の備忘録です。

冗長になりますが,わかりやすさを優先してサンプルのソースコードはエントリポイントから全て記述します。


参考書籍

解析関係の書籍を参考にしました。


開発環境


自己流ですので正確な情報は書籍やMicrosoft公式を確認してください。

プロセスのタイトル名を取得

現在実行されているプロセスのタイトル名を取得してみました。
ここでは,プロセスの取得にEnumWindows関数,タイトル名の取得にGetWindowTextW関数を利用します。

EnumWindows関数

EnumWindows関数はトップレベルのウィンドウハンドルを列挙するために利用されるWin32 APIです。
子ウィンドウはEnumWindows関数では列挙できないので注意してください。

BOOL EnumWindows
(
  [in] WNDENUMPROC lpEnumFunc, // コールバック関数
  [in] LPARAM      lParam      // コールバック関数に渡す任意引数
);

(余談)
EnumWindows関数はマルウェアマルウェア解析のプログラムでよく利用される関数です。
セキュリティソフトによってはEnumWindows関数を使ったプログラムをマルウェア判定することがあります。
https://eset-info.canon-its.jp/malware_info/special/detail/220216_2.html

自分はESETのセキュリティソフトを利用しているのですが,本文中のプログラムをコンパイルする度に生成されるバイナリファイルを自動で削除していました。
Visual StudioからC/C++の最適化設定を色々弄ったらバイナリファイルがマルウェア判定されなくなりましたが,これは大丈夫ですかね?

GetWindowTextW

ウィンドウハンドル(HWND)はEnumWindows関数を利用すると簡単に取得できます。

int GetWindowTextW
(
  [in]  HWND   hWnd,     // ウィンドウハンドル
  [out] LPWSTR lpString, // テキスト用のバッファ
  [in]  int    nMaxCount // コピーする最大文字数(基本的にバッファサイズ)
);

ソースコード

EnumWindows関数はエラーの場合は0を返します。
Enumwindows関数に限らず,大体のWin32 APIのエラー詳細はGetLastError関数で確認できます。

コールバック関数
一部プロセスのタイトル名がワイド文字でないと取得できなかったのでstd::wstringを利用しました。
よって,標準出力にはstd::wcoutを利用しています。
標準出力に何も表示されない場合は,std::setlocale関数を使用すると上手くいくかも。

結構無茶なキャストをしている気がします。
とりあえず動くのでヨシッ。

プロセスのタイトル名からウィンドウハンドルを取得

プロセスのタイトル名が取得できれば簡単です。
今回はVSCodeのウィンドウハンドルを取得してみましょう。

ウィンドウハンドルの取得にはFindWindowW関数を使用します。

FindWindowW関数

FindWindowW関数は指定された文字列と同じタイトル名のトップレベルのウィンドウハンドルを取得します。

HWND FindWindowW
(
  [in, optional] LPCWSTR lpClassName, // クラスのアトム
  [in, optional] LPCWSTR lpWindowName // ウィンドウのタイトル名
);

第一引数のクラスアトムはよくわかりませんが,RegisterClass関数と関係があるような気がしています。
今回は自分でウィンドウを作成していないのでNULLを設定しました。

ソースコード

ウィンドウのタイトル名を正確に記述すればEnumWindows関数による列挙処理は必要ないですが, 今回は対象ウィンドウのタイトル名を部分一致で検索するのに使用しています。

FindWindowW関数が失敗したときのGetLastError関数の戻り値が0でした。
何かが変かも...?

プロセスのスナップショットを取得

プロセスのスナップショットを取得してみます。
プログラム解析の醍醐味ですね。

スレッドIDの取得

初めにウィンドウハンドルからスレッドIDを取得します。
スレッドIDの取得にはGetWindowThreadProcessId関数を使用します。

GetWindowThreadProcessId

ウィンドウハンドルからスレッドIDを取得します。

DWORD GetWindowThreadProcessId
(
  [in]            HWND    hWnd,
  [out, optional] LPDWORD lpdwProcessId
);
ソースコード

ほとんど変更はないですね。

スナップショットの取得

プロセスIDからスナップショットを取得しましょう。
この辺りはよく理解していないので詳細はマクロソフト公式を見てください。
https://learn.microsoft.com/ja-jp/windows/win32/toolhelp/traversing-the-module-list

CreateToolhelp32Snapshot

指定したプロセスIDのプロセスのヒープ・モジュール・スレッドのスナップショットを取得します。

HANDLE CreateToolhelp32Snapshot
(
  [in] DWORD dwFlags,      // スナップショットに含める要素
  [in] DWORD th32ProcessID // プロセススレッドID
);

今回はモジュールリストのスナップショットを取得したいのでTH32CS_SNAPMODULEを指定しました。

ソースコード

スナップショットを取得したら読み込みたいプロセスモジュールを取得しましょう。
プロセスのモジュールはModule32First関数とModule32Next関数で走査しています。

今回取得するバイナリファイル(exe)のモジュールのベースアドレスは次のメモリ読み取りで使用します。

出力結果
「モジュールって具体的になんだ」って思っていたのですが,実行してみたらバイナリファイルの集合っぽいなって思いました。
バイナリファイルを構成するためのexeやdllがまとまったものをモジュールと呼んでいるんですかね?

Target: sample.txt - Visual Studio Code
Binary=Code.exe,"VSCodeのバイナリへのパスが書かれている"
        ntdll.dll,C:\WINDOWS\SYSTEM32\ntdll.dll
        KERNEL32.DLL,C:\WINDOWS\System32\KERNEL32.DLL
        KERNELBASE.dll,C:\WINDOWS\System32\KERNELBASE.dll
        apphelp.dll,C:\WINDOWS\SYSTEM32\apphelp.dll
        OLEAUT32.dll,C:\WINDOWS\System32\OLEAUT32.dll
    ... 以下略

今回のプログラムはバイナリファイルに使われているdllファイルの列挙などにも使えますね。

プロセスのメモリ読み取り

次はプロセスのメモリを覗いてみます。
メモリ読み取りにはOpenProcess関数とReadProcessMemory関数を利用します。

OpenProcess

プロセスオブジェクトを取得します。
GetWindowThreadProcessId関数から取得したPIDを利用しましょう。

HANDLE OpenProcess
(
  [in] DWORD dwDesiredAccess, // プロセスのアクセス権
  [in] BOOL  bInheritHandle,  // ハンドルを継承するか
  [in] DWORD dwProcessId      // プロセスID
);

プロセスによっては解析対策でOpenProcess関数の使用やアクセス権を監視している場合があります。
はじめはプロセスのアクセス権をPROCESS_VM_READで使用するのがよいと思います。

ReadProcessMemory

指定したプロセスのメモリ領域を読み取ります。
OpenProcess関数が読み取りモードで成功していないと動作しません。

BOOL ReadProcessMemory
(
  [in]  HANDLE  hProcess,      // プロセスオブジェクト
  [in]  LPCVOID lpBaseAddress, // 読み取り開始のベースアドレス
  [out] LPVOID  lpBuffer,      // 読み取り先
  [in]  SIZE_T  nSize,         // 読み取るサイズ
  [out] SIZE_T  *lpNumberOfBytesRead // 転送されたバイト数
);

ソースコード

ReadProcessMemory関数のベースアドレスには,スナップショットを取得したバイナリファイルのベースアドレスを使用しました。
正直,APIの利用方法が正しいかはよくわかっていない。

出力結果
VSCodeのバイナリをベースアドレスから1024バイト分見てみました。
MZで始まることからおそらくプログラム領域が指定できているはず。

Target: sample.txt - Visual Studio Code
MZx@xo´     I!,LI!This program cannot be run in DOS mode.$PEd?UIcd"
?N?Do+÷?" Z?`AUORX§*h   o??o;o?'@    XY?^?Y( °N8?@??`.text??N?N `.rdataAdC?NfC?N@@.data<DF
d@A.pdatao;?;6@@.00cfg(?     <×@@.gxfg@°  B>×@@.retplneA ×.rodataA   ?× `.tls?0   ?×@A.voltblR@ ?×CPADinfo8P  ?×@A_RDATAo`  ?×@@malloc_hep        ?× `.rsrco?  A?×@@.relocXY@        Z`@B

応用

対象のプロセスをフォアグラウンドに配置して,仮想キーコードを送信してみました。
簡単なBOTぐらいは作れそうですね。

一見,char型で指定した文字を入力しているように見えますが,対応する仮想キーコードを入力しないと想定した動作にならないので注意してください。
https://learn.microsoft.com/ja-jp/windows/win32/inputdev/virtual-key-codes

(応用と書いていますが,スナップショットの項目で説明した部分は使用していません。)


感想

正しいソースコードなのかは分かりませんが,Windows APIでプロセス情報を取得する方法が少し理解できたのでヨシッ!

使い方によっては悪用できてしまうので注意したいですね。

学生の頃に読みたかった本 (ゲームプログラマ志望)

こんちは

職業プログラマなのですが,最近はやる気スイッチやまとまった時間が確保できないなどの関係で学生の時より技術書を読めなくなりました。

そんなこんなで,もし過去に戻れるなら暇でやる気と体力もあった学生の時に読んでおきたかった本を簡単(一言レベル)にまとめてみました。
ゴールデンウイーク中,暇な人もぜひ。

2024/01/20: 少し更新
2024/02/19: ちょっと更新


対象

  • 学生
  • ゲームプログラミングに興味がある人
  • ゲーム業界を目指す人
  • 暇な人

自分が学生の時にゲーム業界を目指していたので, 紹介する本はゲームプログラム関係に偏っているかも。
RustやReact, Kotlinなど,最近のイケイケ技術については疎いでのでその辺を期待している人には微妙かも。

Kindle本のセール推移を予想・確認した人におススメのブラウザ拡張。
過去の最安値を簡単に確認できるので超便利だよ。
yapi.ta2o.net


サブタイトル的なのは省略しています。

プログラミング言語

プログラマの基礎科目ですね。
とりあえず学びたい言語の最新規格に対応している書籍を選ぶのが良いと思います。

新・明解C言語 入門編

望洋本で説明できるぐらい有名なC言語の入門書です。



独習C++

C++17対応のメンテ版。
C++は規格更新がよく行われるので,この本に限らず時代に追従した書籍を選ぶのが良いです。

Effective C++

実質,C++入門書とセットの本。
C++erはこの本を読んだことがある前提で話を進めてきます。

Effective Modern C++

Effective C++ のモダン版。

独習C# 第5版

独習シリーズのC#版。
LINQとかラムダ式とか最近のトレンドは抑えてる。

プログラミングコンテストチャレンジブック

通称「蟻本」と呼ばれる競プロの聖典的な本。
プログラミング言語の本ではないけど,初めて学ぶ言語の訓練所としておススメ。

競技プログラミングの鉄則

2022年以降の蟻本かな。
これから競プロの勉強したい人はこっちがおススメ。

コンピュータ関係

ハードウェアとかOSなどのコンピュータの基礎部分の本です。
(「全部コンピュータ関係だろ」って言われるとその通りなのですが。。。)

論理回路入門

論理回路の教科書としては個人的に一番わかりやすかった。

プログラマーのためのCPU入門

プログラム一筋で頑張ってきました的な人におススメのCPU入門本。

コンピュータの構成と設計

パタヘネ


コンピュータアーキテクチャ

ヘネパタ

動かしてわかる CPUの作り方10講

Quartusを使ってCPUを錬成していく。
CycloneIIIをこのために買ったような。

CPUの創り方

4bitCPUから始める自作CPU入門生活。
ブレッドボードは準備したかい?

作って学ぶコンピュータアーキテクチャ

LLVMについて学びたい人にもおススメ。

コンピュータシステムの理論と実装

コンピュータの基礎を1から学びたい人用。
論理ゲートの解説レベルから。

ゼロからのOS自作入門

通称「みかん本」と呼ばれるOS自作本。
手を動かしながらOSを作りたい人向け。

作って理解するOS

みかん本より理論派な鈍器。
アセンブリでゴリゴリしたい人やアセンブリ入門書を探している人におススメ。

UNIXという考え方

Unixそれは哲学。

ネットワーク

時代的に必須級の知識ですかね?

マスタリングTCP/IP 入門編

TCP/IPはこれ読んどけ的な本。

基礎からわかるTCP/IP

マスタリングTCP/IPを挫折した後に読みました。
自分はこちらを読んでからマスタリングTCP/IPを理解していきました。

ネットワークはなぜつながるのか

ネットワークを広く知りたいならこれ読んどけ的な本。
少し説明が冗長化かも。

実践パケット解析

パケットキャプチャソフトのWiresharkを使ってパケット解析を学ぶ本。
Wiresharkの入門書として。

セキュリティ

チート対策はマルウェア解析書籍で学ぶのが良い...かも?

デバッガによるx86プログラム解析入門

ゲーム解析に注目した本ですが,exeの解析入門としても良いです。
読み物としても面白いと感じました。

初めてのマルウェア解析

Windowsに特化したマルウェア解析の入門本。
実践派向け。

マルウエアの教科書

図が多いので楽しく読めました。

ホワイトハッカーの教科書

セキュリティ関係の知識が皆無なので勉強になりました。

ホワイトハッカーの教科書

ホワイトハッカーの教科書

  • 作者:IPUSIRON
  • シーアンドアール研究所
Amazon

サイバーセキュリティプログラミング

パケット解析に興味があるときに見つけました。
Python3を使った実践的な内容です。

ネットワークプロトコルハッカーズガイド

ネットワーク解析関係全般の教科書的な内容です。

実践バイナリ解析

バイナリ解析に特化した本。
OSを限定しないバイナリ解析の知識が学べると思います。

リバースエンジニアリングバイブル

リバースエンジニアリングってどうやってやるんだろうを解決してくれる本です。

エディタ

作業速度に影響するので何か1つは極めておくと良いと思います。
近年の傾向的にサーバに触らない人の方が少ないと思うので,拘りが無い人はvimを学んでおくと良いかも...?

実践Vim

とりあえずこれ読んどけ的な本。

Emacs実践入門

小指を詰めろ。

ゲームプログラミング

メモリやスレッド管理,ハードウェア毎の最適化など,気を付けるべき要素が多いと感じます。

ゲームプログラマになる前に覚えておきたい技術

とりあえずこれ読んどけ的な本1。
ただし,シェーダとか所々説明は古いので注意。

ゲームプログラミングC++

とりあえずこれ読んどけ的な本2。
開発環境の説明が少し雑だから写経ぎみの人は注意。

実例で学ぶゲーム3D数学

3Dプログラミングに必要な数学知識の参考書。
手元に置いておきたい感じの本。

実例で学ぶゲームAIプログラミング

ゲームAIの図鑑的な印象の本。
学生の時に作ったローグライクRPGの移動AIに,この本のA*を参考にした思い出。

リアルタイムグラフィックスの数学

GLSLで数学を学びたい人向け。
学生の時に読みたかった。個人的におススメな本。

オンラインゲームを支える技術

MMORPGに使われている技術を説明した本。
ゲーム開発者は読んでおいて損はないはず。

GPUを支える技術

3Dゲームを開発する人はとりあえず読んどけ的な本。
ギリギリ学生の時に読めた。

コンピュータグラフィックス

CGの教科書的な本。
手元に置いておきたい本。

コンピュータグラフィックス [改訂新版]

コンピュータグラフィックス [改訂新版]

  • 公益財団法人画像情報教育振興協会(CG-ARTS協会)
Amazon

ゲームエンジン

UnityとかUE5とか。
ゲーム会社だと商用ゲームエンジンを利用していない場合も,ある程度機能は知っている前提で話が進みます。
最近だとゲーム関係以外でも利用する機会が増えている印象。

この手の本はバージョンを合わせて学習した方が良いと思います。

たのしい2Dゲームの作り方

2Dに焦点を当てたUnity入門書。

Unityの教科書

わかりやすいUnity入門書。
恐らくどのUnity入門書よりも挫折しにくいはず。

Unityゲームプログラミング・バイブル

Unity用のゲームテンプレート集,ほぼ鈍器。
見ているだけでも開発意欲が刺激されます。

見てわかるUnreal Engine 5 超入門

UE5の入門書。
UE5の機能を簡単に触る。

Unreal Engine 4 で極めるゲーム開発

通称「極め本」と呼ばれているUE4入門書。
UE5版が出るらしいのでそっちが良いと思います。


ゲームエンジン開発

最近は商用ゲームエンジンが流行していますが,内製ゲームエンジンによるゲーム開発も行われています。
そんなゲームエンジンの開発に興味がある人向けの本です。

会社的には商用ゲームエンジンはロイヤリティがかかるので,内製ゲームエンジンによるゲーム開発の方が利益が出しやすい反面,まずゲームエンジンを開発しないとゲーム開発のステップまで進めないので開発難易度が高い傾向があります。

(ポエム)
「商用ゲームエンジンで作成したゲーム」と「DirectXなどを使用してエンジン部分から作ったゲーム」のどっちが受けが良いか的なお話がゲーム業界就活では話題になりますが,個人的には両方できるのが最強だと思っています(当たり前)
ただ,学生の時に両方を極めることは色々と難易度が高いと思うので,行きたい会社の特性に応じて取捨選択していけばよいと思います。
自分は「エンジン開発」8割,「商用ゲームエンジン」2割って感じに学習コストを割きました。

DirectX12の魔導書

取っ付きにくいと話題のDirectX12の解説本。
DirectXだけでなく,imguiなどのエンジン開発によく使われる技術についても触れられています。

Direct3D12 ゲームグラフィックス実践ガイド

魔導書よりDirectX12に特化した本。
根気が大事。

HLSLシェーダーの魔導書

シェーダに特化した本。
DirectX12で作成されたエンジンも付いてくるので,シェーダ以外も学べてお得。

ゲーム制作者になるための3Dグラフィックス技術

1度は目を通したい3Dグラフィックス図鑑。

CによるCGレイトレーシング

レイトレーシングを基礎から学びたい人向けの本。
古い本なので半分ぐらいはソースコードで埋まっていたり,説明が少ない箇所もありますが,読み終えた頃には自作レンダラを作りたくなっているはず。

テクニカルアーティストスタートキット

スタートキット。

入門Blender

エンジン開発に携わりたいならモデリングソフトにも触っておきたいよね。
最低限使えればよい人向け。

機械学習

機械学習をしなければならない時に読みました。
必要最低限の知識は得られたと思います。

パターン認識機械学習

通称「PRML」と呼ばれる本。
機械学習のバイブルらしい(?)


ゼロから作るDeep Learning

Pythonで学ぶ機械学習の入門書。
順番に読み進めていくのが良いと思います。




設計関係

お仕事するときは必須級の知識ですね。

リーダブルコード

有名ですね。
この本を見るたびにリーダブルコードを読んだことがあるかでマウントを取ってきた同期を思い出す。

プリンシプル オブ プログラミング

リーダブルコードの亜種

リファクタリング

リファクタリング時の考え方の参考に。

テスト駆動開発

テスト駆動とは遠い環境で働いていますが,テストは大事って再認識できました。

継続的デリバリーのソフトウェア工学

ソフトウエア工学はこれ読んどけ的な本。
初めの1冊におススメかも。

Java言語で学ぶデザインパターン入門

お仕事ではJavaは使いませんが,デザインパターンの学習には最適でした。



Game Programming Patterns

ゲーム開発に特化したデザインパターン入門本。通称「キウイ本」。
ゲーム開発に関わらず,デザインパターンの学習には最適だと思います。

C++のためのAPIデザイン

C++に特化したAPI設計の本。
お仕事でC++を使用する人向け。

ソフトウェアテストの教科書

テスト項目を体系的に学びたい人向け。

UML関係

UMLの書き方は色々ありますが,なるべく正しい書き方を覚えた方が良いと思います。
基礎は大事ってことだね。



数学

出来ないよりは出来た方が良いです。
ただ,お仕事に生かせるかは職種次第だと思います。

その数式、プログラムできますか

プログラマのための基礎数学的な内容。
プログラムはおまけで数学がメイン。

IT Text 離散数学

離散数学を簡単におさらい出来る本。
手元に置いておきたい。

グラフ理論入門

グラフ理論に特化した入門書。
自分には少し難しかったです。

プログラマの数学

作業の息抜きに最適な本だと思います。

英語

就職するときは重要視された気がします。
お仕事でもソコソコ使うかも。

DUO3.0

英単語はこれで学びました。

DUO 3.0

DUO 3.0

Amazon

TOEICテスト公式問題集

TOEICはこれ。


TOEIC L&R TEST 出る単特急金のフレーズ

TOEIC用の単語帳はこれ。

一億人の英文法

正直,英文法はこれしか知らない。

その他

ジャンル無差別

認知バイアス 心に潜むふしぎな働き

認知がヤバいぐらい歪んでいる人とも仕事をすることがあると思います。
そんな人たちを理解するための本。

情報を正しく選択するための認知バイアス事典

認知バイアス図鑑。
図がメインなので楽しく読めました。


ゲームをテストする バグのないゲームを支える知識と手法

ゲームテスターになりたい人用の入門書。
テスターになるためのノウハウが書いてある(少し属人的かも)

適性検査関係

就活で軽視しがちな項目ですが,きちんとやったほうが良いと思います。
[asin:B0BS68CWP2:detail]

ゲーム開発補足

自身の専門外についても学んでおくと幅が広がります。



定期購読系

領域外のトレンドを簡単に抑えておくのに便利かも。
シェルスクリプトマガジンは安いのでおススメ。




おわりに

とりあえず思いついた限りを並べてみました。
お金の少ない学生時代に全部読めるかは微妙ですが,知識は無駄になりにくいので多少無理してでも読んでおけば良かったと今になって思います。
誰かのタメになれば幸いです。


ちなみに今年のゴールデンウイークは有給取れませんでした。