システムコールを逆アセンブルして、アセンブリ命令を得ることができますシステムコールを解体する方法は?
答えて
このようなことができます。私は "DUP" の組立・ダンプを取得したいと言う:
#include <stdio.h>
#include <sys/file.h>
int main() {
return dup(0)
}
それをコンパイルします:
gcc -o systest -g3 -O0 systest.c
はそれをダンプします。
objdump -d systest
はで見ると、「この
書き込みメイン "参照:
400478: 55 push %rbp
400479: 48 89 e5 mov %rsp,%rbp
40047c: bf 00 00 00 00 mov $0x0,%edi
400481: b8 00 00 00 00 mov $0x0,%eax
400486: e8 1d ff ff ff callq 4003a8 <[email protected]>
40048b: c9 leaveq
40048c: c3 retq
40048d: 90 nop
40048e: 90 nop
40048f: 90 nop
だから私が見る「DUPの@ PLT」を見て:
00000000004003a8 <[email protected]>:
4003a8: ff 25 7a 04 20 00 jmpq *2098298(%rip) # 600828 <_GLOBAL_OFFSET_TABLE_+0x20>
4003ae: 68 01 00 00 00 pushq $0x1
4003b3: e9 d0 ff ff ff jmpq 400388 <_init+0x18>
だから、私は、すべてのシステムコールのベクトルを持っていると仮定ことになる、「グローバルオフセットテーブル」に電話を作っています。他の記事と同様に、カーネルソース(または標準のライブラリソース?)を参照してください。
私はあなたがこれをやりたいとは思わないです。システムコール処理は複雑です(http://www.ibm.com/developerworks/linux/library/l-system-calls/参照)。この質問に「linux」というタグが付いているので、ソースコードはkernel.orgからダウンロードできます(これはアセンブリコードよりもはるかに理解しやすくなります)。
確かに、システムコールの実装はコードによって理解できます。 – shingaridavesh
Linuxシステムコールを理解するには、コードを参照してください。
重要なファイルは、次のとおりです。
/include/linux/syscalls.h(サポートされているすべてのシステムがLinuxで呼び出す)
/arch/arm/kernel/entry-common.S(レジスタ・レベルでシステム・コールの実装)
/arch/arm/kernel/calls.S(システムコール番号)
/arch/arm/include/asm/unistd.h(システムCのアドレスすべての)
注:システムコールテーブルは、のみのみsystem.mapから対処することができます。
- 1. Kubernetes - クラスタを解体する方法は?
- 2. モカモックを解体する方法は?
- 3. Javaでシステムコールをキャッチする方法は?
- 4. UINavigationController全体を解放する方法
- 5. カーネルスペースで別のシステムコールからシステムコールを作る方法
- 6. シグナルがシステムコールを中断する方法
- 7. システムコールでCファイルをコンパイルする方法
- 8. システムコールを逆アセンブルする方法
- 9. ルートデバイスではなくアンドロイドのシステムコールをトレースする方法は?
- 10. ionic2でイオンスライドを解体する方法は?
- 11. Javaメソッド本体を解析する方法は?
- 12. 私は必要な構造体ポインタを解放する方法
- 13. SoapClientから構造体を解析する方法 - > __ getTypes()?
- 14. 配列からキーを解体する方法(ES6)
- 15. C++で2Dベクトルを解体する方法
- 16. タプル構造体を参照で分解する方法
- 17. 不完全な構造体を解凍する方法
- 18. ``構造体や共用体ではないメンバー 'tv_sec'の要求 ``システムコールlinux
- 19. EINTR(中断されたシステムコール)を処理する方法
- 20. Linuxカーネルでタスクのシステムコールの時間を制限する方法
- 21. Linuxカーネルを再コンパイルせずに自分のシステムコールを実装する方法は?
- 22. golangの構造体を解析して構造体から項目を出力する方法は?
- 23. "spring.config.location"を体系化する方法は?
- 24. 液体コードをスキップする方法は?
- 25. Cでfork()システムコールの実行時間を計算する方法は?
- 26. Linuxカーネル4.xで自分のシステムコールを実装する方法は?
- 27. 球体を四面体にマッピングする方法は?
- 28. execveシステムコールをラップするには?
- 29. select()システムコールはブロック解除されません
- 30. 私の流星の方法を単体テストする方法は?
PLTとGOTは動的リンカー構造です。 PLTまたはプロシージャのリンクテーブルには、動的関数への間接ジャンプ(GOTによる)と 'dl_runtime_resolve()へのフォールバックジャンプが含まれています。 GOT(グローバルオフセットテーブル)には、既に解決された機能のアドレス、または間接ジャンプに続くPLTの命令が含まれているため、フォールバックジャンプにリダイレクトすることができます。 – ninjalj