質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

4回答

1091閲覧

サブルーチンの中身をアセンブリ言語で見てみたいです。

carnage0216

総合スコア194

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

0クリップ

投稿2018/02/24 12:55

callされるサブルーチン自体をアセンブリプログラムで出力する方法はないでしょうか?

やはり、サブルーチンのアセンブリプログラムを見るにはサブルーチンのみを別のプログラムとしてアセンブリ出力するしかないのでしょうか?

例えばですが以下のプログラムのcallによって呼び出されたmemcpyの中身は呼び出されただけで中身がブラックボックスであるため中身を知るにはmemcpyのソースコードを別にアセンブリ言語で出力するしかないのでしょうか?
まあ、呼び出しただけなので、中身を見るのは別の作業が必要に思えます。

mov rcx, rax mov r8, rdi mov rdx, rbx call memcpy

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

VisualStudioでデバッグ実行してアセンブリ表示に切り替えてステップイン実行が可能だったはずです


memcpyのソースをMSは公開しています。
(ライセンスを指定していないのでオープンソースというと語弊がありますが)

MSVC2013のamd64は
"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src\memcpy.c"
ですかね

MSVC2017 Communityですと
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\crt\src\x64\memcpy.asm"
がデフォルトのインストール位置でしょう。

投稿2018/02/24 15:06

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/03/08 11:02

あの、visual studioでサブルーチンを見るのとは別に、GCCでサブルーチン内を見ようとオブジェクトファイルを逆アセンブリしましたが見ることは出来ませんでした。 GCCでサブルーチンを見ることは出来るのでしょうか? あるいは面倒な作業になること考えるとvisual studioでサブルーチンの中身を見る方法のほうがよいのでしょうか?
asm

2018/03/08 14:46

理由は色々考えられますけど、 「どうやって生成したオブジェクトファイル」を「どのように逆アセンブル」しようとしたかが不明瞭です。 後者はbinutilsっぽい気がしますけど(GNU事情はあんまり詳しくないけどアレ一応GCCぢゃないよね・・・?) gcc -cで生成される.oファイルならば、そこに目的のサブルーチンはないでしょう。 実行ファイルにサブルーチンが無ければ外部の共有ライブラリにある可能性があります。 lddでリンクしている外部ライブラリを列挙して、それっぽいのに対してobjdumpしてみてはいかがでしょうか?
carnage0216

2018/03/08 15:07

asmさんの言うようにサブルーチンの関数のオブジェクトファイルの入ったライブラリを逆アセンブルしたり、サブルーチンのC言語関数があればアセンブリ変換していきたいと思います。面倒で地道な作業ですがきっと力がつくかもしれません。 どうもありがとうございました。
carnage0216

2018/03/08 15:08

あ、すいません。GCCでオブジェクトファイルを生成しました。
guest

0

ベストアンサー

Visual Studio のデバッガでmemcpyに飛び込んでみた。

イメージ説明

かたやコチラ↓が C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\crt\src\x64\memcpy.asm

mov r11, rcx ; save destination address mov r10, rdx ; save source address cmp r8, 16 ; if 16 bytes or less jbe MoveBytes16 ; go move them quick cmp r8, 32 ; check for length <= 32 (we know its > 16) jbe Move17to32 ; go handle lengths 17-32 as a special case sub rdx, rcx ; compute offset to source buffer jae CopyUp ; if above or equal, go move up mov rax, r10 ; else check that src+count < dst add rax, r8 ; src + count cmp rcx, rax ; (src + count) < dst jl CopyDown ; no, buffers overlap go move downward CopyUp: cmp r8, 128 jbe XmmCopySmall bt __favor, __FAVOR_ENFSTRG ; check for ENFSTRG (enhanced fast strings) jnc XmmCopyUp ; If Enhanced Fast String not available, use XMM ; use Enhanced Fast Strings ; but first align the destination dst to 16 byte alignment StringCopy: mov rax, r11 ; return original destination pointer mov r11, rdi ; save rdi in r11 mov rdi, rcx ; move destination pointer to rdi mov rcx, r8 ; move length to rcx mov r8, rsi ; save rsi in r8 mov rsi, r10 ; move source pointer to rsi rep movsb ; copy source to destination buffer mov rsi, r8 ; restore rsi mov rdi, r11 ; restore rdi ret

