アセンブラを勉強しよう

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2009/05/21(木) 20:53:37
>>951
いやバーチャルマシン作ってデバッグとか
先輩の残した遺産もあるしね
953デフォルトの名無しさん:2009/05/22(金) 02:48:11
工学部だがCPUなんて作らなかった。
論理回路なら作った。
954デフォルトの名無しさん:2009/05/22(金) 03:35:47
ダイオードは作ったな。
手作業でウェハ磨いたりドライヤーやホットプレート駆使
したり作業の一部はほとんど家庭料理だった。
955デフォルトの名無しさん:2009/05/23(土) 02:11:46
1年ありゃあ、CPU作ってコンパイラ作ってその上でアプリまで動かせるだろ。
むしろアプリ先にありきでCPUのアーキ考えないとな。
956デフォルトの名無しさん:2009/05/25(月) 22:07:56
最近ちょいとアセンブラに興味を持ち始めて、
VC++ 2008 のデバッグモードにて、空の関数

void Test()
{
}

をビルドして逆アセしてみたら、以下のようになりました。

?Test@@YAXXZ (void __cdecl Test(void)):
00000000: 55 push ebp
00000001: 8B EC mov ebp,esp
00000003: 81 EC C0 00 00 00 sub esp,0C0h
00000009: 53 push ebx
0000000A: 56 push esi
0000000B: 57 push edi
0000000C: 8D BD 40 FF FF FF lea edi,[ebp+FFFFFF40h]
00000012: B9 30 00 00 00 mov ecx,30h
00000017: B8 CC CC CC CC mov eax,0CCCCCCCCh
0000001C: F3 AB rep stos dword ptr es:[edi]
0000001E: 5F pop edi
0000001F: 5E pop esi
00000020: 5B pop ebx
00000021: 8B E5 mov esp,ebp
00000023: 5D pop ebp
00000024: C3 ret

↓続く
957デフォルトの名無しさん:2009/05/25(月) 22:10:00
↑の続き

このアセンブリコードにて、3行目の
sub esp,0C0h
で、スタックポインタを192byteデクリメントした後に 0xCC で埋めてますが、
なぜ192byteを確保しているのか、理屈がよく分かりません。

また、上記の空関数に int の変数宣言を1つ追加するたびに、
スタックの確保サイズが、intのサイズ(4byte) ではなく、12byte ずつ増えるのですが、
なぜ 12byte なのか、これの理屈もよく分からず気になりました。
分かる方いらっしゃいましたら、よろしくお願いします。
958デフォルトの名無しさん:2009/05/26(火) 00:23:55
デバッグのために追加されてる、と考えればいいじゃないか。
959デフォルトの名無しさん:2009/05/26(火) 00:40:02
リリースモードでコンパイルしてdiff取ってみろよ
960デフォルトの名無しさん:2009/05/26(火) 01:31:33
フフフフフフフフフ
961デフォルトの名無しさん:2009/05/26(火) 02:45:44
>>957
ローカル変数のバッファオーバーラン検出用じゃないの?
962デフォルトの名無しさん:2009/05/26(火) 02:59:46
>>956
CodeGear(旧Borland)のCodeGuaedでも似たような手法を使っている
ダミーデータを埋め込み、不正な書きこみ、例えば配列の添え字外の
書きこみなどを検出している

時々お節介な事もしてくれるが、ポインタ関係で悩ましいバグが取れない
時は重宝してるよ
963デフォルトの名無しさん:2009/05/26(火) 19:58:50
>>961
>>962
ありがとうございます。
何か用途があるのかと思って調べてたので、スッキリしました。
964デフォルトの名無しさん:2009/05/26(火) 21:28:27
IDAProで、
int main(void)
{
puts("は?ははは");
return0;
}
を逆アセンブったところ

