プログラミング関係の本を読むと大体前提知識が必要なものが多いですよね。
初心者向けの本でも大体C言語を知っている前提で書かれていることも多いです。
そのため本を読むためにはその本が必要とする知識を持っておく必要があります。
そこで今回は自分が本を読むときに知っておきたかった知識についてまとめてみようと思います。

※途中で書く気力がなくなったために未完成ですが、気が向いたら更新していこうと思います。。

学び方

 プログラミングをするにはやはりPCの仕組みを知っていた方が何かと理解が進みます。
じゃあ何を知っていればいいのかというと、PCの仕組みは複雑なので非常に多くあります。
そのため最初から全部理解する必要は無いと思います。
そこでここでは自分が学んだ方法を書いておきます。
そのあとに自分が学んだことを思いついたままに適当に書いていきたいと思います。

プログラムの仕組みを学ぶ

 まずはプログラムの動く仕組みやOSの仕組みの概要を理解するのがいいと思います。
私はwindowsしかほぼ使ったことがないのでUNIXについてはよく知りません。
プログラムやwindowsについて知るには日経BP社の「プログラムはなぜ動くのか」や「Windowsはなぜ動くのか」を読むのがいいと思います。

プログラムはなぜ動くのか 第2版  知っておきたいプログラムの基礎知識

新品価格
¥2,376から
(2021/2/9 18:16時点)

Windowsはなぜ動くのか

中古価格
¥100から
(2021/2/9 18:18時点)

この二つは確か図書館で借りて読みましたね。
最初は基本的なこととか何もわからなかったので基本的なところを抑えるためにざっと読み通しました。

C言語を学ぶ

 次にプログラミング言語の基本的な文法を覚えるといいと思います。
言語は何でもいいと思いますが、学びたい言語が決まらない場合はC言語がおすすめです。
C言語でif文やfor文など基本的なことができれば他の言語にも応用が利くと思います。
C言語を理解するには「苦しんで覚えるC言語」というサイトがわかりやすかったです。
総合開発環境のリンクが切れているのでVisualStudioを使うといいと思います。

WindowsAPIを学ぶ

 windowsを学ぶなら、windowsの機能を使うための関数であるwindowsAPIについて学ぶのがいいと思います。
windowsAPIを学ぶなら同じ日系BP社の「APIで学ぶWindows徹底理解」がいいと思います。
WindowsAPIからプロセスやスレッドについて学ぶことができます。

APIで学ぶWindows徹底理解 (日経BPパソコンベストムック)

中古価格
¥4,327から
(2021/2/9 18:25時点)

まずAPIって何?って感じで、ツイッターAPIとかどこかで聞いたことはあるくらいでした。
リバーシングについて学びたく、そのときにwindowAPIについて知っておかないとと思い本を探したところ結構古い本に辿り着きました。
ざっと読み通してAPIの雰囲気を感じ取れました。

アセンブリ言語を学ぶ

 APIによってwindowsの機能が呼び出されることを知ったら、その呼び出される過程を知りたくなると思います。
プログラムは機械語で書かれているため、その機械語を知ることでどのように関数が呼び出されるのかを理解することができます。
この機械語に人間が理解できる名前を付けたものがアセンブリ言語であるため、アセンブリ言語の本を読むといいと思います。
しかしアセンブリ言語の本は基本的にすべてをアセンブリ言語で書いてみようという内容が多いです。
今の時代すべてをアセンブリ言語で書く必要はなく、一部だけ機械語で実装したいと思うことの方が多いです。
そのため実用的なアセンブリ言語を学ぶには「リバースエンジニアリングバイブル」を読むことをお勧めします。
細かいアセンブリ言語の命令は載っていませんが、アセンブリ言語を読むことができれば自分で調べることができるようになります。

リバースエンジニアリングバイブル ~コード再創造の美学~

中古価格
¥4,000から
(2021/2/9 18:26時点)

私が一番気に入っている本です。
1週目は半分も理解できずに、知らない単語をいちいちググって調べていました。
あのときはwindows apiの存在も知りませんでした。
スタックなども知らず、しかも知らない単語が最初に出てくるのに後に説明があったなんてこともありました。
しかし今思うと説明するには仕方がなかっただろうし、いちいちすべてを説明していたらくど過ぎただろうなと思います。
アドレス計算もこの本に直接書き込んでいました。
2週目にやっと少しずつ分かるようになってきて面白く感じて、この本に書かれているアンチデバッグや難読化を利用して自分でCTFを作ってみたりしました。
少し内容が古い部分が一部ありますが、セキュリティ関連では一番読み込んだ本でおすすめです。