同じもんみたいやね、ッタリマエだけど。

投稿2018/02/25 00:18

編集2018/02/25 00:24
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/02/25 21:47

どうもありがとうございます。 この方法ならば過去に質問しました顔認識のプログラムなどの関数の中身を見る事ができそうです。 (いきなり見るのはハードルが高いので、まずは簡単なプログラムからアセンブリを勉強しています。
carnage0216

2018/02/25 21:51

あの、「Visual Studio のデバッガでmemcpyに飛び込んでみた。」との事ですが、visuals studio 2015にも機能はあるのでしょうか? また、アドレスなどが打ち込まれていますが、このアドレスより先に関数memcpyのアセンブリデータがあるというわけですか?
carnage0216

2018/02/25 21:52

だとしたら、関数memcpyのアセンブリデータが入っているアドレスを見つける必要がありますね。
episteme

2018/02/25 23:06

VS2015でも(もっと旧くても)無問題。memcpyを呼んでる地点から逆アセンブリ・モードで数step実行すればその画面すなわちmemcpyの本体入り口にたどり着きます。
carnage0216

2018/02/26 04:04

では、vs2015の逆アセンブリモードでmemcpyの中身を見てみます。 あの、今更ですが逆アセンブルすればcallされた関数の中身も同時に見れるという解釈で大丈夫でしょうか?
episteme

2018/02/26 05:51

やってから訊け
carnage0216

2018/02/27 07:44

はい。すいませんでした。
carnage0216

2018/03/07 22:39

今更の質問で申し訳ありません。今アセンブリの勉強としてHELLO WORDをvisual studio 2015で逆アセンブリを行おうとデバックからウィンドウを開いたのですが逆アセンブリ機能がありませんでした。 そこでwin32アプリから新しくオブジェクトファイルを作って生成されたオブジェクトファイルを逆アセンブリしようとしたのですが、C言語のソースとC言語のヘッダファイルのソースコードを書くwin32アプリしかありませんでした。オブジェクトファイルのソースコードを書くためのファイルも改めてインストールするしかないのでしょうか? もし以上のことができないとしたら開発者コマンドプロンプトfor VS2015で逆アセンブルをしようと考えています。(これから調べます。) ソースコードは以下の通りです。 #include <stdio.h> int main(int argc, char *args[]) { printf("Hello, world!\n"); return 0; }
asm

2018/03/08 01:05

ある https://i.gyazo.com/f08c90e96e6bcee3fbe3b75a1e187bd8.png obj・lib・exe・dllからの逆アセンブルならばdumpbinがインストールされているはず オブジェクトファイルってのは中間生成物なので、それのソースコードというと普通のCソースになるんだが
guest

0

Windowsの場合ですが、Windbgを使用してWindows APIの実装を調べたりはします。

Debugging Tools for Windows (WinDbg, KD, CDB, NTSD)

uコマンドで逆アセンブルできるので内部実装が分かります。

投稿2018/02/24 13:16

hmmm

総合スコア818

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Windowsプログラムの場合で述べます。

プログラムをどうやって起動しているかわかりませんが、普通プログラムを起動した段階で(下請けを含めて)命令列やリソースがメモリ上に読み込まれます。(一部のdllやリソースは起動後に必要に読み込みます)ですので、プロセスメモリダンプすればバイナリデータとして出力できます。

まあ、手っ取り早い方法としては、OllyDBGなりを経由してプログラムを起動し、当該下請け関数でブレークすれば良いと思いますけど。

投稿2018/02/24 13:00

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2018/02/24 15:11

ollydbgはx64対応してないです・・・
HogeAnimalLover

2018/02/24 22:19

そうでしたっけ? メジャーなver1系では未対応ですが、2系以降では対応が進んでいると記憶しておりましたが・・・もっともデバッガは一例なので別のものであっても同じです(VSなりWinDBGなり)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問