Ollydbgでは
s=は?ははは
IDAProでは
db '0h'
db '0h'
みたいに続くのですが、これをs=は?ははは
のように見れませんか?
965デフォルトの名無しさん:2009/05/29(金) 09:40:50
>>964
datarescueに問い合わせたら?
966デフォルトの名無しさん:2009/05/30(土) 00:09:54
KUE-CHIP2で浮動少数点数同士の乗算をせよという課題が出たんですがさっぱりわかりません
親切な方いましたらよろしくお願いします
967デフォルトの名無しさん:2009/05/30(土) 09:08:09
授業で手取り足取り教えてくれてるんだから、真面目に出て話し聞いてりゃいいじゃない。
資料だってあるんだから、見ながらやれば猿でもできる。
968デフォルトの名無しさん:2009/06/04(木) 05:08:14
IDA-PROの日本語化パッチを公開したら皆さんは喜んでくれますか?
969デフォルトの名無しさん:2009/06/04(木) 08:21:52
あんまり。
970デフォルトの名無しさん:2009/06/04(木) 08:22:11
>>968
明日の夜までに公開してくれるなら喜ぶ
971デフォルトの名無しさん:2009/06/12(金) 00:30:29
レジスタの中身をクリアする場合に、同一作者のソースの中でも
   xor ax, ax
   xor dx, dx
   xor cx, cx
とするいっぽう、別のルーチンでは
   mov dh, 0
   mov si, 0
となっている実例がありました。他方、別の作者ですと、統一されていて、
レジスタクリアは、16bit一括で
   xor di, di
   xor cx, cx
としている方もいました。

どちらの方も90年〜93年くらい、ちょうどDOS円熟時代のウイルス作者なのですが、
ご本人がコメントを詳細に付けておられるんで、可読性を考えてmov ch, 0としたとは
あまり考えられないのですが…(個人的な見解ですが、アセンブラの勉強に、太古のウイルスの
ソースコードを追うのは大変有意義であると考えます)。

この件は、もしかしたらマシンサイクル?と関係しているのかなと思っているのですが、
こういった実行サイクル・クロックの有利不利に関する情報のあるWebサイト・書籍がありましたら
ご教示ください。個人的には、上記1番目の作者のものを改変するのであれば、
   xor dh, dh
   xor si, si
などとしたいところですが。昔、xor レジスタ、レジスタのほうがmov レジスタ、0よりも
実行サイクルが短い、みたいな記述をよくアセンブラ解説系のサイトで見かけたものですから…。
実機実行環境は、80386SX-16MHz/387/6MB RAM、MMX Pentium 200MHz/64MB RAMくらいです。
972デフォルトの名無しさん:2009/06/12(金) 02:18:51
そりゃ8bit時代の話やね。いまどき1バイトや1クロック稼いでも意味無いしな。
あとRISCマシンならどっちも同じ命令とかよくある。
973 ◆0uxK91AxII :2009/06/12(金) 07:08:55
>>971
ふつーに考えて、可読性を考慮しているだけ。
movの方は引数、xorは単なる0clearだろうね。
974デフォルトの名無しさん:2009/06/12(金) 09:33:10
もしかしたら、だけど、フラグを変化させないために、xorじゃなくてmovに
してるかもしれないけど。
975971:2009/06/12(金) 09:47:21
>>972-974
回答ありがとうございます。

なるほどー、いろんな見方があるんですね。
>>972
たしかに現代の計算機ではたかが1クロック稼いだところでなんなの?って感じですけど、
コトは20年前の環境ですんで、悪しからず。開発マシンが386SXで、実行マシンが
286とか初代Pentium 133MHzとかなので。Pentiumだと、パイプライン?だかの影響で、
従前の8086的なアセンブラの記述・手法が逆に祟ってしまうことがある、とどこかで
読んだ記憶があります(はじめての〜80486だったか?)。

>>973
この場合の可読性ってのは、自分で後でパっとみて判るように、ってことでしょうかね。
コメントがびっしり拙い英文で書いてありますが(ネイティヴではない)、ゼロクリアに関しての
言及はなかったですから。

>>974
そうですか!確かに、mov命令ならフラグ変化をさせずに、という「利点」がありますね。
ウイルス作者もなかなかやりますねw あの当事の作者たちは、ある種の強者だったんでしょうか。
976デフォルトの名無しさん:2009/06/12(金) 10:53:00
そんなソースを一体どこから?
977デフォルトの名無しさん:2009/06/12(金) 11:01:14
直前にフラグを変化させる命令があって、その結果で分岐したいけど、
先にどうしてもレジスタをクリアしないといけないときぐらいしか利点が無い。
978971:2009/06/12(金) 11:15:35
>>976
直リンは避けますが、Googleで"Virus Source Code Database"でぐぐれば、
ちょうど89年〜93年ころの、16Bitアセンブリソースコードが山ほどでてきますよ。

