『壹』 將匯編代碼轉換為c語言
目前的反編譯軟體,只存在將機器指令碼反匯編成匯編代碼,不存在將匯編代碼反編譯成C語言的,因為匯編代碼是低級語言,最接近於機器碼(具體可查看不同硬體平台的技術資料),每條匯編指令都對應一個固定的機器碼,這樣進行反匯編是可行的,而C語言屬於高級語言,編譯器沒有能力將匯編語言翻譯成C或更高級的語言。
『貳』 請問如何把匯編語言轉成C語言
反過來是可以的,叫反匯編,但匯編無法轉C,因為匯編是機器語言,C最終還是轉化成匯編,想轉的話只能人為的編一個C出來
『叄』 怎樣能將匯編語言轉換成c語言
1、打開IAR FOR STM8工程。
『肆』 有什麼軟體能把匯編語言轉為C語言
把c語言程序編譯鏈接成可執行文件,然後反匯編那個可執行文件,之後你看到的將是c語言程序的等價匯編語言程序.
『伍』 有沒有將c語言源代碼轉換成匯編語言的軟體
如果只是想得到C語言或C++語言的匯編代碼
可以通過指定編譯器的選項來達成目的,這里我們用1998年生產的Windows平台VC6.0的SDK舉例(以傳統的命令行編譯環境方式,對應的IDE集成開發環境可在工程》設置里在編譯選項里加入/Fa即可):
開始》運行,輸入cmd啟動命令行,
若安裝了VC6.0的SDK(或其IDE集成開發環境),默認路徑為"C:\Program Files\Microsoft Visual Studio「
命令行輸入"C:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT"回車執行初始化編譯環境
命令行輸入 mkdir CtoASMTest建立測試目錄,並進入該目錄,命令行輸入 cd CtoASMTest
用記事本建立測試代碼,命令行輸入notepad CtoASM_test.c回車確認,輸入以下測試C代碼
int main(int argc,char* argv[]){
int i;
for(i = 0; i < argc; ++i){
printf("argv[%d] is:\t%s\n",i,argv[i]);
}
printf("CtoASM_test end.\n");
}
若直接默認編譯,命令行輸入cl CtoASM_test.c,則會產生對象文件*.obj和目標文件*.exe
命令行輸入dir 列出測試目錄文件清單如下,多了obj和exe編譯產生的文件
CtoASM_test.c
CtoASM_test.exe
CtoASM_test.obj
若想得到c文件對應的匯編語言文件,可以指定匯編文件產生選項 /Fa,即cl /Fa CtoASM_test.c則會同時產生匯編文件CtoASM_test.asm,內容如下
TITLE CtoASM_test.c
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC _main
EXTRN _printf:NEAR
_DATA SEGMENT
$SG41 DB 'argv[%d] is:', 09H, '%s', 0aH, 00H
ORG $+3
$SG42 DB 'CtoASM_test end.', 0aH, 00H
_DATA ENDS
_TEXT SEGMENT
_argc$ = 8
_argv$ = 12
_i$ = -4
_main PROC NEAR
; File CtoASM_test.c
; Line 1
push ebp
mov ebp, esp
push ecx
; Line 3
mov DWORD PTR _i$[ebp], 0
jmp SHORT $L37
$L38:
mov eax, DWORD PTR _i$[ebp]
add eax, 1
mov DWORD PTR _i$[ebp], eax
$L37:
mov ecx, DWORD PTR _i$[ebp]
cmp ecx, DWORD PTR _argc$[ebp]
jge SHORT $L39
; Line 4
mov edx, DWORD PTR _i$[ebp]
mov eax, DWORD PTR _argv$[ebp]
mov ecx, DWORD PTR [eax+edx*4]
push ecx
mov edx, DWORD PTR _i$[ebp]
push edx
push OFFSET FLAT:$SG41
call _printf
add esp, 12 ; 0000000cH
; Line 5
jmp SHORT $L38
$L39:
; Line 6
push OFFSET FLAT:$SG42
call _printf
add esp, 4
; Line 7
mov esp, ebp
pop ebp
ret 0
_main ENDP
_TEXT ENDS
END
其中還可以產生其它文件,可以參考編譯器的選項說明,命令行輸入cl /?查看幫助,其中關於產生的輸出文件類型可以有以下選擇
-OUTPUT FILES-
/Fa[file] name assembly listing file /Fo<file> name object file
/FA[sc] configure assembly listing /Fp<file> name precompiled header file
/Fd[file] name .PDB file /Fr[file] name source browser file
/Fe<file> name executable file /FR[file] name extended .SBR file
----------------------------------------------
補充,
其它平台的編譯器也有類似的匯編輸出選項,如類Unix平台的GNU編譯器cc -S CtoASM_test.c和gcc -S CtoASM_test.c 都可以通過指定-S選項產生c或c++代碼對應的匯編語言文件。
『陸』 如何將這段匯編語言轉換成C語言
如何將這段匯編語言轉換成C語言?題目分別提供了同一C語言代碼的32位和64位匯編版本:很容易可以得出其源C語言代碼:
int f(int** p){
return (**p=**p+4,*(int*)**p);
}
則函數體的返回值類型是int,參數p的類型是int**,其唯一的語句是return (**p=**p+4,*(int*)**p);
先把結論放在這,節約不想思考的同學的時間,不同編譯器可能會有所不同,lea 0x4(%eax),%ecx指令可能會被編譯器拆開成兩段:mov (%eax),%ecx 和add 0x4,%ecx(對於64位,則是編譯器把lea lea 0x4(%rax),%rcx,拆開成mov (%rax),%rcx 和add 0x4,%rcx,但是效果是一樣的。
根據題目中函數體只有1句代碼的信息,我們至少確定了這個代碼是一個return語句,如此短小的函數當然只需要用到段內跳轉和段內指針,不需要段地址信息,所以指針大小(64位的RIP和32位的EIP)只是偏移量大小,分別為64位(8位元組)和32位(4位元組)。
題目的設問有相當好的引導性,對比查看左邊和右邊的倒數第3個指令,我們可以看出:函數的返回值都是放在eax變數之中,說明返回值的類型大小是4個位元組。而同時,我們知道在C語言中,64位和32位環境下,int類型的大小都是4個位元組,所以第1空的答案不能是只有1位元組的char類型,也不能是在32位環境下大小為4位元組而在64位環境下大小為8位元組的指針類型如char*、int*。綜上,第1空的答案:函數f的返回值類型只能是int。
第2空則是考查C語言函數的參數傳遞,棧式參數傳遞,在call函數f把ip壓入(分別為64位的RIP和32位的EIP)之前,先壓入的是函數的實際參數,其類型暫時不知道,那就得從匯編指令中找出這個信息點:
C語言函數體標志就是:push %ebp→mov %esp,%ebp→函數體內部→pop %ebp→ret(對64位則是:push %rbp→mov %rsp,%rbp→函數體內部→pop %rbp→retq)
兩邊都是同一個簡單的c語句得到的匯編語句(64位和32位),左邊64位的第2、3、4行對應於右邊的第2、3行(64位多用了一個rdi寄存器傳遞參數,可能是編譯器選項不同的緣故,又因為main函數中調用函數f的指令沒有給出,且不一定相同,故不影響判斷)。
兩邊剩下的幾行代碼(左邊2、3、4、5、6、7、8行,右邊2、3、4、5、6、7行)的工作大同小異,從數據流上看(函數體內,對於32位0x8(%ebp)是第一個也是唯一一個參數,對於64位-0x8(%rbp)才是):
*p→eax,*eax→eax,eax+4→ecx(①),*p→edx,ecx→*edx,*eax→eax
可以簡化為:
**p→eax,eax+4→ecx,ecx→**p,***p→eax
再簡化為
**p+4→**p,***p→eax
註:(①)lea 0x4(%eax), %ecx 意思是取有效地址Load Effect Address,相比於mov 0x4(%eax), %ecx使用地址所指向的值*(eax+4)→ecx,lea指令只使用地址的值eax+4→ecx,少做一步。64位也是如此a。
(對於64位則是:
*p→rax,*rax→rax,rax+4→rcx,*p→rdx,rcx→*rdx,*rax→eax
可以簡化為:
**p→rax,rax+4→rcx,rcx→**p,***p→eax
再簡化為
**p+4→**p,***p→eax
)
看到數據流了,C語言語句自然也就呼之欲出了,即return (**p=**p+4,*(int*)**p)。(逗號,運算符的意思是從左到右計算式子,然後返回最後一個)
注意這里的+4指的是4個位元組,而在64位32位中都一樣,於是初步斷定**p是固定大小類型變數,同時返回值是int類型的,故認為它(**p)是int,所以參數p的類型就是int**。
『柒』 怎麼把匯編轉換成C語言
如果 只是簡單的幾行,可以把編譯後的exe文件,用系統自帶的debug(windows鍵+R打開 運行窗口 輸入debug 空格 exe的路徑)打開debug後,輸入U可以看到幾行匯編代碼。
如果是源代碼 在vs編譯器中調試運行,菜單上的:調試--窗口--反匯編 可以查看,如果是其他編譯器 仔細找找也帶反匯編的
要資料的話 [天書夜讀-從匯編語言到Windows內核編程].譚文.邵堅磊. 這本書的基礎部分里 有c語言與匯編的轉換
『捌』 匯編語言可以直接轉化為C語言嗎有沒有工具
匯編轉化成C語言是非常困難的 因為有些指令只在匯編裡面有C語言是不支持的
例如對寄存器操作之類的
目前還沒有匯編轉C語言的工具
大多數只能手動轉但是轉過的C語言再生成機器碼沒有原來匯編的效率高
『玖』 可以顯示C語言編譯成匯編語言全過程的編譯器
如果你有用IDE的話,比如Visual Studio、Delphi等,應該都是可以設置C和匯編同時查看的。
一句C對應一句匯編,也相當於「單步編譯」吧!