久しぶりのこのページを読み返して追記していますが、セキュリティ関連で初めて買った本がこの「リバースエンジニアリングバイブル」でした。
あんまり詳しくは覚えてはいませんが、どうしてもリバーシングについてまとまったちゃんとした本が欲しいと思ってamazonで4000円もする新品のこの本を買いました。
この本は結構具体的にコードと説明が書かれているので自分で再現できるのがいいところですね。
最初は理解できなくてここのページに書かれている本を買い漁るようになりました。
すごい夢中になっていて、同じページを何度も読み返した記憶があります。
頑張ってスタックを理解しようとしてメモを書いてるページがありました。
retはjmpだけじゃなくてpopもしてますね。
てかリバースエンジニアリングバイブルだけを紹介するページ作っておけばよかったなぁ。
このページのタイトルが違うからこの本を買おうとして調べてもこのページはヒットしないなぁ。
でも本の紹介ってどこまで書いていいかもわからないし、この本を一番読み込んでいたあの時に書かないと熱意が伝わらないなぁ。
とりあえずこのページのタイトルに「リバースエンジニアリングバイブル」って付け加えとこ。


(ついでにA8よりもしもの方が本が大きく表示されて見やすいのでそれも載せておこう。

いまどきのアセンブラプログラミング

いまどきのアセンブラプログラミング―Windowsプログラム解析・開発の独習

中古価格
¥712から
(2022/2/7 20:28時点)


これは2003年の本のためめちゃくちゃ古いので買うのはそこまでお勧めしません。
しかしこの本は私がアセンブラやバイナリを詳しく知るきっかけとなった本です。
図書館でプログラミング関係の本を適当にみていたところ、ちょっと手に取って読んでみたら結構面白くて借りました。
内容はゲームの改造をしていく過程が書かれています。
昔ゲームのチートとかで0xから始まる数字とアルファベットの羅列をなんかいじっているのをみて、何してんのかさっぱりわからないなーとか思っていたのですが、これを読んでそういうことだったのかと腑に落ちました。
そこから自分で簡単なexeを作ってバイナリを見たりしてこんな仕組みになっているんだ!面白い!と楽しんでました。

マルウェア解析を学ぶ

 アセンブリ言語を読む能力はマルウェア解析などに役立ちます。
セキュリティソフトがどのようにマルウェアを検出しているのか、マルウェアがどのような手段でセキュリティを回避しているのか。
この仕組みについて興味が湧いてきたら「初めてのマルウェア解析」を読むのがおすすめです。
xorやBASE64のエンコーディングが丁寧に説明されています。
前半はIDAやx64dbgの使い方、アセンブリの読み方が非常に丁寧に説明されています。
アセンブリにおいては練習問題とその解説があるなど、アセンブリを読む力が付きやすくなっていると感じます。

初めてのマルウェア解析 ?Windowsマルウェアを解析するための概念、ツール、テクニックを探る

中古価格
¥3,600から
(2021/2/9 18:26時点)

最初の方はツールの使い方なのでリバースエンジニアリングバイブルと被っていますが、最後の方はカーネルについての説明もあって面白かったです。
しかし内容が難しく、全部を理解するのは諦めました。

マルウェア解析を学ぶ2

 こちらの本もマルウェア解析の本ですが、具体的なコードが多いです。
自作パッキングのコードを始め、SSDTフッキングのサンプルコードなど攻撃者側のコードも載っていて理解がしやすいです。
PEの説明もすべてではありませんが一部を抜き出して丁寧に説明してあります。
また特にファイルとメモリにおけるアドレスの差の計算方法などが丁寧に説明されています。
この本はアセンブリを極力読まないようにしているため、「初めてのマルウェア解析」より先に読んだ方がわかりやすいかもしれません。
この本のサンプルコードは著者のサイトからダウンロードできるので、コードだけでも読めれば理解が深まります。

アナライジング・マルウェア ?フリーツールを使った感染事案対処 (Art Of Reversing)

中古価格
¥1,219から
(2021/3/24 10:42時点)

windowsカーネルを学ぶ

 マルウェアはセキュリティを回避するためにカーネル領域に入り込んできます。
そのためマルウェアを検出するにはOSのカーネルについて知っておくことが必要です。
「初めてのマルウェア解析」ではwindowsのカーネルについて説明はされていますが、初めてカーネルを理解するには向いていないように感じます。
そのためwindowsのカーネルについて学ぶには「インサイドWindows」が良いと思います。
2021年2月現在、第7版の上が日本語訳で出ています。
しかし原著windows internalsの第7版のpart2が2021年の7月に発売のため、7版の下の日本語訳は当分先になると思われます。
あと価格が高かったのでブックオフで安かった第4版を買いました。。

インサイド Microsoft Windows 第4版〈上〉

新品価格
¥6,380から
(2021/2/9 18:27時点)

インサイド Microsoft Windows 第4版〈下〉

新品価格
¥5,500から
(2021/2/9 18:27時点)

買ったんですけどあまり読んでないんですよねー。
なんかこう、「リバースエンジニアリングバイブル」のように具体的な感じはしないので知識として知っておこう的な?

ローダーを学ぶ

 またここでプログラムがどのように作られ、起動するのかを理解するためには「Linkers & Loaders」が良いと思います。

Linkers & Loaders

中古価格
¥1,121から
(2021/2/9 18:28時点)

これも内容難しくて結局あまり読んでないんですよねー。
あのときはパソコンやOSの根本の全てを知ろうとしてとにかく本を集めまくってたんですよねー。

ネットワークを学ぶ

 ここまできてネットワークについて全然勉強していないことに気づきました。
サーバーとかTCP、プロトコルとかよく聞くけど何だったんだろうという感じでした。
そこでネットワークの概要を知るために日経BP社の「ネットワークはなぜつながるのか」を読みました。
この日経BP社のなぜシリーズの本はわかりやすいのでこれもわかりやすいだろうと思っていたのですが、結構難しかったです。
その理由としては私がネットワークについて全く知らないために、イーサネットやIEEE~とか知らない単語が大量に出てきたからです。
まあでもブラウザからパケットの流れがなんとなく理解できました。

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

新品価格
¥2,376から
(2021/2/9 18:29時点)

パケットを学ぶ

 なんとなくの理解をはっきりさせるため、実際にパケットを解析しようと思いました。
パケットの解析はWireSharkというフリーソフトでできます。
しかしパケットは暗号化されていたり、使い方がよくわかりませんでした。
そのため「パケットキャプチャの教科書」を読みました。
これでハンドシェイクなどの実際のネットワークのやりとりの流れがわかりました。

パケットキャプチャの教科書

新品価格
¥2,950から
(2021/2/9 18:29時点)

デベロッパーツールを使う

 しかし実際にキャプチャしてみるとYouTubeのパケットはTCPではなくQUICというプロトコルだったりと、どう復号するかわかりませんでした。
自分で復号しなくても、ブラウザに表示される時には復号されているのだからそれを得られればいいと考えました。
調べてみると、chromeならデベロッパーツールを使えば簡単に復号されたデータを見られることがわかりました。
サイトを開いてただF12を押すだけでできます。

ソケットを学ぶ

 今度は自分でパケットを送ってみたいと感じました。
pythonやGoなら簡単にスクレイピングができるらしいですが、内部でどのような動きか知りたくなりました。
そこで、windowsにおけるソケットの仕組みを学ぶためには「WinSock2.0」が良いと思います。
この本は第2版も出ていますが、2版の価格が異常に高いので1版を買いました。。

WinSock 2.0 プログラミング?Window Socket APIによるネットワークプログラミングのすべて

中古価格
¥855から
(2021/2/9 18:31時点)


 ちなみに本は借りられれば無料ですが、なかなか本がないのでamazonやメルカリで買いました。
一番安いのは送料のかからないブックオフの店舗受け取りだと思います。
この本は意外と使いましたね。
c言語でソケットを使おうとするとライブラリが標準ではなくて、わざわざインストールしたような記憶があります。
そこらへんでc言語でネットを扱うのはやっぱり大変なんだなってことを改めて実感しました。
でも実際にc言語でネットを一応扱うことはできることを知れてよかったです。


あと「エキスパートCプログラミング」が欲しいのですが、高いので安い中古が現れるのを待っている感じです。。

エキスパートCプログラミング?知られざるCの深層 (Ascii books)

中古価格
¥6,100から
(2021/2/9 18:38時点)

これは結局買えませんでした。
なんかこの本英語の本の翻訳らしくて英語の方を少し調べてみたところなんか思っていたのと違かったような記憶があります。
それか買えなかったので自分が欲しいものではないと思い込もうとして記憶が改竄されてるのかは定かではないですか。


exeファイルが実行されるとはどういうことか

キーワード[プロセス、スレッド、リソース、ハンドル、メモリ、カーネル]

windowsのデスクトップにはexeファイルのショートカットが置いてあることが多いと思います。


そのショートカットをダブルクリックして起動すると、exeファイルが起動してプログラムが起動します。

このときexeファイルはエクスプローラーから起動されます。


エクスプローラーとはC:\Windows\explorer.exeにあるexeファイルで、よくファイルとか探すのに使いますよね。

exeファイルが起動するとプロセスというものが作成されます。

このプロセスとはexeファイルが実行しているもののことです。

そのためデスクトップにあるショートカットがダブルクリックされると、エクスプローラーのプロセスがそのショートカットのexeファイルを起動し、そのプロセスが作成されます。

このようにプロセスを作成するプロセスを親プロセス、作成されるプロセスを子プロセスと言います。

このプロセスはexeファイルの中身を取り出してパソコンのメモリに置きます。

これをexeファイルをメモリに展開すると言います。

exeファイルの中身のデータのことをリソースと言います。

このリソースを区別するための番号のことをハンドルと言います。

メモリとはいろんなデータを保存する場所のことで、パソコンを構成している部品のことです。

(メモリ、amazonより)

これによってプロセスはメモリからデータを使っていろいろな処理を行うことができます。

このプロセスが行う1つ1つの命令スレッドと言います。

このスレッドはパソコンのCPUで処理されます。

CPUはいろんな演算を行うところで、パソコンの部品の一つです。

(CPU、wikiより)

CPUの中にはさらにコアという部品があり、これが実際に処理を行っているところです。

コアの数はパソコンによって異なりますが、コアの数が多いほど処理できるスレッドの数も多くなります。

コアには数に限りがありますから、スレッドを適切に割り当てないとうまく処理できません。

このコアにスレッドを適切に割り当てる作業はカーネルというものが行っています。

カーネルとはOSの中核となる部分のことで、PC上で起動しているプログラムなどのアプリケーションとCPUやメモリなどのハードウェアとのやり取りを管理しているもののことです。

OSとはwindowsやLinuxなどのコンピュータを制御するためのソフトウェアのことです。

カーネルの仕事は他にもあり、プロセスがメモリを確保するときに使われていない部分を割り当てたり、CDやUSBなどのデバイスとのやりとりなど多くの仕事をしています。


exeファイルが実行されるとプロセスやスレッドなどの処理がCPUで行われ、その過程で様々なものと関わっていることがわかります。

このようにexeファイルを起動すると目には見えない部分で多くの処理が行われていて、実際はここに書かれていることより非常に多く複雑です。


dllファイルとは何か

dllファイルとは動的リンクを使ったライブラリのことです。

dllはDynamic Link Libraryの略です。

動的リンクとはexeファイルが実行されたときにそのexeファイルとdllファイルが結合することです。

ライブラリというのは多くの関数がまとまって書かれたもののことです。

すなわち、dllファイルとはexeファイルが実行する際に関数を呼び出すための関数がまとまったファイルのことです。

exeファイルが実行された時にexeファイルがdllファイルを呼び出して、dllファイルの中の使いたい関数を使えるということです。

1つのexeファイルに関数をまとめて書かないでdllファイルにすることで、他のプログラムからも使えるようになり、同じコードを書く手間や容量を省くことができます。


APIとは何か

[API,インターフェース、プロトコル]

APIとはApplication Programming Interfaceの略であり、アプリケーションから提供された機能を使うためのインターフェースのことです。

インターフェースとはモノとモノの間の部分とそのプロトコルのことです。

wikipediaで調べるとカタカナの説明にカタカナが使われていて、どんどん調べることが増えていきます。。

プロトコルとはやり取りに関する取り決めのことです。

ここまでをまとめると、APIとはアプリケーションから提供された機能を使うためのものということがわかります。

まとめてないですね、インターフェースの部分を無視しただけですね。。


具体例としてWindowsAPIやTwitterAPIがあります。

WindowsAPIというのはWindowsの機能を使うための関数のことで、DLLファイルとしてC:/Windows/System32に保存されています。

プロセスやメモリを管理するkernel32.dllやウィンドウを管理するuser32.dll、文字や描画を管理するgdi32.dllなどがそのフォルダに入っています。

Windows API

TwitterAPIというのはTwitterの機能をプログラムから使うための関数のことです。

TwitterAPIを使えばTwitterをブラウザから開かなくてもプログラムからリツイートしたり良いねしたりすることができます。

Twitter API


ポインタと配列の文字列の違いは何か

ポインタに文字列を代入した時と、配列に文字列を代入した時どう違うのかって説明できるでしょうか。
私はわからなかったので実際に調べました。
すると「コンパイラによる」っていう結果になりました。

その前にまず、exeファイルの構造を知っておきましょう。
拡張子が.exeのファイルはPE(Portable Executable)ファイルと言われます。
このPEはヘッダとセクションから成り立っています。
PEヘッダにはPEの情報が書かれており、PEセクションには.textというコードが書かれている領域,.data,.rdataなどのデータが書かれている領域があります。
.rdataは読み込み専用で、.dataは読み書きできるデータが入っています

Visual Studio

まずVisual Studio Cの場合を見てみましょう。

これをコンパイルしてx32dbgというソフトでexeの中身を見てみました。
すると.rdataにどちらもあることがわかりました。

読み込み専用にあるならどのようにして配列の値が書き換えられているのかって不思議に思いますよね。
実際に見てみましょう。
    逆アセンブラ画面
ダンプ画面
メモリマップ画面

このように読み取り専用の.rdataにあるデータは読み書き可能のスタック領域に移されてから書き換えられていることがわかります。
スタックとはメモリの領域の一つで、一時的にデータを保存したり、関数に引数を渡すときなどに用いられます。
ちなみにポインタのaの方を書き換えようとすると、直接読み取り専用の部分を書き換えようとするため、アクセス違反となります。

TCC

TCC(Tiny C Compiler)でコンパイルした場合はどうなるでしょうか。
TCCで先ほどと同じコードをコンパイルすると以下のようなPEセクションが生成されます。
VisualStudioと異なり、.rdataがなく、読み書き可能な.dataしか存在しません。
よって"APPLE"も"apple"も.dataに存在します。
そのためポインタのaも配列のAもどちらも書き換えることができます。

このようにコンパイラによるため、文字を扱うときは普通に配列を使った方がいいかもしれません。

デバッガとは何か

デバッガとはプログラムのバグを見つけるために用いるソフトのことです。

デバッガでは一行ずつコードを実行したりできますよね。

それはブレークポイントという機能を用いています。

この方法には2つあります。

1つはハードウェアブレークポイントと言い、デバッグレジスタというデバッグ用のメモリであるレジスタに止めたいコードのアドレスを入れることで実現できます。

2つ目はソフトウェアブレークポイントと言い、コードの止めたい場所に0xCCを書き込むことで実現できます。

フックとインジェクションとは何か

 フックとは英語でhookと書き、ひっかけるという意味です。

フックとはコードを書き換えて特定のコードに飛ばしてから戻すことを言います。

元のコードを特定のコードにひっかけているようなため、フックすると言います。

また特定のコードに飛ばして戻ってくることからトランポリンとも言います。

 インジェクションとは英語でinjectionと書き、注射・注入するという意味です。

そのためDLLインジェクションといえば、DLLをファイルに埋め込むことを言います。

Windowsのカーネルの概要

ここら辺は後で書こうとして力尽きたか時間がなくて興味が違うとこに向いていって結局かけませんでしたねー。

TCP/IPとはなにか

[プロトコル、DNSサーバー]

Qtとは何か

たまに聞くQtというのは、キュートと読み、C++でクロスプラットフォームなGUIをつくるフレームワークです。

クロスプラットフォームとは様々なOSでも動くという意味です。

フレームワークというのは英語でframeworkと書き、骨組みという意味です。

すなわちQtから提供された関数を使えばwindowsやLinux、Macで動くウィンドウアプリを簡単に作れるということです。