dll真的不能反編譯c語言嗎 我嘗試好多方法都不性,世上有沒有人能解決這問題

2021-04-26 06:54:42 字數 7598 閱讀 4141

1樓:匿名使用者

沒有!c語言編譯時,編譯器對應不同

的硬體平臺,行進不同的機器指令編譯,也版就是說,即使是權可移植程式(原始碼可遷移到同硬體平臺進行編譯),編譯後的機器指令也是各不相同的。打個比方,在i386指令系統下編譯原始碼,得到的機器碼和在x64下編譯的機器碼完全不一樣!你說,怎麼個反編譯法?

c語言生成的exe檔案還能不能反編譯成源程式??

2樓:華工大學生

不能.因為同一功能可由不同的語句來實現.不可能由結果推出實現過程.這與一個的人水平沒有必要關係.如:a=a+1與a+=1等價,你說是哪一句呢?

可以反編譯成組合語言程式,專門搞破解用,比如看看註冊碼的生成函式,然後自己寫註冊碼,或者說看看註冊的過程,用軟體引起中斷,然後繞過註冊程式而成功破解.

當然,現在的軟體多數加了殼,需要專門的脫殼工具脫殼後才能反彙編.

3樓:匿名使用者

不能!!!!!!

只能人為的翻譯。

沒有這樣的軟體!!!!!!

如果要是能反編譯,這個世界的程式設計師就全失業了!

4樓:匿名使用者

可以是可以;但那是很高的高手才能做的事。

先反彙編,然後研究分析彙編程式。這裡要求你要懂得編譯原理。

5樓:匿名使用者

反編譯的夢你就別做了 如果都這樣的話 那還有什麼正版軟體? 反編譯後 改改 不就能隨便盜版了?

6樓:陀螺人

算了吧,這你要能做出來你就牛了,世界上的軟體都要寫上你的大名了,呵呵!

7樓:伊·梵

很難反編譯成c原始碼,可以反彙編

誰能幫我把一個hex檔案反編譯為c語言檔案? 100

8樓:兄弟連教育北京總校

檔案有兩種,一種是文字檔案,一種是程式二進位制檔案,不管哪種檔案都可以用十六進位制編碼來顯示,稱為hex檔案。

1、文字hex檔案一般不需要轉成c語言,更多的是程式二進位制檔案,用十六進位制顯示,可以轉換成c語言,一般使用相應的反彙編程式來實現,這方面的工具很多,不同的平臺略有不同。windows平臺一般常用的ollydbg、windbg、ida,linux平臺使用最多的是gdb和linux版的ida。

ollydbg,簡稱od,一般是軟體逆向工程愛好者,最先使用的一個工具,但是因為當下不在更新,所以一般用一般用於學習使用,下圖中左上角的區域即為反彙編區域 ,使用者可以根據彙編指令,分析程式演算法,然後自己編寫**。

在windows平臺,特別是x64平臺,最好用的反彙編工具除還得是windbg。將程式載入windbg後,可以輸入u命令來檢視程式的反彙編**。

拿到這樣的十六進位制**,一般來說,先將其生成二進位制檔案,然後再分析其指令,通過反彙編指令再寫出原始碼。只需要將上面的十六進位制**,儲存到c語言的字串陣列中,寫入到一個exe的檔案空段中,再修改指令將其跳轉到程式入口處即可,這個過程類似於軟體安全領域的殼。

將十六進位制**寫入一個exe檔案後,就可以將exe檔案載入動態偵錯程式進行動態分析或者使用靜態反彙編程式進行靜態分析,兩者的不同在於動態偵錯程式是要執行程式的,而靜態反彙編分析不需要執行程式,所以一般惡意程式,都採用靜態分析。反彙編開頭的一段十六進位制**註釋如下:

4ad75021    5a                     pop     edx                                           ; 函式返回的地址儲存到edx中

4ad75022    64:a1 30000000         mov     eax, dword ptr fs:[30]                        ; 取peb

4ad75028    8b40 0c                mov     eax, dword ptr [eax+c]                        ; peb_link

4ad7502b    8b70 1c                mov     esi, dword ptr [eax+1c]                       ; 初始化列表到esi

4ad7502e    ad                     lods    dword ptr [esi]                               ; [esi]->eax + 8的位置即kernel32.dll的地址

4ad7502f    8b40 08                mov     eax, dword ptr [eax+8]                        ; eax=kernel32.dll的地址

4ad75032    8bd8                   mov     ebx, eax                                      ; ebx=kernel32.dll的基址

4ad75034    8b73 3c                mov     esi, dword ptr [ebx+3c]                       ; esi = pe頭偏移

4ad75037    8b741e 78              mov     esi, dword ptr [esi+ebx+78]                   ; esi為kernel32.dll匯出表的偏移

4ad7503b    03f3                   add     esi, ebx                                      ; esi = kernel32.dll匯出表的虛擬地址

4ad7503d    8b7e 20                mov     edi, dword ptr [esi+20]                       ; edi=ent的偏移地址

4ad75040    03fb                   add     edi, ebx                                      ; edi = ent的虛擬地址

4ad75042    8b4e 14                mov     ecx, dword ptr [esi+14]                       ; ecx = kernel32.dll匯出地址的個數

4ad75045    33ed                   xor     ebp, ebp                                      ; ebp=0

4ad75047    56                     push    esi                                           ; 儲存匯出表虛擬地址

4ad75048    57                     push    edi                                           ; 儲存ent虛擬地址

4ad75049    51                     push    ecx                                           ; 儲存計數

4ad7504a    8b3f                   mov     edi, dword ptr [edi]