ほとんどは、オリジナル作者の解説がついてますんで、ルーチンを追うのも
さほど苦労はない感じです。COM/EXE Infector型とか、そういうのが主流でした。
あと、ディレクトリエントリぶっ壊したり、COMMAND.COMを書き換えたり、
ブートディスクのすべてのサブディレクトリを逐次探索して、そこのCOM/EXEに
ことごとく自分のウイルスヘッダ?をぶち込んで機能不全にし、撒き散らしたりとか、ですか。

でも、昨今のウイルスに比べれば、頑張って作っている様子はわかりますよ(苦笑

>>977
なるほど。
979デフォルトの名無しさん:2009/06/12(金) 11:16:59
パッチ作るときに使ったな
980デフォルトの名無しさん:2009/06/12(金) 11:20:34
xor以外にも、subでも同じゼロクリアできるな。
好みの問題だけどな。
あ、キャリーフラグが面倒かw

8086系以外のCPU使ってるとその辺は色々あっておもしろいぞw
ゼロクリア専用の命令があるのとかな。
981デフォルトの名無しさん:2009/06/12(金) 11:24:37
x86でもfpuにはfld0とかfld1とかあって便利。
982デフォルトの名無しさん:2009/06/12(金) 12:09:27
さてそろそろスレが終わるが、アセンブラスレはいくつかたってるので
どこか適当なところを次スレに...と思ったら、本スレのPart13が即死で落ちて
止まってたんだな。

次スレはこれをリサイクルしますか?
http://pc12.2ch.net/test/read.cgi/tech/1199952217/l50
983デフォルトの名無しさん:2009/06/12(金) 16:03:30
向こうの住人の了解が得られれば、いいと思います。
984デフォルトの名無しさん:2009/06/12(金) 16:31:00
RISC系だと常に値が0のレジスタがあったりして mov %r0, %rxx みたいに
ゼロクリアしたりするな。
985デフォルトの名無しさん:2009/06/13(土) 02:00:51
0レジスタ、実はHD6309にあったりする。
986デフォルトの名無しさん:2009/06/13(土) 04:14:16
>>971 ウィルス検出パターンに引っかからないため、ってのはないかな?
987デフォルトの名無しさん:2009/06/14(日) 01:25:56
ハッキング非公式マニュアルという書籍に載っているアセンブラは、
988デフォルトの名無しさん:2009/06/14(日) 04:22:36
なんでそこで切る
989デフォルトの名無しさん:2009/06/14(日) 08:38:28
検索すると「ハッキング非公式ガイド」という本はあるようだが
990デフォルトの名無しさん:2009/06/14(日) 14:19:20
それです。
アセンブラを学ぶのに参考になりやすかい?
991デフォルトの名無しさん:2009/06/14(日) 14:36:40
基礎も学ばずに応用をやろうだなんて…
992デフォルトの名無しさん:2009/06/14(日) 15:40:50
ハッキングから学ぶのは非常ーに大変です
993デフォルトの名無しさん:2009/06/14(日) 23:23:12
なんで厨はハッキングから入ろうとするの?
994デフォルトの名無しさん:2009/06/14(日) 23:51:03
厨だから。
995デフォルトの名無しさん:2009/06/15(月) 18:08:45
Vistaでdebugコマンドを打った後にqを打って16bitmodeにする作業を
.batによって自動化させるにはどのように記述すればいいですか?
996デフォルトの名無しさん:2009/06/15(月) 18:43:47
q.txt
q
[EOF]

debug < q.txt
997デフォルトの名無しさん:2009/06/15(月) 18:44:18
q<改行>
というファイル(q.txtとする)を作って、
バッチファイルでは、
debug < q.txt
とする。
998デフォルトの名無しさん:2009/06/15(月) 20:09:12
q('A`)p
999デフォルトの名無しさん:2009/06/15(月) 23:00:15
999 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1000デフォルトの名無しさん:2009/06/15(月) 23:07:02
asm
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。