亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 15559 | 回復(fù): 17
打印 上一主題 下一主題

[文本處理] awk、sed 這些工具如何修改二進(jìn)制文件中的某些字節(jié)? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-08-10 22:34 |只看該作者 |倒序?yàn)g覽
本帖最后由 Calvin00 于 2012-08-10 22:37 編輯

我要批量修改一堆編譯出來(lái)的二進(jìn)制可執(zhí)行文件,要修改二進(jìn)制文件中的一些字節(jié),相當(dāng)于對(duì)二進(jìn)制文件打patch做一些細(xì)微修改,修改后仍然可以執(zhí)行?煞裼 awk、sed 這些流編輯器實(shí)現(xiàn)?

附件(psxy)是一個(gè)樣本,為 Mac OS X 下編譯出來(lái)的 Mach-O 64-bit executable x86_64 可執(zhí)行文件(linux下的二進(jìn)制可執(zhí)行文件為 ELF 格式,不過(guò)道理相同)。
  1. CalvintekiMacBook-Pro:~ calvin$ otool -L psxy
  2. psxy:
  3.         /opt/local/lib/gmt4/lib/libgmtps.4.dylib (compatibility version 4.0.0, current version 4.5.8)
  4.         /opt/local/lib/gmt4/lib/libgmt.4.dylib (compatibility version 4.0.0, current version 4.5.8)
  5.         /opt/local/lib/gmt4/lib/libpsl.4.dylib (compatibility version 4.0.0, current version 4.5.8)
  6.         /opt/local/lib/libnetcdf.7.dylib (compatibility version 10.0.0, current version 10.0.0)
  7.         /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
復(fù)制代碼
(Mac OS X 下的 otool -L 功能相當(dāng)于 linux 下的 ldd )

現(xiàn)在,我想批量地把這堆二進(jìn)制文件的動(dòng)態(tài)鏈接庫(kù)路徑修改掉,/opt/local/ 統(tǒng)統(tǒng)修改為 /usr/local/ 。我們知道可以用 ghex 等工具一個(gè)一個(gè)地手工打開(kāi),查找,修改。不過(guò)現(xiàn)在我有一大堆這些待改的文件,用ghex這些工具一個(gè)個(gè)該很費(fèi)勁,所以希望寫(xiě)一個(gè)shell腳本,用 awk、sed 等流編輯工具批量地搜索這對(duì)二進(jìn)制文件,把凡是 /opt/local/ 這樣的動(dòng)態(tài)鏈接庫(kù)路徑全部批量修改成 /usr/local/ 。我試了很多次,不知道怎樣輸出回二進(jìn)制文件格式。

下面是一些實(shí)驗(yàn):
  1. CalvintekiMacBook-Pro:~ calvin$ head -c 16 psxy > test

  2. CalvintekiMacBook-Pro:~ calvin$ file test
  3. test: Mach-O 64-bit executable x86_64

  4. CalvintekiMacBook-Pro:~ calvin$ od -An -tx1 test | sed 's/           //g' | sed 's/  //g'
  5. cffaedfe070000010300008002000000

  6. CalvintekiMacBook-Pro:~ calvin$ od -An -tx1 test | sed 's/           //g' | sed 's/  //g' | od -An -tx1
  7.            63  66  66  61  65  64  66  65  30  37  30  30  30  30  30  31
  8.            30  33  30  30  30  30  38  30  30  32  30  30  30  30  30  30
  9.            0a  0a                                                        

  10. 現(xiàn)在,我怎樣把 cffaedfe070000010300008002000000 還原并輸出成跟文件 test 一樣的二進(jìn)制文件? 解決了這個(gè)問(wèn)題的話,我想用 awk 和 sed 批量 patch 二進(jìn)制可執(zhí)行文件就很容易了。
復(fù)制代碼
求高手和大神們幫助。

psxy.zip (16.94 KB, 下載次數(shù): 45)

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-08-10 23:19 |只看該作者
od -An -w1 -tu1 | ... | awk '{printf("%c",$0)}'

論壇徽章:
1
摩羯座
日期:2014-12-29 15:59:36
3 [報(bào)告]
發(fā)表于 2012-08-10 23:30 |只看該作者
awk一個(gè)就夠了

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2012-08-11 01:22 |只看該作者
回復(fù) 2# hbmhalley

