介紹
測(cè)試代碼源碼、源碼如下:
#include <openssl/evp.h>
#include <openssl/sm2.h>
#include <openssl/rand.h>
#include <iostream>
#include <string>
EVP_PKEY* generate_sm2_key_pair() {
EVP_PKEY_CTX *ctx;
EVP_PKEY *pkey = nullptr;
// 創(chuàng)建EVP_PKEY_CTX
ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, nullptr);
if (!ctx) {
std::cerr << "Error creating EVP_PKEY_CTX for SM2 key generation" << std::endl;
return nullptr;
}
// 初始化SM2密鑰對(duì)生成
if (EVP_PKEY_keygen_init(ctx) <= 0 ||
EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, NID_sm2) <= 0 ||
EVP_PKEY_keygen(ctx, &pkey) <= 0) {
std::cerr << "Error generating SM2 key pair" << std::endl;
EVP_PKEY_CTX_free(ctx);
return nullptr;
}
// 釋放資源
EVP_PKEY_CTX_free(ctx);
return pkey;
}
std::string sm2_encrypt(const std::string &plaintext, EVP_PKEY *pubkey) {
EVP_PKEY_CTX *ctx;
unsigned char *ciphertext = nullptr;
size_t ciphertext_len;
// 創(chuàng)建EVP_PKEY_CTX
ctx = EVP_PKEY_CTX_new(pubkey, nullptr);
if (!ctx) {
std::cerr << "Error creating EVP_PKEY_CTX for encryption" << std::endl;
return "";
}
// 初始化加密操作
if (EVP_PKEY_encrypt_init(ctx) <= 0) {
std::cerr << "Error initializing encryption operation" << std::endl;
EVP_PKEY_CTX_free(ctx);
return "";
}
// 設(shè)置加密參數(shù)(這里可以設(shè)置一些參數(shù),例如填充方式)
// EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING);
// 計(jì)算加密后的長(zhǎng)度
if (EVP_PKEY_encrypt(ctx, nullptr, &ciphertext_len, reinterpret_cast<const unsigned char*>(plaintext.c_str()), plaintext.length()) <= 0) {
std::cerr << "Error computing ciphertext length" << std::endl;
EVP_PKEY_CTX_free(ctx);
return "";
}
// 分配內(nèi)存并執(zhí)行加密操作
ciphertext = new unsigned char[ciphertext_len];
if (EVP_PKEY_encrypt(ctx, ciphertext, &ciphertext_len, reinterpret_cast<const unsigned char*>(plaintext.c_str()), plaintext.length()) <= 0) {
std::cerr << "Error encrypting data" << std::endl;
delete[] ciphertext;
EVP_PKEY_CTX_free(ctx);
return "";
}
// 釋放資源
EVP_PKEY_CTX_free(ctx);
// 返回加密后的數(shù)據(jù)(Base64編碼)
std::string encoded_ciphertext(reinterpret_cast<char*>(ciphertext), ciphertext_len);
delete[] ciphertext;
return encoded_ciphertext;
}
std::string sm2_decrypt(const std::string &ciphertext, EVP_PKEY *privkey) {
EVP_PKEY_CTX *ctx;
unsigned char *plaintext = nullptr;
size_t plaintext_len;
// 創(chuàng)建EVP_PKEY_CTX
ctx = EVP_PKEY_CTX_new(privkey, nullptr);
if (!ctx) {
std::cerr << "Error creating EVP_PKEY_CTX for decryption" << std::endl;
return "";
}
// 初始化解密操作
if (EVP_PKEY_decrypt_init(ctx) <= 0) {
std::cerr << "Error initializing decryption operation" << std::endl;
EVP_PKEY_CTX_free(ctx);
return "";
}
// 計(jì)算解密后的長(zhǎng)度
if (EVP_PKEY_decrypt(ctx, nullptr, &plaintext_len, reinterpret_cast<const unsigned char*>(ciphertext.c_str()), ciphertext.length()) <= 0) {
std::cerr << "Error computing plaintext length" << std::endl;
EVP_PKEY_CTX_free(ctx);
return "";
}
// 分配內(nèi)存并執(zhí)行解密操作
plaintext = new unsigned char[plaintext_len];
if (EVP_PKEY_decrypt(ctx, plaintext, &plaintext_len, reinterpret_cast<const unsigned char*>(ciphertext.c_str()), ciphertext.length()) <= 0) {
std::cerr << "Error decrypting data" << std::endl;
delete[] plaintext;
EVP_PKEY_CTX_free(ctx);
return "";
}
// 釋放資源
EVP_PKEY_CTX_free(ctx);
// 返回解密后的數(shù)據(jù)
std::string decrypted_plaintext(reinterpret_cast<char*>(plaintext), plaintext_len);
delete[] plaintext;
return decrypted_plaintext;
}
int main() {
EVP_PKEY *pubkey = generate_sm2_key_pair();
EVP_PKEY *privkey = pubkey; // 在實(shí)際應(yīng)用中,公鑰和私鑰應(yīng)該分開
if (!pubkey) {
std::cerr << "Error generating SM2 key pair" << std::endl;
return 1;
}
std::string plaintext = "Hello, SM2!";
std::string ciphertext = sm2_encrypt(plaintext, pubkey);
std::string decrypted_text = sm2_decrypt(ciphertext, privkey);
std::cout << "Original Text: " << plaintext << std::endl;
std::cout << "Encrypted Text: " << ciphertext << std::endl;
std::cout << "Decrypted Text: " << decrypted_text << std::endl;
EVP_PKEY_free(pubkey);
return 0;
}
編譯命令
g++ -o sm2_example main.cc -lssl -lcrypto
一、ldd 動(dòng)態(tài)庫(kù)關(guān)系查詢
ldd
是 Linux 下的一個(gè)命令,用于查看可執(zhí)行文件或共享庫(kù)文件的動(dòng)態(tài)鏈接庫(kù)依賴關(guān)系。通過 ldd
命令,你可以確定一個(gè)可執(zhí)行文件或共享庫(kù)文件所依賴的動(dòng)態(tài)鏈接庫(kù)(也就是它們?cè)谶\(yùn)行時(shí)需要加載的庫(kù)文件)。
1.1 命令語(yǔ)法
ldd [OPTIONS] FILE
-
OPTIONS(可選):
ldd
命令支持的一些選項(xiàng),用于控制輸出格式等。常用選項(xiàng)包括:-
-v
或--verbose
:顯示詳細(xì)的版本信息。 -
-u
或--unused
:顯示未使用的直接依賴項(xiàng)。 -
-d
或--data-relocs
:顯示使用 RELRO(Read-only relocations)技術(shù)的 ELF 文件的數(shù)據(jù)重定位信息。
-
-
FILE(必需):指定要查看動(dòng)態(tài)鏈接庫(kù)依賴關(guān)系的可執(zhí)行文件或共享庫(kù)文件的路徑。
1.2 示例
- 示例 1:查看可執(zhí)行文件的動(dòng)態(tài)鏈接庫(kù)依賴關(guān)系
ldd sm2_example
這將顯示該可執(zhí)行文件依賴的動(dòng)態(tài)鏈接庫(kù)。
- 示例 2:查看共享庫(kù)文件的動(dòng)態(tài)鏈接庫(kù)依賴關(guān)系
sudo ldd /lib/x86_64-linux-gnu/libcrypto.so.1.1
這將顯示該共享庫(kù)文件依賴的動(dòng)態(tài)鏈接庫(kù)。
- 示例 3:顯示未使用的依賴項(xiàng)
ldd -u sm2_example
這將顯示可執(zhí)行文件中未使用的直接依賴項(xiàng)。
1.3 ldd安裝
ldd
不是一個(gè)單獨(dú)的軟件包,而是 Linux 系統(tǒng)中的一個(gè)標(biāo)準(zhǔn)工具,通常隨著系統(tǒng)的安裝而自動(dòng)提供。它屬于 GNU Binutils 工具集的一部分,用于顯示可執(zhí)行文件或共享庫(kù)文件的動(dòng)態(tài)鏈接庫(kù)依賴關(guān)系。
如果您的系統(tǒng)上沒有 ldd
命令,這可能是一個(gè)不太常見的情況,但您可以嘗試重新安裝 GNU Binutils 包來獲取 ldd
命令。具體的安裝步驟可能因您使用的 Linux 發(fā)行版而異,以下是幾個(gè)常見的 Linux 發(fā)行版上安裝 GNU Binutils 的方法:
- 在 Ubuntu 或 Debian 上安裝 GNU Binutils
sudo apt-get update
sudo apt-get install binutils
- 在 CentOS 或 RHEL 上安裝 GNU Binutils
sudo yum install binutils
- 在 Fedora 上安裝 GNU Binutils
sudo dnf install binutils
- 在 openSUSE 上安裝 GNU Binutils
sudo zypper install binutils
請(qǐng)注意,您需要具有管理員權(quán)限(通常是 sudo
)才能安裝軟件包。在安裝完成后,ldd
命令應(yīng)該就會(huì)可用了。
二、readelf
readelf
是一個(gè)用于分析 ELF(Executable and Linkable Format)格式二進(jìn)制文件(可執(zhí)行文件和共享庫(kù)文件)的命令行工具。它通常在Linux系統(tǒng)上預(yù)裝,并且是 GNU Binutils 工具集的一部分。readelf
可以提供關(guān)于二進(jìn)制文件的各種信息,包括節(jié)表、符號(hào)表、程序頭、段表等。以下是 readelf
命令的詳細(xì)解釋:
2.1 命令語(yǔ)法
readelf [OPTIONS] FILE
-
OPTIONS(可選):
readelf
命令支持的一些選項(xiàng),用于控制輸出格式、顯示特定部分的信息等。常用選項(xiàng)包括:-
-a
或--all
:顯示所有信息。 -
-h
或--file-header
:顯示文件頭信息。 -
-S
或--sections
:顯示節(jié)表信息。 -
-s
或--symbols
:顯示符號(hào)表信息。 -
-d
或--dynamic
:顯示動(dòng)態(tài)段信息。 -
-r
或--relocs
:顯示重定位信息。
-
-
FILE(必需):指定要分析的 ELF 格式的可執(zhí)行文件或共享庫(kù)文件的路徑。
2.2 readelf使用示例
示例 1:顯示文件頭信息
readelf -h sm2_example
這將顯示指定 ELF 文件的文件頭信息,包括 ELF 類型(32位或64位)、入口地址、段表、節(jié)表等。
示例 2:顯示節(jié)表信息
readelf -S sm2_example
這將顯示指定 ELF 文件的節(jié)表信息,包括每個(gè)節(jié)的名稱、類型、偏移、大小等。
There are 30 section headers, starting at offset 0x4428:
節(jié)頭:
[號(hào)] 名稱 類型 地址 偏移量
大小 全體大小 旗標(biāo) 鏈接 信息 對(duì)齊
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 00000000004002a8 000002a8
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.ABI-tag NOTE 00000000004002c4 000002c4
0000000000000020 0000000000000000 A 0 0 4
[ 3] .note.gnu.build-i NOTE 00000000004002e4 000002e4
0000000000000024 0000000000000000 A 0 0 4
[ 4] .gnu.hash GNU_HASH 0000000000400308 00000308
0000000000000038 0000000000000000 A 5 0 8
[ 5] .dynsym DYNSYM 0000000000400340 00000340
0000000000000348 0000000000000018 A 6 1 8
[ 6] .dynstr STRTAB 0000000000400688 00000688
0000000000000481 0000000000000000 A 0 0 1
[ 7] .gnu.version VERSYM 0000000000400b0a 00000b0a
0000000000000046 0000000000000002 A 5 0 2
[ 8] .gnu.version_r VERNEED 0000000000400b50 00000b50
00000000000000a0 0000000000000000 A 6 4 8
[ 9] .rela.dyn RELA 0000000000400bf0 00000bf0
0000000000000060 0000000000000018 A 5 0 8
[10] .rela.plt RELA 0000000000400c50 00000c50
00000000000002d0 0000000000000018 AI 5 23 8
[11] .init PROGBITS 0000000000401000 00001000
0000000000000017 0000000000000000 AX 0 0 4
[12] .plt PROGBITS 0000000000401020 00001020
00000000000001f0 0000000000000010 AX 0 0 16
[13] .text PROGBITS 0000000000401210 00001210
0000000000000af1 0000000000000000 AX 0 0 16
[14] .fini PROGBITS 0000000000401d04 00001d04
0000000000000009 0000000000000000 AX 0 0 4
[15] .rodata PROGBITS 0000000000402000 00002000
00000000000001c5 0000000000000000 A 0 0 8
[16] .eh_frame_hdr PROGBITS 00000000004021c8 000021c8
0000000000000064 0000000000000000 A 0 0 4
[17] .eh_frame PROGBITS 0000000000402230 00002230
00000000000001d8 0000000000000000 A 0 0 8
[18] .gcc_except_table PROGBITS 0000000000402408 00002408
00000000000000a3 0000000000000000 A 0 0 1
[19] .init_array INIT_ARRAY 0000000000403db8 00002db8
0000000000000010 0000000000000008 WA 0 0 8
[20] .fini_array FINI_ARRAY 0000000000403dc8 00002dc8
0000000000000008 0000000000000008 WA 0 0 8
[21] .dynamic DYNAMIC 0000000000403dd0 00002dd0
0000000000000220 0000000000000010 WA 6 0 8
[22] .got PROGBITS 0000000000403ff0 00002ff0
0000000000000010 0000000000000008 WA 0 0 8
[23] .got.plt PROGBITS 0000000000404000 00003000
0000000000000108 0000000000000008 WA 0 0 8
[24] .data PROGBITS 0000000000404108 00003108
0000000000000010 0000000000000000 WA 0 0 8
[25] .bss NOBITS 0000000000404120 00003118
0000000000000238 0000000000000000 WA 0 0 32
[26] .comment PROGBITS 0000000000000000 00003118
0000000000000023 0000000000000001 MS 0 0 1
[27] .symtab SYMTAB 0000000000000000 00003140
0000000000000960 0000000000000018 28 48 8
[28] .strtab STRTAB 0000000000000000 00003aa0
0000000000000871 0000000000000000 0 0 1
[29] .shstrtab STRTAB 0000000000000000 00004311
0000000000000115 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
l (large), p (processor specific)
示例 3:顯示符號(hào)表信息
readelf -s sm2_example
輸出內(nèi)容
Symbol table '.dynsym' contains 35 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _Znam@GLIBCXX_3.4 (2)
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNKSt7__cxx1112basic_str@GLIBCXX_3.4.21 (3)
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_CTX_new@OPENSSL_1_1_0 (4)
4: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_keygen_init@OPENSSL_1_1_0 (4)
5: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt7__cxx1112basic_stri@GLIBCXX_3.4.21 (3)
6: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt7__cxx1112basic_stri@GLIBCXX_3.4.21 (3)
7: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_encrypt_init@OPENSSL_1_1_0 (4)
8: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_decrypt@OPENSSL_1_1_0 (4)
9: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __cxa_atexit@GLIBC_2.2.5 (5)
10: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZStlsIcSt11char_traitsIc@GLIBCXX_3.4.21 (3)
11: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZStlsISt11char_traitsIcE@GLIBCXX_3.4 (2)
12: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSolsEPFRSoS_E@GLIBCXX_3.4 (2)
13: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSaIcED1Ev@GLIBCXX_3.4 (2)
14: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_free@OPENSSL_1_1_0 (4)
15: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt7__cxx1112basic_stri@GLIBCXX_3.4.21 (3)
16: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_CTX_new_id@OPENSSL_1_1_0 (4)
17: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_CTX_ctrl@OPENSSL_1_1_0 (4)
18: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZdaPv@GLIBCXX_3.4 (2)
19: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt7__cxx1112basic_stri@GLIBCXX_3.4.21 (3)
20: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_decrypt_init@OPENSSL_1_1_0 (4)
21: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNKSt7__cxx1112basic_str@GLIBCXX_3.4.21 (3)
22: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt8ios_base4InitC1Ev@GLIBCXX_3.4 (2)
23: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _Unwind_Resume@GCC_3.0 (7)
24: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSaIcEC1Ev@GLIBCXX_3.4 (2)
25: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_CTX_free@OPENSSL_1_1_0 (4)
26: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_keygen@OPENSSL_1_1_0 (4)
27: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (5)
28: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_encrypt@OPENSSL_1_1_0 (4)
29: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
30: 0000000000404240 272 OBJECT GLOBAL DEFAULT 25 _ZSt4cerr@GLIBCXX_3.4 (2)
31: 0000000000401060 0 FUNC GLOBAL DEFAULT UND _ZSt4endlIcSt11char_trait@GLIBCXX_3.4 (2)
32: 0000000000404120 272 OBJECT GLOBAL DEFAULT 25 _ZSt4cout@GLIBCXX_3.4 (2)
33: 00000000004011a0 0 FUNC GLOBAL DEFAULT UND __gxx_personality_v0@CXXABI_1.3 (6)
34: 0000000000401200 0 FUNC GLOBAL DEFAULT UND _ZNSt8ios_base4InitD1Ev@GLIBCXX_3.4 (2)
Symbol table '.symtab' contains 100 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000004002a8 0 SECTION LOCAL DEFAULT 1
2: 00000000004002c4 0 SECTION LOCAL DEFAULT 2
3: 00000000004002e4 0 SECTION LOCAL DEFAULT 3
4: 0000000000400308 0 SECTION LOCAL DEFAULT 4
5: 0000000000400340 0 SECTION LOCAL DEFAULT 5
6: 0000000000400688 0 SECTION LOCAL DEFAULT 6
7: 0000000000400b0a 0 SECTION LOCAL DEFAULT 7
8: 0000000000400b50 0 SECTION LOCAL DEFAULT 8
9: 0000000000400bf0 0 SECTION LOCAL DEFAULT 9
10: 0000000000400c50 0 SECTION LOCAL DEFAULT 10
11: 0000000000401000 0 SECTION LOCAL DEFAULT 11
12: 0000000000401020 0 SECTION LOCAL DEFAULT 12
13: 0000000000401210 0 SECTION LOCAL DEFAULT 13
14: 0000000000401d04 0 SECTION LOCAL DEFAULT 14
15: 0000000000402000 0 SECTION LOCAL DEFAULT 15
16: 00000000004021c8 0 SECTION LOCAL DEFAULT 16
17: 0000000000402230 0 SECTION LOCAL DEFAULT 17
18: 0000000000402408 0 SECTION LOCAL DEFAULT 18
19: 0000000000403db8 0 SECTION LOCAL DEFAULT 19
20: 0000000000403dc8 0 SECTION LOCAL DEFAULT 20
21: 0000000000403dd0 0 SECTION LOCAL DEFAULT 21
22: 0000000000403ff0 0 SECTION LOCAL DEFAULT 22
23: 0000000000404000 0 SECTION LOCAL DEFAULT 23
24: 0000000000404108 0 SECTION LOCAL DEFAULT 24
25: 0000000000404120 0 SECTION LOCAL DEFAULT 25
26: 0000000000000000 0 SECTION LOCAL DEFAULT 26
27: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
28: 0000000000401250 0 FUNC LOCAL DEFAULT 13 deregister_tm_clones
29: 0000000000401280 0 FUNC LOCAL DEFAULT 13 register_tm_clones
30: 00000000004012c0 0 FUNC LOCAL DEFAULT 13 __do_global_dtors_aux
31: 0000000000404350 1 OBJECT LOCAL DEFAULT 25 completed.7325
32: 0000000000403dc8 0 OBJECT LOCAL DEFAULT 20 __do_global_dtors_aux_fin
33: 00000000004012f0 0 FUNC LOCAL DEFAULT 13 frame_dummy
34: 0000000000403db8 0 OBJECT LOCAL DEFAULT 19 __frame_dummy_init_array_
35: 0000000000000000 0 FILE LOCAL DEFAULT ABS jiami.cc
36: 0000000000402008 1 OBJECT LOCAL DEFAULT 15 _ZStL19piecewise_construc
37: 0000000000404351 1 OBJECT LOCAL DEFAULT 25 _ZStL8__ioinit
38: 0000000000401c4d 62 FUNC LOCAL DEFAULT 13 _Z41__static_initializati
39: 0000000000401c8b 21 FUNC LOCAL DEFAULT 13 _GLOBAL__sub_I__Z21genera
40: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
41: 0000000000402404 0 OBJECT LOCAL DEFAULT 17 __FRAME_END__
42: 0000000000000000 0 FILE LOCAL DEFAULT ABS
43: 00000000004021c8 0 NOTYPE LOCAL DEFAULT 16 __GNU_EH_FRAME_HDR
44: 0000000000403dd0 0 OBJECT LOCAL DEFAULT 21 _DYNAMIC
45: 0000000000403dc8 0 NOTYPE LOCAL DEFAULT 19 __init_array_end
46: 0000000000403db8 0 NOTYPE LOCAL DEFAULT 19 __init_array_start
47: 0000000000404000 0 OBJECT LOCAL DEFAULT 23 _GLOBAL_OFFSET_TABLE_
48: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _Znam@@GLIBCXX_3.4
49: 0000000000404118 0 NOTYPE GLOBAL DEFAULT 24 _edata
50: 0000000000404108 0 NOTYPE WEAK DEFAULT 24 data_start
51: 0000000000402000 4 OBJECT GLOBAL DEFAULT 15 _IO_stdin_used
52: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNKSt7__cxx1112basic_str
53: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_CTX_new@@OPENSSL
54: 00000000004013e5 842 FUNC GLOBAL DEFAULT 13 _Z11sm2_encryptRKNSt7__cx
55: 0000000000401a79 468 FUNC GLOBAL DEFAULT 13 main
56: 0000000000401060 0 FUNC GLOBAL DEFAULT UND _ZSt4endlIcSt11char_trait
57: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_keygen_init@@OPE
58: 0000000000404110 0 OBJECT GLOBAL HIDDEN 24 __dso_handle
59: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt7__cxx1112basic_stri
60: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt7__cxx1112basic_stri
61: 00000000004012f2 243 FUNC GLOBAL DEFAULT 13 _Z21generate_sm2_key_pair
62: 000000000040172f 842 FUNC GLOBAL DEFAULT 13 _Z11sm2_decryptRKNSt7__cx
63: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_encrypt_init@@OP
64: 0000000000401d04 0 FUNC GLOBAL HIDDEN 14 _fini
65: 0000000000401240 1 FUNC GLOBAL HIDDEN 13 _dl_relocate_static_pie
66: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_decrypt@@OPENSSL
67: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __cxa_atexit@@GLIBC_2.2.5
68: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZStlsIcSt11char_traitsIc
69: 0000000000401210 43 FUNC GLOBAL DEFAULT 13 _start
70: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZStlsISt11char_traitsIcE
71: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSolsEPFRSoS_E@@GLIBCXX
72: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSaIcED1Ev@@GLIBCXX_3.4
73: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_free@@OPENSSL_1_
74: 0000000000401000 0 FUNC GLOBAL HIDDEN 11 _init
75: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt7__cxx1112basic_stri
76: 0000000000404118 0 OBJECT GLOBAL HIDDEN 24 __TMC_END__
77: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_CTX_new_id@@OPEN
78: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_CTX_ctrl@@OPENSS
79: 0000000000404120 272 OBJECT GLOBAL DEFAULT 25 _ZSt4cout@@GLIBCXX_3.4
80: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZdaPv@@GLIBCXX_3.4
81: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt7__cxx1112basic_stri
82: 0000000000404108 0 NOTYPE GLOBAL DEFAULT 24 __data_start
83: 0000000000404358 0 NOTYPE GLOBAL DEFAULT 25 _end
84: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_decrypt_init@@OP
85: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNKSt7__cxx1112basic_str
86: 0000000000404118 0 NOTYPE GLOBAL DEFAULT 25 __bss_start
87: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt8ios_base4InitC1Ev@@
88: 0000000000401ca0 93 FUNC GLOBAL DEFAULT 13 __libc_csu_init
89: 00000000004011a0 0 FUNC GLOBAL DEFAULT UND __gxx_personality_v0@@CXX
90: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _Unwind_Resume@@GCC_3.0
91: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSaIcEC1Ev@@GLIBCXX_3.4
92: 0000000000401d00 1 FUNC GLOBAL DEFAULT 13 __libc_csu_fini
93: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_CTX_free@@OPENSS
94: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_keygen@@OPENSSL_
95: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_
96: 0000000000000000 0 FUNC GLOBAL DEFAULT UND EVP_PKEY_encrypt@@OPENSSL
97: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
98: 0000000000404240 272 OBJECT GLOBAL DEFAULT 25 _ZSt4cerr@@GLIBCXX_3.4
99: 0000000000401200 0 FUNC GLOBAL DEFAULT UND _ZNSt8ios_base4InitD1Ev@@
這將顯示指定 ELF 文件的符號(hào)表信息,包括每個(gè)符號(hào)的名稱、地址、大小等。
示例 4:顯示動(dòng)態(tài)段信息
readelf -d sm2_example
這將顯示指定 ELF 文件的動(dòng)態(tài)段信息,包括動(dòng)態(tài)鏈接庫(kù)的信息、重定位表的地址等。
三、nm
nm
命令是一個(gè)用于顯示二進(jìn)制目標(biāo)文件(例如可執(zhí)行文件或共享庫(kù)文件)的符號(hào)表的命令行工具。nm
的名稱代表 “name mangling”,它列出了目標(biāo)文件中的符號(hào),包括函數(shù)名稱、變量名稱和其他標(biāo)識(shí)符,以及它們的地址和類型信息。nm
常用于調(diào)試、分析和監(jiān)視二進(jìn)制文件。
3.1 命令語(yǔ)法
nm [OPTIONS] FILE
-
OPTIONS(可選):
nm
命令支持的一些選項(xiàng),用于控制輸出格式和顯示特定類型的符號(hào)等。常用選項(xiàng)包括:-
-A
或--with-syms
:顯示所有符號(hào),包括未公開的符號(hào)。 -
-C
或--demangle
:對(duì) C++ 的函數(shù)名進(jìn)行解碼(去除名稱修飾)。 -
-g
或--extern-only
:只顯示外部符號(hào)。 -
-t
或--radix
:指定輸出地址的基數(shù)(10、16 等)。 -
-u
或--undefined-only
:只顯示未定義的符號(hào)。 -
-D
或--dynamic
:顯示動(dòng)態(tài)符號(hào)(僅在共享庫(kù)文件中有效)。 -
-l
或--line-numbers
:顯示行號(hào)(如果可用)。 -
-S
或--print-size
:顯示符號(hào)的大小。 -
-h
或--help
:顯示幫助信息。
-
-
FILE(必需):指定要顯示符號(hào)表的二進(jìn)制文件的路徑。
3.2 nm示例
示例 1:顯示所有符號(hào)
nm -A /path/to/your/executable
sm2_example:0000000000404118 B __bss_start
sm2_example:0000000000404350 b completed.7325
sm2_example: U __cxa_atexit@@GLIBC_2.2.5
sm2_example:0000000000404108 D __data_start
sm2_example:0000000000404108 W data_start
sm2_example:0000000000401250 t deregister_tm_clones
sm2_example:0000000000401240 T _dl_relocate_static_pie
sm2_example:00000000004012c0 t __do_global_dtors_aux
sm2_example:0000000000403dc8 t __do_global_dtors_aux_fini_array_entry
sm2_example:0000000000404110 D __dso_handle
sm2_example:0000000000403dd0 d _DYNAMIC
sm2_example:0000000000404118 D _edata
sm2_example:0000000000404358 B _end
sm2_example: U EVP_PKEY_CTX_ctrl@@OPENSSL_1_1_0
sm2_example: U EVP_PKEY_CTX_free@@OPENSSL_1_1_0
sm2_example: U EVP_PKEY_CTX_new_id@@OPENSSL_1_1_0
sm2_example: U EVP_PKEY_CTX_new@@OPENSSL_1_1_0
sm2_example: U EVP_PKEY_decrypt_init@@OPENSSL_1_1_0
sm2_example: U EVP_PKEY_decrypt@@OPENSSL_1_1_0
sm2_example: U EVP_PKEY_encrypt_init@@OPENSSL_1_1_0
sm2_example: U EVP_PKEY_encrypt@@OPENSSL_1_1_0
sm2_example: U EVP_PKEY_free@@OPENSSL_1_1_0
sm2_example: U EVP_PKEY_keygen_init@@OPENSSL_1_1_0
sm2_example: U EVP_PKEY_keygen@@OPENSSL_1_1_0
sm2_example:0000000000401d04 T _fini
sm2_example:00000000004012f0 t frame_dummy
sm2_example:0000000000403db8 t __frame_dummy_init_array_entry
sm2_example:0000000000402404 r __FRAME_END__
sm2_example:0000000000404000 d _GLOBAL_OFFSET_TABLE_
sm2_example:0000000000401c8b t _GLOBAL__sub_I__Z21generate_sm2_key_pairv
sm2_example: w __gmon_start__
sm2_example:00000000004021c8 r __GNU_EH_FRAME_HDR
sm2_example: U __gxx_personality_v0@@CXXABI_1.3
sm2_example:0000000000401000 T _init
sm2_example:0000000000403dc8 t __init_array_end
sm2_example:0000000000403db8 t __init_array_start
sm2_example:0000000000402000 R _IO_stdin_used
sm2_example:0000000000401d00 T __libc_csu_fini
sm2_example:0000000000401ca0 T __libc_csu_init
sm2_example: U __libc_start_main@@GLIBC_2.2.5
sm2_example:0000000000401a79 T main
sm2_example:0000000000401280 t register_tm_clones
sm2_example:0000000000401210 T _start
sm2_example:0000000000404118 D __TMC_END__
sm2_example: U _Unwind_Resume@@GCC_3.0
sm2_example:000000000040172f T _Z11sm2_decryptRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP11evp_pkey_st
sm2_example:00000000004013e5 T _Z11sm2_encryptRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP11evp_pkey_st
sm2_example:00000000004012f2 T _Z21generate_sm2_key_pairv
sm2_example:0000000000401c4d t _Z41__static_initialization_and_destruction_0ii
sm2_example: U _ZdaPv@@GLIBCXX_3.4
sm2_example: U _Znam@@GLIBCXX_3.4
sm2_example: U _ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_strEv@@GLIBCXX_3.4.21
sm2_example: U _ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6lengthEv@@GLIBCXX_3.4.21
sm2_example: U _ZNSaIcEC1Ev@@GLIBCXX_3.4
sm2_example: U _ZNSaIcED1Ev@@GLIBCXX_3.4
sm2_example: U _ZNSolsEPFRSoS_E@@GLIBCXX_3.4
sm2_example: U _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EOS4_@@GLIBCXX_3.4.21
sm2_example: U _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcmRKS3_@@GLIBCXX_3.4.21
sm2_example: U _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_@@GLIBCXX_3.4.21
sm2_example: U _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21
sm2_example: U _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
sm2_example: U _ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4
sm2_example:0000000000404240 B _ZSt4cerr@@GLIBCXX_3.4
sm2_example:0000000000404120 B _ZSt4cout@@GLIBCXX_3.4
sm2_example: U _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
sm2_example:0000000000402008 r _ZStL19piecewise_construct
sm2_example:0000000000404351 b _ZStL8__ioinit
sm2_example: U _ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKNSt7__cxx1112basic_stringIS4_S5_T1_EE@@GLIBCXX_3.4.21
sm2_example: U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4
這將顯示指定的可執(zhí)行文件中的所有符號(hào),包括未公開的符號(hào)。
示例 2:顯示未定義的符號(hào)
nm -u /path/to/your/executable
U __cxa_atexit@@GLIBC_2.2.5
U EVP_PKEY_CTX_ctrl@@OPENSSL_1_1_0
U EVP_PKEY_CTX_free@@OPENSSL_1_1_0
U EVP_PKEY_CTX_new_id@@OPENSSL_1_1_0
U EVP_PKEY_CTX_new@@OPENSSL_1_1_0
U EVP_PKEY_decrypt_init@@OPENSSL_1_1_0
U EVP_PKEY_decrypt@@OPENSSL_1_1_0
U EVP_PKEY_encrypt_init@@OPENSSL_1_1_0
U EVP_PKEY_encrypt@@OPENSSL_1_1_0
U EVP_PKEY_free@@OPENSSL_1_1_0
U EVP_PKEY_keygen_init@@OPENSSL_1_1_0
U EVP_PKEY_keygen@@OPENSSL_1_1_0
w __gmon_start__
U __gxx_personality_v0@@CXXABI_1.3
U __libc_start_main@@GLIBC_2.2.5
U _Unwind_Resume@@GCC_3.0
U _ZdaPv@@GLIBCXX_3.4
U _Znam@@GLIBCXX_3.4
U _ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_strEv@@GLIBCXX_3.4.21
U _ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6lengthEv@@GLIBCXX_3.4.21
U _ZNSaIcEC1Ev@@GLIBCXX_3.4
U _ZNSaIcED1Ev@@GLIBCXX_3.4
U _ZNSolsEPFRSoS_E@@GLIBCXX_3.4
U _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EOS4_@@GLIBCXX_3.4.21
U _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcmRKS3_@@GLIBCXX_3.4.21
U _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_@@GLIBCXX_3.4.21
U _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21
U _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
U _ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4
U _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
U _ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKNSt7__cxx1112basic_stringIS4_S5_T1_EE@@GLIBCXX_3.4.21
U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4
這將顯示指定的可執(zhí)行文件中的未定義(未解析)的符號(hào)。
示例 3:解碼 C++ 函數(shù)名
nm -C sm2_example
這將解碼指定的可執(zhí)行文件中的 C++ 函數(shù)名,去除名稱修飾。文章來源:http://www.zghlxwxcb.cn/news/detail-738423.html
0000000000404118 B __bss_start
0000000000404350 b completed.7325
U __cxa_atexit@@GLIBC_2.2.5
0000000000404108 D __data_start
0000000000404108 W data_start
0000000000401250 t deregister_tm_clones
0000000000401240 T _dl_relocate_static_pie
00000000004012c0 t __do_global_dtors_aux
0000000000403dc8 t __do_global_dtors_aux_fini_array_entry
0000000000404110 D __dso_handle
0000000000403dd0 d _DYNAMIC
0000000000404118 D _edata
0000000000404358 B _end
U EVP_PKEY_CTX_ctrl@@OPENSSL_1_1_0
U EVP_PKEY_CTX_free@@OPENSSL_1_1_0
U EVP_PKEY_CTX_new_id@@OPENSSL_1_1_0
U EVP_PKEY_CTX_new@@OPENSSL_1_1_0
U EVP_PKEY_decrypt_init@@OPENSSL_1_1_0
U EVP_PKEY_decrypt@@OPENSSL_1_1_0
U EVP_PKEY_encrypt_init@@OPENSSL_1_1_0
U EVP_PKEY_encrypt@@OPENSSL_1_1_0
U EVP_PKEY_free@@OPENSSL_1_1_0
U EVP_PKEY_keygen_init@@OPENSSL_1_1_0
U EVP_PKEY_keygen@@OPENSSL_1_1_0
0000000000401d04 T _fini
00000000004012f0 t frame_dummy
0000000000403db8 t __frame_dummy_init_array_entry
0000000000402404 r __FRAME_END__
0000000000404000 d _GLOBAL_OFFSET_TABLE_
0000000000401c8b t _GLOBAL__sub_I__Z21generate_sm2_key_pairv
w __gmon_start__
00000000004021c8 r __GNU_EH_FRAME_HDR
U __gxx_personality_v0@@CXXABI_1.3
0000000000401000 T _init
0000000000403dc8 t __init_array_end
0000000000403db8 t __init_array_start
0000000000402000 R _IO_stdin_used
0000000000401d00 T __libc_csu_fini
0000000000401ca0 T __libc_csu_init
U __libc_start_main@@GLIBC_2.2.5
0000000000401a79 T main
0000000000401280 t register_tm_clones
0000000000401210 T _start
0000000000404118 D __TMC_END__
U _Unwind_Resume@@GCC_3.0
000000000040172f T sm2_decrypt(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, evp_pkey_st*)
00000000004013e5 T sm2_encrypt(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, evp_pkey_st*)
00000000004012f2 T generate_sm2_key_pair()
0000000000401c4d t __static_initialization_and_destruction_0(int, int)
U operator delete[](void*)@@GLIBCXX_3.4
U operator new[](unsigned long)@@GLIBCXX_3.4
U std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::c_str() const@@GLIBCXX_3.4.21
U std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::length() const@@GLIBCXX_3.4.21
U std::allocator<char>::allocator()@@GLIBCXX_3.4
U std::allocator<char>::~allocator()@@GLIBCXX_3.4
U std::ostream::operator<<(std::ostream& (*)(std::ostream&))@@GLIBCXX_3.4
U std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&)@@GLIBCXX_3.4.21
U std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, unsigned long, std::allocator<char> const&)@@GLIBCXX_3.4.21
U std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)@@GLIBCXX_3.4.21
U std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()@@GLIBCXX_3.4.21
U std::ios_base::Init::Init()@@GLIBCXX_3.4
U std::ios_base::Init::~Init()@@GLIBCXX_3.4
0000000000404240 B std::cerr@@GLIBCXX_3.4
0000000000404120 B std::cout@@GLIBCXX_3.4
U std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)@@GLIBCXX_3.4
0000000000402008 r std::piecewise_construct
0000000000404351 b std::__ioinit
U std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@@GLIBCXX_3.4.21
U std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)@@GLIBCXX_3.4
示例 4:顯示動(dòng)態(tài)符號(hào)
nm -D /path/to/your/shared/library.so
這將顯示指定的共享庫(kù)文件中的動(dòng)態(tài)符號(hào),通常用于共享庫(kù)文件。文章來源地址http://www.zghlxwxcb.cn/news/detail-738423.html
到了這里,關(guān)于linux二進(jìn)制文件分析三大工具詳解(ldd、readelf、nm)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!