這個(gè)一般沒(méi)有要求。一般/lib /usr/lib 其它的要看具體情況。。。 如果你是自己編譯的應(yīng)用程序,.so文件一般就在安裝目錄下的lib目錄中。

創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作與策劃設(shè)計(jì),懷遠(yuǎn)網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:懷遠(yuǎn)等地區(qū)。懷遠(yuǎn)做網(wǎng)站價(jià)格咨詢:18980820575
你是什么Linux,不開(kāi)源嗎?linux都是開(kāi)放源碼的,你修改過(guò)后,重新編譯一下內(nèi)核,就可以了,不需要反編譯的
具體步驟如下:
#! /bin/sh
set -x
#
# 一般gzip壓縮包的magic值為0x8b1f后跟0x0008,或者0x0808。
# 這里就是要找出這個(gè)偏移。
# 119116,就是這個(gè)偏移,這個(gè)偏移在不同的bzImage里是不同的,所以,這里需要手動(dòng)調(diào)整一下。
# 解壓后的文件即vmlinux.bin
od -h -A d bzImage | grep --color -m 3 -A 1 -i 8b1f
dd if=bzImage bs=1 skip=11916 | gunzip vmlinux.bin
# 調(diào)用我寫(xiě)的一個(gè)python腳本,生成gnu linker script。
./genlds.py vmlinux.elf.lds
# 構(gòu)造 ELF 信息,結(jié)果文件為vmlinux.elf
ld -m elf_x86_64 --format binary --oformat elf64-x86-64 -T vmlinux.elf.lds vmlinux.bin -o vmlinux.elf
# 如果是32位系統(tǒng),可以用以下命令
#ld -m elf_i386 --format binary --oformat elf32-i386 -T vmlinux.elf.lds vmlinux.bin -o vmlinux.elf
# 刪除在上一步生成的多余符號(hào)。
objcopy --strip-symbol _binary_vmlinux_bin_start --strip-symbol _binary_vmlinux_bin_end --strip-symbol _binary_vmlinux_bin_size vmlinux.elf
# 設(shè)置 .text section標(biāo)志,否則objdump -d不能正常工作,只能用objdump -D。
objcopy --set-section-flag .text=alloc,readonly,code vmlinux.elf
# 以后只是出于驗(yàn)證目的。
# 以schedule函數(shù)作為一個(gè)樣本,檢查在vmlinux.elf文件里是不是包括了正確的偏移。
grep --color "[tT] schedule$" System.map
readelf -s vmlinux.elf | grep " schedule$" --color
genlds.py內(nèi)容如下:
#! /usr/bin/python
import sys
#將 形如 fffffff8989 的字符串轉(zhuǎn)換為數(shù)字形式。
def to_no(hexstr):
ret = 0
start = -1
len_hexstr = len(hexstr)
while start=-len_hexstr:
c = hexstr
if c in "0123456789":
n = ord(c) - ord('0')
elif c in "abcdef":
n = ord(c) - ord('a') + 0xa
elif c in "ABCDEF":
n = ord(c) - ord('A') + 0xa
ret |= long(n((-start-1)*4))
start -= 1
return ret
# 計(jì)算addr-base
def sym_offset(addr, base):
if base == "missing-base":
return "missing-offset"
addr = to_no(addr)
base = to_no(base)
return hex(int(addr-base))
lines = file("System.map").readlines()
result=""
# 求.text的開(kāi)始地址
base="missing-base"
for line in lines:
line = line.strip()
addr, type, sym = line.split(" ")
if type in "tT":
if sym in ("startup_64", "startup_32"):
base = addr
break
# 生成lds中的符號(hào)行。
for line in lines:
line = line.strip()
addr, type, sym = line.split(" ")
if type in "tT":
offset = sym_offset(addr, base)
result+="\t%s = %s; /* orig: 0x%s */\n" % (sym, offset, addr)
# 生成需要的腳本
template="""
OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
OUTPUT_ARCH(i386:x86-64)
Linux 下調(diào)試匯編代碼既可以用 GDB、DDD 這類(lèi)通用的調(diào)試器,也可以使用專門(mén)用來(lái)調(diào)試匯編代碼的 ALD(Assembly Language Debugger)。
從調(diào)試的角度來(lái)看,使用 GAS 的好處是可以在生成的目標(biāo)代碼中包含符號(hào)表(symbol table),這樣就可以使用 GDB 和 DDD 來(lái)進(jìn)行源碼級(jí)的調(diào)試了。要在生成的可執(zhí)行程序中包含符號(hào)表,可以采用下面的方式進(jìn)行編譯和鏈接:
[xiaowp@gary code]$ as --gstabs -o hello.o hello.s
[xiaowp@gary code]$ ld -o hello hello.o
執(zhí)行 as 命令時(shí)帶上參數(shù) --gstabs 可以告訴匯編器在生成的目標(biāo)代碼中加上符號(hào)表,同時(shí)需要注意的是,在用 ld 命令進(jìn)行鏈接時(shí)不要加上 -s 參數(shù),否則目標(biāo)代碼中的符號(hào)表在鏈接時(shí)將被刪去。
匯編程序員通常面對(duì)的都是一些比較苛刻的軟硬件環(huán)境,短小精悍的ALD可能更能符合實(shí)際的需要,因此下面主要介紹一下如何用ALD來(lái)調(diào)試匯編程序。首先在命令行方式下執(zhí)行ald命令來(lái)啟動(dòng)調(diào)試器,該命令的參數(shù)是將要被調(diào)試的可執(zhí)行程序:
[xiaowp@gary doc]$ ald hello
Assembly Language Debugger 0.1.3Copyright (C) 2000-2002 Patrick Alken
hell ELF Intel 80386 (32 bit), LSB, Executable, Version 1 (current)
Loading debugging symbols...(15 symbols loaded)
ald
當(dāng) ALD 的提示符出現(xiàn)之后,用 disassemble 命令對(duì)代碼段進(jìn)行反匯編:
ald disassemble -s .text
Disassembling section .text (0x08048074 - 0x08048096)
08048074 BA0F000000 mov edx, 0xf
08048079 B998900408 mov ecx, 0x8049098
0804807E BB01000000 mov ebx, 0x1
08048083 B804000000 mov eax, 0x4
08048088 CD80 int 0x80
0804808A BB00000000 mov ebx, 0x0
0804808F B801000000 mov eax, 0x1
08048094 CD80 int 0x80
上述輸出信息的第一列是指令對(duì)應(yīng)的地址碼,利用它可以設(shè)置在程序執(zhí)行時(shí)的斷點(diǎn):
ald break 0x08048088
Breakpoint 1 set for 0x08048088
斷點(diǎn)設(shè)置好后,使用 run 命令開(kāi)始執(zhí)行程序。ALD 在遇到斷點(diǎn)時(shí)將自動(dòng)暫停程序的運(yùn)行,同時(shí)會(huì)顯示所有寄存器的當(dāng)前值:
ald run
Starting program: hello
Breakpoint 1 encountered at 0x08048088
eax = 0x00000004 ebx = 0x00000001 ecx = 0x08049098 edx = 0x0000000Fesp = 0xBFFFF6C0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000
ds = 0x0000002B es = 0x0000002B fs = 0x00000000 gs = 0x00000000
ss = 0x0000002B cs = 0x00000023 eip = 0x08048088 eflags = 0x00000246
Flags: PF ZF IF
08048088 CD80 int 0x80
如果需要對(duì)匯編代碼進(jìn)行單步調(diào)試,可以使用 next 命令:
ald next
Hello, world!
eax = 0x0000000F ebx = 0x00000000 ecx = 0x08049098 edx = 0x0000000Fesp = 0xBFFFF6C0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000
ds = 0x0000002B es = 0x0000002B fs = 0x00000000 gs = 0x00000000
ss = 0x0000002B cs = 0x00000023 eip = 0x0804808F eflags = 0x00000346
Flags: PF ZF TF IF
0804808F B801000000 mov eax, 0x1
若想獲得 ALD 支持的所有調(diào)試命令的詳細(xì)列表,可以使用 help 命令:
ald help
Commands may be abbreviated.
If a blank command is entered, the last command is repeated.
Type `help command'' for more specific information on command.
General commands
attach clear continue detach disassemble
enter examine file help load
next quit register run set
step unload window write
Breakpoint related commands
break delete disable enable ignore
lbreak tbreak
用一個(gè)反匯編調(diào)試器即可。
IDA或者OllyDbg,方便直觀,當(dāng)然VC也有自帶的調(diào)試器,不過(guò)很麻煩,不如IDA或者OD方便。
補(bǔ)充:
DLL 屬于可執(zhí)行文件中的一類(lèi),又稱為動(dòng)態(tài)鏈接庫(kù),不能直接用DEBUG加載,一般由應(yīng)用程序因使用該庫(kù)中的函數(shù),而由操作系統(tǒng)在應(yīng)用程序加載的同時(shí)被加載入特定地址,這個(gè)地址一般是DLL在鏈接時(shí)指定的。當(dāng)DLL被加載到運(yùn)行空間,根據(jù)輸出函數(shù)表,可以得到各個(gè)函數(shù)的入口地址,然后用DEBUG在各個(gè)入口下斷點(diǎn),調(diào)用該函數(shù)時(shí)DEBUG將跟蹤進(jìn)入該函數(shù),從而實(shí)現(xiàn)反匯編。
反匯編屬于逆向工程,逆向工程的主要手段有兩大類(lèi),其中一類(lèi)是動(dòng)態(tài)分析,另一類(lèi)是靜態(tài)分析。
前面提到的方法屬于動(dòng)態(tài)分析,由DEBUG實(shí)現(xiàn)反匯編,該方法不容易得到完整的代碼,一般只能形成一段一段獨(dú)立分散的代碼,同時(shí)由于DEBUG的局限性,反匯編的代碼質(zhì)量多不高,生成的代碼不能直接使用,原因在于DLL在加載時(shí)若沒(méi)有加載到指定地址空間,操作系統(tǒng)將對(duì)代碼進(jìn)行重定向,所以DEBUG只能得到重定向后的代碼,這類(lèi)代碼必須修改每一個(gè)重定向點(diǎn),才能形成可執(zhí)行代碼。作為WINDOWS32位操作系統(tǒng), OLLYDBG是最為優(yōu)秀的調(diào)試、跟蹤、反匯編工具,多窗口運(yùn)行,可以方便的通過(guò)窗口操作完成各類(lèi)動(dòng)作,而不需要像一般DEBUG那樣由命令行來(lái)完成,OLLYDBG還有許多一般調(diào)試器不具備的功能,同時(shí)由于每一代高手不斷的修改,使其具有多種功能,同時(shí)帶來(lái)的就是混亂,誰(shuí)也不知道有多少版本,誰(shuí)也不清楚每個(gè)版本到底增加了什么功能,但就這樣,也是瑕不掩疵, OLLYDBG任然是DEBUG中最強(qiáng)大,最好使用的。
靜態(tài)分析和動(dòng)態(tài)分析不同,靜態(tài)分析直接打開(kāi)原程序,加載而不運(yùn)行,然后直接分析加載的代碼。目前靜態(tài)分析工具,最強(qiáng)大的當(dāng)屬I(mǎi)DA,IDA支持幾乎所有種類(lèi)的匯編語(yǔ)言。
IDA加載應(yīng)用程序有許多選項(xiàng),可以選擇完整的加載整個(gè)程序,也可以選擇加載程序的某個(gè)塊,一般可選擇的是否加載文件頭、資源表、輸入表、輸出表等等。
IDA還支持調(diào)試,也就是說(shuō),當(dāng)你在進(jìn)行反匯編過(guò)程時(shí),可以直接使用IDA來(lái)調(diào)試跟蹤,以分析代碼的動(dòng)態(tài)執(zhí)行情況,不過(guò)就動(dòng)態(tài)跟蹤來(lái)說(shuō),OLLYDBG更為強(qiáng)大。
IDA反匯編的正確率和代碼的復(fù)雜程度有關(guān),對(duì)于正規(guī)開(kāi)發(fā)的代碼,尤其是如果能夠獲得源程序的調(diào)試文件,即所謂的PDB文件,IDA可以讀取PDB文件中的信息,使得反匯編的效率和準(zhǔn)確度大為提高,生成的代碼甚至比源代碼易讀。IDA將反匯編生成的結(jié)果存入IDB文件中。當(dāng)你確認(rèn)反匯編的結(jié)果達(dá)到你的要求,可以讓IDA輸出匯編源代碼,IDA也提供其他格式的輸出,例如HTML文件,便于用戶閱讀。樓主主要是用于分析DLL文件,一般來(lái)說(shuō)這類(lèi)文件更適合做靜態(tài)分析,所以推薦使用IDA來(lái)進(jìn)行。
IDA對(duì)于分析那些加殼或含有大量花指令、混淆代碼、垃圾代碼的程序,反匯編的正確率會(huì)大為下降,因?yàn)镮DA無(wú)法正確的確認(rèn)當(dāng)期位置上的數(shù)值是屬于代碼,還是屬于數(shù)據(jù),是普通C字符,還是DELPHI的字符串,還是UNICODE字符串,是結(jié)構(gòu)數(shù)據(jù)還是數(shù)組還是類(lèi)表(DELPHI生成的代碼中含有大量的類(lèi)表)等等。遇到這種情況,就需要使用者掌握許多技巧,例如可以通過(guò)使用者對(duì)當(dāng)前數(shù)據(jù)的認(rèn)識(shí),指導(dǎo)IDA如何處理當(dāng)前的數(shù)據(jù)。對(duì)于大批量的,具有某些規(guī)律的數(shù)據(jù),IDA還提供了腳本語(yǔ)言(文件尾位idc),通過(guò)對(duì)腳本的執(zhí)行來(lái)指導(dǎo)IDA如何進(jìn)行反匯編。對(duì)于更為復(fù)雜的情況,例如程序是自解壓運(yùn)行的,這時(shí)IDA就沒(méi)有任何能力來(lái)進(jìn)行正確的分析,通常都會(huì)用OLLYDBG動(dòng)態(tài)跟蹤,等程序完成自解壓后從內(nèi)存中將解壓后的代碼完整的挖下來(lái)形成文件,再由IDA進(jìn)行靜態(tài)分析。
對(duì)于成功進(jìn)行反匯編的代碼,IDA根據(jù)代碼的入口、調(diào)用、轉(zhuǎn)移等指令,可以為使用者提供各種格式的程序的流程圖,IDA提供許多格式由用戶選擇,便于用戶理解程序的結(jié)構(gòu)。
匯編語(yǔ)言的科學(xué)定義,其實(shí)就是介于機(jī)器碼(各種01)和高級(jí)語(yǔ)言(如C)之間的一種語(yǔ)言。你用C語(yǔ)言寫(xiě)一段程序,其實(shí)要在機(jī)器上運(yùn)行的話,機(jī)器是不懂的,要經(jīng)過(guò)編譯器、匯編器編譯,變成匯編,最終再變成機(jī)器碼,機(jī)器根據(jù)這些機(jī)器碼的01可以控制硬件電路完成你程序想執(zhí)行的操作。
gcc編譯的程序碼是沒(méi)有“Intel”、“att”之分的??就是二進(jìn)制而已。所謂的“Intel”、“att”是指匯編語(yǔ)言的寫(xiě)作格式。
如果你用yum軟件包管理器,sudo yum install nasm。
如果你用apt-get,sudo apt-get install nasm。
如果不行,就到sourceforge下載nasm的rpm(如果是yum)或deb(apt-get),然后安裝。
如果還不行,下載源碼,然后終端里(在解壓出的目錄下):
./configure
make
sudo make install
最后,ndisasm -b 32 文件名。
順便一說(shuō)安裝的這個(gè)nasm是intel格式的匯編編譯器。相當(dāng)好。然后ndisasm是它附帶的反匯編器。
不好意思沒(méi)法放網(wǎng)址。百度會(huì)把這個(gè)回答給刪掉。
star特530的是ARM匯編的。
新聞名稱:linux反匯編程序命令,反匯編教程
當(dāng)前鏈接:http://chinadenli.net/article1/dssppod.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站營(yíng)銷(xiāo)、企業(yè)網(wǎng)站制作、App開(kāi)發(fā)、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)