Mac OS X 下的 od 不支持你這種用法:
  1. CalvintekiMacBook-Pro:~ calvin$ od -An -w1 -tu1 psxy
  2. od: illegal option -- w
  3. usage: od [-aBbcDdeFfHhIiLlOosvXx] [-A base] [-j skip] [-N length] [-t type]
  4.           [[+]offset[.][Bb]] [file ...]
復(fù)制代碼

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2012-08-11 02:02 |只看該作者
回復(fù) 4# Calvin00


    od -An -tu1 | ... | awk '{for (i=1;i<=NF;++i) printf("%c",$i)}'

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2012-08-11 04:38 |只看該作者
本帖最后由 Calvin00 于 2012-08-11 04:44 編輯

回復(fù) 5# hbmhalley
這是不行的。你自己試試便知。

我們只需要做一個(gè)小實(shí)驗(yàn)便可驗(yàn)證:

CalvintekiMacBook-Pro:~ calvin$ file psxy
psxy: Mach-O 64-bit executable x86_64

CalvintekiMacBook-Pro:~ calvin$ head -c 16 psxy >test

CalvintekiMacBook-Pro:~ calvin$ file test
test: Mach-O 64-bit executable x86_64

CalvintekiMacBook-Pro:~ calvin$ od -An -tx1 test
          cf  fa  ed  fe  07  00  00  01  03  00  00  80  02  00  00  00
(這里還輸出了一個(gè)空行)

CalvintekiMacBook-Pro:~ calvin$ od -An -tx1 test | sed 's/           //g' | awk '{if($0){print $0}}'
cf  fa  ed  fe  07  00  00  01  03  00  00  80  02  00  00  00

CalvintekiMacBook-Pro:~ calvin$ od -An -tx1 test | sed 's/           //g' | awk '{if($0){print $0}}' | awk '{for(i=1;i<=NF;i++){printf ("%c",$i)}}' > output

CalvintekiMacBook-Pro:~ calvin$ file output
output: data

CalvintekiMacBook-Pro:~ calvin$ od -An -tx1 test | sed 's/           //g' | awk '{if($0){print $0}}' | awk '{for(i=1;i<=NF;i++){printf ("%c",$i)}}' | od -An -tx1
           63  66  65  66  07  00  00  01  03  00  00  50  02  00  00  00
(這里還輸出了一個(gè)空行)

前后對(duì)比,輸出顯然沒(méi)有還原回跟 test 一樣的二進(jìn)制文件。

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2012-08-11 04:52 |只看該作者
回復(fù) 3# ziyunfei


    你試試把串 “cf  fa  ed  fe  07  00  00  01  03  00  00  80  02  00  00  00” 用 awk 輸出到一個(gè)文件中,用 file 檢查文件類型是 Mach-O 64-bit executable x86_64 ,并且用 od -An -tx1 查看你得到的文件,輸出仍然是串 “cf  fa  ed  fe  07  00  00  01  03  00  00  80  02  00  00  00” ?

單單 awk 似乎不行。

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2012-08-11 05:49 |只看該作者
本帖最后由 Calvin00 于 2012-08-11 05:50 編輯

以下命令似乎可以將從 psxy 開(kāi)頭拿出來(lái)的16個(gè)字節(jié)還原回去:
head -c 16 psxy | od -An -tu1 | awk '{for(i=1;i<=NF;i++){printf ("%c",$i)}}' > header

file header 輸出結(jié)果為 Mach-O 64-bit executable x86_64
od -An -tx1 header 輸出結(jié)果為 cf  fa  ed  fe  07  00  00  01  03  00  00  80  02  00  00  00

看來(lái) awk 的 printf %c 只能將 unsigned decimal 轉(zhuǎn)換成單個(gè)字符,如果是十六進(jìn)制就會(huì)轉(zhuǎn)換成不正確的結(jié)果。

貌似正確了,問(wèn)題貌似解決了。
不過(guò),還不能高興得太早。當(dāng)把這條命令應(yīng)用到整個(gè)完整的 psxy 文件時(shí),得到的結(jié)果文件仍然跟原來(lái)的 psxy 不同,而且不能運(yùn)行。