4ad7504c    03fb                   add     edi, ebx                                      ; 定位ent中的函式名

4ad7504e    8bf2                   mov     esi, edx                                      ; esi為 要查詢的函式getprocaddress即該call的下一個地址是資料

4ad75050    6a 0e                  push    0e                                            ; 0xe0是getprocaddress函式的字元個數

4ad75052    59                     pop     ecx                                           ; 設定迴圈次數為 0xe

4ad75053    f3:a6                  repe    cmps byte ptr es:[edi], byte ptr [esi]        ; ecx!

=0&&zf=1 ecx=ecx-1 cmps判斷 getprocaddress

4ad75055    74 08                  je      short 4ad7505f                                ; 如果ent中的函式名為getprocaddress跳走

4ad75057    59                     pop     ecx                                           ; 不相等則將匯出地址數出棧

4ad75058    5f                     pop     edi                                           ; ent虛擬地址出棧

4ad75059    83c7 04                add     edi, 4                                        ; edi地址遞增4位元組 因為ent的元素大小為4位元組

4ad7505c    45                     inc     ebp                                           ; ebp用於儲存ent中定位到getprocaddress函式時的計數

4ad7505d  ^ e2 e9                  loopd   short 4ad75048                                ; 迴圈查詢

4ad7505f    59                     pop     ecx

4ad75060    5f                     pop     edi

4ad75061    5e                     pop     esi

4ad75062    8bcd                   mov     ecx, ebp                                      ; 計數儲存於ecx

4ad75064    8b46 24                mov     eax, dword ptr [esi+24]                       ; esi+0x24 ordinal序號表偏移地址

4ad75067    03c3                   add     eax, ebx                                      ; ordinal序號表的虛擬地址

4ad75069    d1e1                   shl     ecx, 1                                        ; ecx邏輯增加2倍  因為ordinal序號是wor型別下面是通過add 來求ordinal所以這裡必須擴大2倍

4ad7506b    03c1                   add     eax, ecx

4ad7506d    33c9                   xor     ecx, ecx                                      ; ecx=0

4ad7506f    66:8b08                mov     cx, word ptr [eax]                            ; 儲存取出的ordinal序號

4ad75072    8b46 1c                mov     eax, dword ptr [esi+1c]                       ; eax 為kenrnel32.dll的eat的偏移地址

4ad75075 >  03c3                   add     eax, ebx                                      ; eax = kernel32.dll的eat虛擬地址

4ad75077    c1e1 02                shl     ecx, 2                                        ; 同上,擴大4倍因為eat中元素為dword值

4ad7507a    03c1                   add     eax, ecx

4ad7507c    8b00                   mov     eax, dword ptr [eax]                          ; eax即為getprocaddress函式的地址 相對虛擬地址,eat中儲存的rva

4ad7507e    03c3                   add     eax, ebx                                      ; 與基址相加求得getprocaddress函式的虛擬地址

4ad75080    8bfa                   mov     edi, edx                                      ; getprocaddress字元到edi

4ad75082    8bf7                   mov     esi, edi                                      ; esi儲存getprocaddress地址

4ad75084    83c6 0e                add     esi, 0e                                       ; esi指向getprocaddress字串的末地址

4ad75087    8bd0                   mov     edx, eax                                      ; edx為getprocaddress的地址

4ad75089    6a 04                  push    4

4ad7508b    59                     pop     ecx                                           ; ecx=4

有經驗的程式設計師, 通過分析即明白上面反彙編**的主要目的就是獲取getprocaddress函式的地址。繼續看反彙編**:

接下來的操作便是通過已獲得地址的getprocaddress()來分別得到getsystemdirectory()、urldownloadtofile()、winexec()及exitprocess()函式的地址,並依次執行。到這裡實際上有經驗的程式設計師,馬上就能寫出c語言**來。 後面的資料區不在分析了,主要是介紹如何操作。

使用c語言,雖然知道了hex檔案的大致流程,但是一般來說,對於彙編指令,更傾向於直接使用asm關鍵字來使用內聯彙編。如下圖所示:

通過這個例項 ,相信應該能理解一個大致的流程啦。

誰能幫我把he檔案反編譯為c語言檔案

檔案有兩種,一種是文字檔案,一種是程式二進位制檔案,不管哪種檔案都可以用十六進位制編碼來顯示,稱為hex檔案。1 文字hex檔案一般不需要轉成c語言,更多的是程式二進位制檔案,用十六進位制顯示,可以轉換成c語言,一般使用相應的反彙編程式來實現,這方面的工具很多,不同的平臺略有不同。windows平臺...

有靠譜的c語言反編譯工具麼,大神們,有知道C語言反編譯工具的嗎

只能反編譯成彙編,反不了c語言,否則軟體的商業機密全無了。大神們,有知道c語言反編譯工具的嗎 有個exe2c的軟體可以 不過反編譯出來的 基本可讀性很差,如果能有那麼好的軟體能把軟體完美的反編譯成源 那軟體的版權如何保證?很簡單的一個思考嘛 有反編譯c語言軟體嗎?ida pro可以,不過反編譯到c,...

C我定義了靜態類編譯成DLL後,在另專案中引用這個DLL,但訪問不了裡面的成員

1 首先開啟a,b專案抄,然後在解決方案資源bai管理器中右擊dub專案選擇新增引用,然zhi後選dao擇專案,裡面會有a專案的。如果沒有開啟同時開啟ab專案,那就沒法引用。注意,同時開啟的意思是,兩個專案開啟在一個環境中。2 還有就是a專案已經生成了dll檔案,那麼一樣,選擇新增引用的時候選擇瀏覽...