當前位置:首頁 » 編程軟體 » 反編譯gcc

反編譯gcc

發布時間: 2023-05-29 14:09:14

『壹』 ubuntu中怎麼查看文件是gcc編譯出來的還是arm-linux-gcc編譯的

使用objmp試試吧
如果是ubuntu下得gcc編譯出來的話,應該帶有i386字樣

具體方法(假設要看a.out)
objmp -a a.out
我的輸出為:
a.out: file format elf32-i386
如果是跨平台的話,比如我這邊 mips編譯出來的 用objmp看到的就是 file format elf32-little

如果通過這個-a參數還區別不出來 可以試試其他的。比如 -d 反編譯看下

『貳』 linux 下如何將動態鏈接庫.so進行反編譯後,換編譯器重新編譯

程序能不能正常運行取決於程序和動態庫之間的ABI是否兼容。只要ABI兼容那麼編譯器版本就沒有影響。高版本的編譯器同樣可以使用低版本的ABI來生成目標代碼,但這個問題要具體分析。你解決問題的思路完全不對。

『叄』 在linux下面,編譯c文件。不小心用了gcc x.c -o x.c,這樣就把源文件給覆蓋了。請問如何恢復源文件。謝謝。

反編譯

『肆』 如何用匯編實現C語言函數調用

1。對於「匯編調用」:
我知道你要調用func,而不是它本身,但如果這個函數比較復雜時是必須用逆向先分析func這個函數,然後再確定參數列表和返回值的……

2。對於你的內聯匯編的代碼:
這里到底要不要用add %3, %%rsp;還是一個問題,因為要看函數使用的是什麼調用標准,有標准C的,VB的,Pascal的,包括fastcall,stdcall,cdecl等……

3。對於「知道函數參數的起始地址和長度」:
這個的話,除了參數中有字元數組和直接結構體什麼的,所有的基本變數基本都是每8位元組(64位)一個,並且Intel一般都用bigendian的,也就是說,在內存中 01 02 03 04 05 06 07 08 讀入寄存器後會變為: 0x0807060504030201
所以說對於簡單的函數,用8位元組一個參數來做就好了……
而對於有字元數組什麼的就必須用逆向分析了……

這個……只能進行逆向分析了……
反正你知道了函數的地址和長度……
就是你把編譯為機器碼的程序用反編譯工具翻譯成匯編,然後分析一下就好了,C語言的匯編還是比較簡單……
比如這個函數:
int func(int a, int* b) {
// float要用到CPU的FPU,指令記不得,要查下
// 為了簡單就改為int*
printf("a = %d, b = %d\n", a, *b);
return a;
}
編譯成機器碼後,反編譯,如果不加優化,一般都會這樣:
(假設函數入口地址為0400000h)
sub_0400000:
push rbp
mov rbp,rsp ; C函數參數度取使用堆棧式

; 參數在內存中這樣: |...| a | b | ... |
; 由於是64位,故8位元組對齊
mov rax,[rbp+8] ; rax = *(rbp+8) // 這里就是 rax = a
push rsi
mov rsi,[rbp+16] ; rsi = *(rbp+16) // rsi = b

; 調用C函數都是這樣堆棧式,最後一個參數最先入棧
push [rsi]
push rax
push "a = %d, b = %d\n" ; 這里是便於理解,實際上是push這個字元串常量的指針
call printf ; printf("a = %d, b = %d\n",rax,*rsi)
add rsp,24 ; 平衡堆棧,用了3個參數,要還原3*8=24位元組,但根據函數類型的不同去平衡,像調用VB的函數就不需要平衡堆棧……

; 還原數據
mov rsp,rbp
pop rsi
pop rbp

; 一般返回數據都用rax裝載
mov rax,[rbp+8] ;rax=a
ret ; return rax

想調用未知參數列表的函數就是把以上過程倒過來,看著匯編把C的代碼寫出來……
破解注冊碼什麼也是這樣玩的……
實際上你可以直接用反編譯的軟體,比如IDA,直接自動分析,它反編譯的雖然是匯編,但參數列表還是大部分都顯示的……
但是,當編譯器加優化大部分情況就必須自己分析了,因為:
int func(int a, int* b) {
printf("a = %d, b = %d\n", a, *b);
return a;
}
在優化情況下可能為(直接用寄存器傳遞數據):
sub_040000:
push rdx
mov rdx,rax
push rax
push rbx
push "a = %d, b = %d\n"
call printf
mov rax,rdx
pop rdx
ret

其實像www.pediy.com看雪學院有不少這方面的教程……

『伍』 你好,軟體的源代碼可以看到嗎比如說gcc編譯器,我想改進它必須要知道她的源代碼嗎,然後修改是嗎

編譯之後的軟體,是不能看到源碼的。
有反編譯類的軟體,但效果很一般,達不到反編譯源碼再修改後編譯的程度。
修改gcc編譯器之類的軟體,是個很復雜的工作,在沒有源碼的情況下修改,幾乎不可完成。
另外有些軟體,支持二次開發介面的,可以做允許范圍之內的調整,但核心部分沒有哪個軟體可以。

『陸』 反編譯C和C++代碼哪個更難點

用gcc編譯的代碼,你試試objmp 看看反匯編的結果
objmp -d + 可執行文件
objmp -d + .o文件

『柒』 gcc為什麼不能識別.o文件

gcc只能把n個.o文件編譯生成可執行文件,但不能進行反編譯,除非有源碼。

『捌』 VB或VC編譯的DLL文件可以部分反編譯嘛

"DIONNELLE" 為常量,所以會放在程序的某個地方,有一個地址。

md5(md5(md5("DIONNELLE"))); 這樣子是沒有什麼作用的。

反匯編出來也是幾個push和call而已,沒有什麼作用

//////////////
VB\BC等編譯過的DLL文件,目前還不能完全反編譯

無論是exe還是dll都可以反匯編,即使靜態不行,也可以動態調試。
破解反匯編就行 了,不一定要反編譯。

//////////////////////////////
可以得到字元串的話,有可能得到是MD5三次循環嘛?

根據call的調用地址,絕對可以看出你是對同一個函數的三次調用。
至於看出你是否採用的是md5演算法。這是根據代碼的特徵分析的。

如果要防止破解,最好給程序加上自己寫的強殼,技術有很多我也說不了

,我也是略知一二而已,就不多說了。

『玖』 gcc下怎麼將 .0後綴反編譯成源代碼

那叫反編譯 但是所有的反編譯只能還原為匯編代碼 以描述程序流程

命令是 objmp , 將2進制代碼還原為C/C++代碼的軟體不存在

熱點內容
解壓到當前文件夾右鍵 發布:2024-04-26 03:57:08 瀏覽:979
html5android教程視頻下載 發布:2024-04-26 03:09:59 瀏覽:867
伺服器的描述是什麼 發布:2024-04-26 03:08:32 瀏覽:394
個人加密 發布:2024-04-26 03:01:23 瀏覽:521
linuxusbgadget 發布:2024-04-26 02:52:54 瀏覽:304
我的世界空島世界伺服器地址 發布:2024-04-26 01:39:08 瀏覽:248
尼爾機械紀元加密 發布:2024-04-26 01:37:11 瀏覽:868
在控制台輸出sql語句 發布:2024-04-26 01:08:12 瀏覽:432
動畫java 發布:2024-04-26 01:02:40 瀏覽:12
得力文件夾5302 發布:2024-04-26 00:21:32 瀏覽:91