od -An -tu1 psxy | awk '{for(i=1;i<=NF;i++){printf ("%c",$i)}}' > psxy-new

CalvintekiMacBook-Pro:~ calvin$ ls -l psxy
-rwxr-xr-x  1 calvin  staff  44184  8 10 16:38 psxy

CalvintekiMacBook-Pro:~ calvin$ file psxy
psxy: Mach-O 64-bit executable x86_64

CalvintekiMacBook-Pro:~ calvin$ ls -l psxy-new
-rw-r--r--  1 calvin  staff  39822  8 11 05:41 psxy-new

CalvintekiMacBook-Pro:~ calvin$ file psxy-new
psxy-new: Mach-O 64-bit executable x86_64

得到的 psxy-new 大小跟原來(lái)的 psxy 不一致,加上可執(zhí)行權(quán)限后試運(yùn)行之,不能運(yùn)行:

CalvintekiMacBook-Pro:~ calvin$ chmod +x psxy-new
CalvintekiMacBook-Pro:~ calvin$ ./psxy-new
-bash: ./psxy-new: Malformed Mach-o file

(提示 psxy-new 為畸形的 Mach-o 文件)

還是不行!
求高手指點(diǎn)迷津。如果你使用 linux ,可以隨便到 /usr/bin 下拿一個(gè)二進(jìn)制可執(zhí)行文件來(lái)做試驗(yàn),看看結(jié)果怎么樣。

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2012-08-11 07:15 |只看該作者
本帖最后由 Calvin00 于 2012-08-11 14:16 編輯

我在 linux 下拿 /bin/pwd 來(lái)做試驗(yàn),同樣得到的新文件不能運(yùn)行。

仔細(xì)對(duì)比了一下原始 /bin/pwd 跟經(jīng)過(guò) od -An -tu1 /bin/pwd | awk '{for(i=1;i<=NF;i++){printf ("%c",$i)}}'  > ~/pwd-new 得到的 pwd-new 文件,發(fā)現(xiàn) awk 在轉(zhuǎn)換某些 ASCII 碼為字符時(shí)出現(xiàn)錯(cuò)誤(大多數(shù)轉(zhuǎn)換正確,中間夾雜一些錯(cuò)誤)。

有幾個(gè)轉(zhuǎn)換錯(cuò)誤的被我抓了出來(lái):

echo 248 | awk '{printf("%c",$0)}' | od -An -tu1 不能得到希望的 248 而會(huì)得到 195 184
echo 131 | awk '{printf("%c",$0)}' | od -An -tu1 不能得到希望的 131 而會(huì)得到 194 131


問(wèn)題就出現(xiàn)在類似 248、131 這些碼上,導(dǎo)致整個(gè)出來(lái)的二進(jìn)制文件畸形、損壞,不能運(yùn)行。

這是咋回事呢????

嗯,在 debian linux 下,小于或等于 127 的 ascii 碼, awk '{printf("%c",$0)}' | od -An -tu1 可以得到跟原來(lái)一樣的碼;
大于127小于或等于191的ascii碼,awk '{printf("%c",$0)}' | od -An -tu1 會(huì)得到 194 + 原來(lái)的碼;
大于或等于192小于255的 ascii 碼,awk '{printf("%c",$0)}' | od -An -tu1 可以得 195 +從128開(kāi)始的編碼。

是說(shuō) linux 下的 gawk %c 打印大于127的擴(kuò)展ascii有問(wèn)題?

但是,在 Mac OS X 下,awk printf %c 輸出大于 127 的ASCII碼又沒(méi)有問(wèn)題:

echo 248 | awk '{printf("%c",$0)}' | od -An -tu1 能得到希望的 248
echo 131 | awk '{printf("%c",$0)}' | od -An -tu1 能得到希望的 131


真是奇怪,linux 下跟 Mac OS X 下還不同。linux 下的是 gawk ,估計(jì)有bug?

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2012-08-11 08:37 |只看該作者
回復(fù) 1# Calvin00


        這個(gè)需求有難度丫
給lz一個(gè)曲線救國(guó)的建議:在/opt/local對(duì)應(yīng)目錄下建立鏈接至/usr/local對(duì)應(yīng)的文件試試。。。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP