用OLLDBG脫ASPR1.23(翻譯)
標 題:用OLLDBG脫ASPR1.23(翻譯)
發信人:ikki
時 間:2003年10月09日 07:32
詳細資訊:
這個是論壇上別人轉的一篇帖子,看看裡面手工修復IAT的部分寫的挺詳細,所以大概翻譯了一下,希望能給和我一樣的新手一些幫助。
----by ikki
用OLLDBG脫ASPR1.23
(ASPR 1.23 Unpacking "Step-By-Step")
=========================================================
目標連線: : www.systemcleaner.com
程式: : System Cleaner. 4.91d
作者: : LaBBa
========================
在我開始嘗試脫這個程式和別的新版本的aspr壓縮的程式的時候,我dump下來的檔案都是錯誤的,
因為我在錯誤的地方dump程式,並因此常常導致脫殼後的程式崩潰。所以,這個教程將說明這個
錯誤的原因以及這樣對這個版本的aspr檔案脫殼。
需要的工具:
-----------------------
1) 你的頭腦
2) OllyDbg 1.09d
3) Olly的外掛 : Cmdline and Plug108 (http://home.t-online.de/home/Ollydbg/)
4) ProcDump 或者 Lord-Pe
5) Hview 或者 Hex Editor
6) ImpRec 1.6 Final Public (Mackt/UCF)
* 以及一些pe檔案結構的知識 ..
===============================
脫殼步驟:
===============================
1) 如何繞過Anti-Debugger保護
2) 如何找到合適的位置來dump檔案
3) 如何找到程式真正的OEP
4) 關於stolen bytes
5) 如何用ImpRec修復IAT
6) 如何修復OEP並補上Stolen bytes
7) 致謝
=======================================
如何繞過Anti-Debugger保護:
=======================================
這個版本的ASPR含有Atni-Debugger程式碼
在Cmdline中簡單的設定BP IsDebuggerPresents然後按Shift+F9我們將會到達這裡:
77E72E92 > 64:A1 18000000 MOV EAX,DWORD PTR FS:[18]
77E72E98 8B40 30 MOV EAX,DWORD PTR DS:[EAX+30]
77E72E9B 0FB640 02 MOVZX EAX,BYTE PTR DS:[EAX+2]
77E72E9F C3 RETN
在: MOVZX EAX,BYTE PTR DS:[EAX+2]處
我們看到: BYTE PTR DS:[EAX+2] ==7FFDF002 == 01
01 - 表示發現偵錯程式 .. 所以每次都要把這個值修改為00以便我們能夠執行程式。按Ctrl+F2重新執行程式,執行到上面那個地方,然後在dump視窗中右鍵單擊選擇:轉到-->表示式(GoTo->Expression),輸入地址:7FFDF002,把記憶體中這個地址的值修改為:00。現在我們可以開始脫殼了.
===================================================
如何找到合適的位置來dump檔案
===================================================
一次次的按Shift+F9,一直到我們到達這兒:
00FF3A2C 3100 XOR DWORD PTR DS:[EAX],EAX
00FF3A2E 64:8F05 00000000 POP DWORD PTR FS:[0]
00FF3A35 58 POP EAX
00FF3A36 833D B07EFF00 00 CMP DWORD PTR DS:[FF7EB0],0
00FF3A3D 74 14 JE SHORT 00FF3A53
00FF3A3F 6A 0C PUSH 0C
00FF3A41 B9 B07EFF00 MOV ECX,0FF7EB0
00FF3A46 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
00FF3A49 BA 04000000 MOV EDX,4
00FF3A4E E8 EDD0FFFF CALL 00FF0B40
00FF3A53 FF75 FC PUSH DWORD PTR SS:[EBP-4]
00FF3A56 FF75 F8 PUSH DWORD PTR SS:[EBP-8]
00FF3A59 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
00FF3A5C 8338 00 CMP DWORD PTR DS:[EAX],0
00FF3A5F 74 02 JE SHORT 00FF3A63
00FF3A61 FF30 PUSH DWORD PTR DS:[EAX]
00FF3A63 FF75 F0 PUSH DWORD PTR SS:[EBP-10]
00FF3A66 FF75 EC PUSH DWORD PTR SS:[EBP-14]
00FF3A69 C3 RETN
按F2在RET那裡設定一個斷點,然後再次按Shift+F9 ..
我們會在停在RET這一行..
現在是設定跟蹤命令(Trace Command)的時候了..
我們知道,大多數pe檔案的開始地址是 : 400000 -- FFFFFFFF
但是小程式並不是這樣 .. 小程式通常結束於 9FFFFF
我們現在停在的地址是 : 00FF3A69
所以我們可以透過命令列外掛來跟蹤這個程式直到它返回OEP,就象這樣:
按Alt+F1再命令列外掛的輸入框中輸入: TC EIP<900000 然後回車。
這樣,當程式執行到小於900000的地址時,將會象我們希望的那樣自動中斷下來..
我們停在這裡 :
00407278 -FF25 2C235700 JMP DWORD PTR DS:[57232C] <<--這裡
0040727E 8BC0 MOV EAX,EAX
00407280 -FF25 28235700 JMP DWORD PTR DS:[572328]
00407286 8BC0 MOV EAX,EAX
00407288 -FF25 24235700 JMP DWORD PTR DS:[572324]
0040728E 8BC0 MOV EAX,EAX
00407290 -FF25 20235700 JMP DWORD PTR DS:[572320]
00407296 8BC0 MOV EAX,EAX
00407298 50 PUSH EAX
00407299 6A 40 PUSH 40
0040729B E8 E0FFFFFF CALL SystemCl.00407280
004072A0 C3 RETN
如果我們按一次F8我們將回到殼的程式碼中,
所以我們按一次F8並再次執行跟蹤命令(Trace Command)
這一次,我們來到這裡:
0040734D A3 68E65600 MOV DWORD PTR DS:[56E668],EAX ; SystemCl.00400000
00407352 A1 68E65600 MOV EAX,DWORD PTR DS:[56E668]
00407357 A3 D8505600 MOV DWORD PTR DS:[5650D8],EAX
0040735C 33C0 XOR EAX,EAX
0040735E A3 DC505600 MOV DWORD PTR DS:[5650DC],EAX
00407363 33C0 XOR EAX,EAX
00407365 A3 E0505600 MOV DWORD PTR DS:[5650E0],EAX
0040736A E8 C1FFFFFF CALL SystemCl.00407330
0040736F BA D4505600 MOV EDX,SystemCl.005650D4
00407374 8BC3 MOV EAX,EBX
00407376 E8 75D8FFFF CALL SystemCl.00404BF0
0040737B 5B POP EBX
0040737C C3 RETN
這些是什麼東西??
這個問題花了我一些時間但在除錯了更多的別的程式之後,我認為這是對GetModuleHandleA的呼叫程式碼的一部分,看起來應該象這樣的:
CALL <JMP.&kernel32.GetModuleHandleA>
MOV DWORD PTR DS:[584668],EAX ; SystemCl.00400000
MOV EAX,DWORD PTR DS:[584668]
MOV DWORD PTR DS:[5780D8],EAX
XOR EAX,EAX
MOV DWORD PTR DS:[5780DC],EAX
XOR EAX,EAX
MOV DWORD PTR DS:[5780E0],EAX
CALL SystemCl.00407450
MOV EDX,SystemCl.005780D4
MOV EAX,EBX
CALL SystemCl.00404BFC
POP EBX
RETN
因為這是我們需要Dump的檔案的一部分,所以我們應該在第二次跟蹤到達這裡的時候dump: 0040734D..
開啟ProcDump / Lord-PE 選擇dump(full)來dump程式
=======================
如何找到程式真正的OEP
=======================
地址0040734D並不是OEP,我們按F8單步執行,直到RET,返回(ret)後我們來到這裡:
00564BEC FF15 A4D15600 CALL DWORD PTR DS:[56D1A4] ; SystemCl.00564460
00564BF2 E8 C101EAFF CALL SystemCl.00404DB8
00564BF7 90 NOP
00564BF8 0000 ADD BYTE PTR DS:[EAX],AL
00564BFA 0000 ADD BYTE PTR DS:[EAX],AL
00564BFC 0000 ADD BYTE PTR DS:[EAX],AL
好了.. 現在我們可以用ProcDump/Pe-Tool來dump程式了,然後得到一個dump檔案 ..
但那裡才是OEP ?
是這兒嗎: 00564BEC ??
NO!
如果你往上看,你會發現這樣的程式碼:
00564BD3 0000 ADD BYTE PTR DS:[EAX],AL
00564BD5 0000 ADD BYTE PTR DS:[EAX],AL
00564BD7 00A444 56000000 ADD BYTE PTR SS:[ESP+EAX*2+56],AH
00564BDE 0000 ADD BYTE PTR DS:[EAX],AL
00564BE0 0000 ADD BYTE PTR DS:[EAX],AL
00564BE2 0000 ADD BYTE PTR DS:[EAX],AL
00564BE4 0000 ADD BYTE PTR DS:[EAX],AL
00564BE6 00E8 ADD AL,CH
真正的OEP是 :
00564BDC
你可能會問"為什麼 ?"...
ASPR使用了一種叫做 "Steal-Bytes"的技術:
asrp隱藏了PE檔案OEP開始處的位元組,並把這些位元組從原始PE檔案中擦除..
=====================
關於stolen bytes
=====================
稍微說明一下:
每一種編譯工具例如 : VC++ , Delphi , Borland , etc..
在OEP有一個唯一的/相同的PE頭
其中的一些是這樣的:
Push EBP
MOV Ebp,Esp
Add ESP , -010
Mov EAX, SOME_VALUE
(共11bytes)
或者:
Push EBP
MOV Ebp,Esp
Add ESP , -010
Push EBX
Push ESi
Push EDi
Mov EAX, SOME_VALUE
(共14 bytes)
我不能確定ADD ESP的數值,但在這個程式中是:add esp,-10,當然,不是所有的程式都一樣的。
在這個程式中,我們看看:
00564BD7 00A444 56000000 ADD BYTE PTR SS:[ESP+EAX*2+56],AH
00564BDE 0000 ADD BYTE PTR DS:[EAX],AL
00564BE0 0000 ADD BYTE PTR DS:[EAX],AL
00564BE2 0000 ADD BYTE PTR DS:[EAX],AL
00564BE4 0000 ADD BYTE PTR DS:[EAX],AL
00564BE6 00E8 ADD AL,CH
從地址: 00564BE6開始到我們找到的真正的OEP:00564BDC,總共是11位元組
所以我們需要補上這11位元組,現在的問題就是:EAX的值是多少?
我發現這其實很容易找到..
看看這段程式碼:
0040734D A3 68E65600 MOV DWORD PTR DS:[56E668],EAX ; SystemCl.00400000
00407352 A1 68E65600 MOV EAX,DWORD PTR DS:[56E668]
00407357 A3 D8505600 MOV DWORD PTR DS:[5650D8],EAX
0040735C 33C0 XOR EAX,EAX
0040735E A3 DC505600 MOV DWORD PTR DS:[5650DC],EAX
00407363 33C0 XOR EAX,EAX
00407365 A3 E0505600 MOV DWORD PTR DS:[5650E0],EAX
0040736A E8 C1FFFFFF CALL SystemCl.00407330
0040736F BA D4505600 MOV EDX,SystemCl.005650D4
00407374 8BC3 MOV EAX,EBX
00407376 E8 75D8FFFF CALL SystemCl.00404BF0
0040737B 5B POP EBX
0040737C C3 RETN
注意這裡:
00407374 8BC3 MOV EAX,EBX
我們將得到我們需要的EAX的正確值
在這個例子是 : 5644CC
ok,現在剩下的工作就是修復IAT了。
=================
如何IAT
=================
在improved ImpRec 1.6 Final中選取程式,然後
點選: IAT AutoSearch
修改RVA的大小(Size of the RVA )為1000
然後點選獲取輸入表(GetImports) 點選顯示無效地址(Show Invalid) 在無效地址列表(invalid list)中點選右鍵選擇"Trace Level 1" 這一步驟完成之後,把那些太大的需要刪除的地址清除掉(右鍵 , Cut Thunks)
例如:
1 00172278 kernel32.dll 019D GetStartupInfoA
0 0017227C ? 0000 00FF17E4 <<-- don't cut
0 00172280 ? 0000 00FF1CA4 <<-- don't cut
1 00172284 kernel32.dll 0166 GetModuleFileNameA
1 00172288 kernel32.dll 015E GetLocaleInfoA
1 0017228C kernel32.dll 015B GetLastError
1 00172290 kernel32.dll 012E GetCurrentDirectoryA
0 00172294 ? 0000 00FF1D18 <<-- don't cut
1 00172298 kernel32.dll 00E6 FreeLibrary
1 0017229C kernel32.dll 00C6 FindFirstFileA
1 001722A0 kernel32.dll 00C2 FindClose
1 001722A4 kernel32.dll 00AC ExitProcess
1 001722A8 kernel32.dll 00AD ExitThread
1 001722AC kernel32.dll 0066 CreateThread
1 001722B0 kernel32.dll 0377 WriteFile
1 001722B4 kernel32.dll 0343 UnhandledExceptionFilter
1 001722B8 kernel32.dll 02F2 SetFilePointer
1 001722BC kernel32.dll 02E9 SetEndOfFile
1 001722C0 kernel32.dll 02B2 RtlUnwind
1 001722C4 kernel32.dll 0291 ReadFile
1 001722C8 kernel32.dll 0284 RaiseException
1 001722CC kernel32.dll 024B MoveFileA
1 001722D0 kernel32.dll 019F GetStdHandle
1 001722D4 kernel32.dll 014E GetFileSize
1 001722D8 kernel32.dll 0151 GetFileType
1 001722DC kernel32.dll 0079 DeleteFileA
1 001722E0 kernel32.dll 004B CreateFileA
1 001722E4 kernel32.dll 002D CloseHandle
0 001722E8 ? 0000 CCB36727 <<-- CUT !
1 001722EC user32.dll 0128 GetKeyboardType
1 001722F0 user32.dll 01C9 LoadStringA
1 001722F4 user32.dll 01DD MessageBoxA
1 001722F8 user32.dll 002B CharNextA
0 001722FC ? 0000 2C24B7E9 <<-- CUT !
1 00172300 advapi32.dll 01EC RegQueryValueExA
1 00172304 advapi32.dll 01E2 RegOpenKeyExA
1 00172308 advapi32.dll 01C9 RegCloseKey
0 0017230C ? 0000 48E33A34 <<-- CUT !
1 00172310 oleaut32.dll 0006 SysFreeString
1 00172314 oleaut32.dll 0005 SysReAllocStringLen
1 00172318 oleaut32.dll 0004 SysAllocStringLen
在清除完後,我們還有8個無效的項需要修復 :
1) 00FF1CCC
2) 00FF17E4
3) 00FF1CA4
4) 00FF1D18
5) 00FF1D08
6) 00FF1D00
7) 00FF1CF8
8) 00FF1D30
點選show invalid並右鍵單擊選擇其中的一個,讓我們來修復它 :
00FF1D30 <- 右鍵單擊選擇DeasmHexView檢視:
push ebp
00FF1D31
mov ebp,esp
00FF1D33
mov eax,[FF7E24] // DWORD value: 00152398
00FF1D39
pop ebp
00FF1D3A
retn 4
仔細瞧瞧 .. 這個函式在開始的時候push EBP然後在結束的時候Pop EBP,所以這個函式什麼都沒執行,應該是LockResource或者FreeResource
我選擇的是: FreeResource
----------------------------------------------------------------------------------------------
在新版本的imprec中有個Deasmbler/HexView的功能,你可以選擇一個無效的api檢視呼叫程式碼 ...
修復8個無效的地址:
1) 00FF1CCC
00FF1CCC FF35 147EFF00 PUSH DWORD PTR DS:[FF7E14]
00FF1CD2 58 POP EAX
00FF1CD3 C3 RETN
如果你執行這段程式碼你會看到:
00407235 25 FF000000 AND EAX,0FF
在我這裡,執行完這段程式碼後(OS WinXP Pro)EAX=5 這個是作業系統的值。每個作業系統都有一個唯一的標識
所以這個是: GetVersion <-- Good Imprec !
----------------------------------------------------------------------------------
2) 00FF17E4
00FF17E4 55 PUSH EBP
00FF17E5 8BEC MOV EBP,ESP
00FF17E7 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
00FF17EA 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00FF17ED 8B0D 8464FF00 MOV ECX,DWORD PTR DS:[FF6484]
00FF17F3 8B09 MOV ECX,DWORD PTR DS:[ECX]
00FF17F5 3BC8 CMP ECX,EAX
00FF17F7 75 09 JNZ SHORT 00FF1802
00FF17F9 8B0495 D863FF00 MOV EAX,DWORD PTR DS:[EDX*4+FF63D8]
00FF1800 EB 07 JMP SHORT 00FF1809
00FF1802 52 PUSH EDX
00FF1803 50 PUSH EAX
00FF1804 E8 B739FFFF CALL 00FE51C0 ; JMP to kernel32.GetProcAddress
00FF1809 5D POP EBP
00FF180A C2 0800 RETN 8
正如我們看到的那樣: GetProcAddress <-- Good Imprec !
-----------------------------------------------------------------------------------
3) 00FF1CA4
00FF1CA4 55 PUSH EBP
00FF1CA5 8BEC MOV EBP,ESP
00FF1CA7 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00FF1CAA 85C0 TEST EAX,EAX
00FF1CAC 75 13 JNZ SHORT 00FF1CC1
00FF1CAE 813D A47AFF00 00>CMP DWORD PTR DS:[FF7AA4],400000 ; ASCII "MZP"
00FF1CB8 75 07 JNZ SHORT 00FF1CC1
00FF1CBA A1 A47AFF00 MOV EAX,DWORD PTR DS:[FF7AA4]
00FF1CBF EB 06 JMP SHORT 00FF1CC7
00FF1CC1 50 PUSH EAX
00FF1CC2 E8 F134FFFF CALL 00FE51B8 ; JMP to kernel32.GetModuleHandleA
00FF1CC7 5D POP EBP
00FF1CC8 C2 0400 RETN 4
00FF1CCB 90 NOP
00FF1CCC FF35 147EFF00 PUSH DWORD PTR DS:[FF7E14]
00FF1CD2 58 POP EAX
00FF1CD3 C3 RETN
如上: GetModuleHandleA <-- Good Imprec !
------------------------------------------------------------------------------------
4) 00FF1D18
00FF1D18 6A 00 PUSH 0
00FF1D1A E8 9934FFFF CALL 00FE51B8 ; JMP to kernel32.GetModuleHandleA
00FF1D1F FF35 147EFF00 PUSH DWORD PTR DS:[FF7E14]
00FF1D25 58 POP EAX
00FF1D26 8B05 247EFF00 MOV EAX,DWORD PTR DS:[FF7E24]
00FF1D2C C3 RETN
仔細看看,你會發現這個可不是GetModuleHandleA
為什麼呢? 因為在API GetModuleHandleA的呼叫之後程式利用這段程式碼來獲取某些資訊存入EAx作為呼叫的返回值 ..
那麼這個是是什麼函式呢? 執行完這段程式碼之後你會發現EAX中是程式路徑的ascii字串。 所以這個是: GetCommandLineA <-- Good Imprec !
------------------------------------------------------------------------------------
5) 00FF1D08
00FF1D08 55 PUSH EBP
00FF1D09 8BEC MOV EBP,ESP
00FF1D0B 8B05 247EFF00 MOV EAX,DWORD PTR DS:[FF7E24]
00FF1D11 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00FF1D14 5D POP EBP
00FF1D15 C2 0400 RETN 4
仔細瞧瞧 .. 這個函式在開始的時候push EBP然後在結束的時候Pop EBP,所以這個函式什麼都沒執行,應該是LockResource或者FreeResource
我選擇的是: FreeResource <-- Good Imprec !
------------------------------------------------------------------------------------
6) 00FF1D00
00FF1D00 A1 207EFF00 MOV EAX,DWORD PTR DS:[FF7E20]
00FF1D05 C3 RETN
這個真有趣 .. 執行這段程式碼你會看到在EAX中有一個值, 這個值是程式的PID!
開啟ImpRec在程式列表中你會看到同樣的PID值(PID - Process ID)
所以這個是 : GetCurrentProcessId <-- Good Imprec !
------------------------------------------------------------------------------------
7) 00FF1CF8
00FF1CF8 A1 187EFF00 MOV EAX,DWORD PTR DS:[FF7E18]
00FF1CFD C3 RETN
在:00FF1CF8和00FF1D00這兩個鄰近的地址中我只能在00FF1D00這個地址設定斷點,發現是: GetCurrentProcessId
我只能得出一個結論 .. 這個api一定是: GetCurrentProcess
新版本的imprec也把這個地址修復為GetCurrentProcessId...
在新版本的Imprec的News.txt中說明了:
"出色的disassembler/hew-viewer功能有助於你檢視重定向程式碼. 你不再需要ASProtect修復外掛,因為ASProtect修復外掛並沒有更新,只是做為一個例子放在那兒" 問題不是出在ImpRec而是那個外掛,我說這些只是為了你能有一些瞭解。
.. GetCurrentProcessId 也工作的很好...
------------------------------------------------------------------------------------
8) 00FF1D30
00FF1D30 55 PUSH EBP
00FF1D31 8BEC MOV EBP,ESP
00FF1D33 8B05 247EFF00 MOV EAX,DWORD PTR DS:[FF7E24]
00FF1D39 5D POP EBP
00FF1D3A C2 0400 RETN 4
如前所敘,我選的是 : FreeResource <-- Good Imprec !
好了,IAT修復完了 ..
=============================================
如何修復OEP並補上Stolen bytes
=============================================
用Pe-Editor of ProcDump Lord-PE把OEP修改為:564BDC
然後開啟Hex-Edit Hview把OEP處的"00"修改為
Push EBP
Mov EBP,ESP
Add ESP,-010
Mov eax, 05644CC
到這裡aspr的脫殼就完成了...
致謝 :
=============
to all the ppl that have helped me lern and beeing there for me ..
Mackt , ^Daemon^ , VAG , EvilWT , dynm8 , urad0x , parabytes , Jb__ , NeOXQuiCK , SexyGeek ,
ThE-SAiNt
SAC , NchantA , Eternal Bliss , evaluator , Bengaly , Termin-X , jond .
all the ppl at http://woodmann.cjb.net - RCE Messageboard's
and to all the ppl the i forgoted :D
相關文章
- OllDbg翻譯2003-06-18LLDB
- [翻譯]利用程式碼注入脫殼2015-11-15
- 翻譯 | 擺脫瀏覽器限制的JavaScript2019-02-16瀏覽器JavaScript
- 文件翻譯器怎麼用?如何翻譯Word文件?2019-08-15
- 用olldbg破解,分析ocx控制元件2004-06-23LLDB控制元件
- 實用的Word文件翻譯方法分享,讓Word文件快速翻譯2019-08-12
- Yurii談翻譯(七)怎樣翻譯更地道:被濫用的“被”2012-01-08
- dumping_oracle_blocks翻譯(一)個人翻譯,學習總結用2011-11-30OracleBloC
- 安卓應用安全指南翻譯完成2018-04-04安卓
- 翻譯2020-12-29
- Yurii談翻譯(五)怎樣翻譯更地道:so…that…的翻譯2012-01-08
- 如何完成中文翻譯日文線上翻譯2019-09-23
- 語音翻譯軟體怎麼用?怎麼實現語音的翻譯2019-08-20
- Yurii談翻譯(四)怎樣翻譯更地道:翻譯如鋪路2012-01-08
- Yurii談翻譯(九)怎樣翻譯更地道:冠詞a的翻譯2012-01-09
- Yurii談翻譯(十)怎樣翻譯更地道:最高階的翻譯2012-01-09
- 翻譯的未來:翻譯機器和譯後編譯2013-06-13編譯
- 免費試用谷歌的翻譯介面2019-05-12谷歌
- [翻譯] PHP 7.2 中棄用的功能2017-02-18PHP
- 蘋果應用商店稽核指南(中文翻譯)2013-03-09蘋果
- Ubuntu安裝劃詞翻譯軟體Goldendict 單詞翻譯 句子翻譯2021-01-05UbuntuGo
- Yurii談翻譯(六)怎樣翻譯更地道:“as somebody said…”的翻譯2012-01-08AI
- Yurii談翻譯(十三)怎樣翻譯更地道:It is…that…句型諺語的翻譯2012-01-09
- Yurii談翻譯(十四)怎樣翻譯更地道:否定句的翻譯2012-01-09
- 文件翻譯軟體怎麼用?怎麼把Excel文件翻譯成中文版2019-08-27Excel
- 蝴蝶書-task2: 文字推理、摘要、糾錯 transformers實現翻譯 OpenAI翻譯 PyDeepLX翻譯 DeepLpro翻譯2024-04-29ORMOpenAI
- Nginx翻譯2017-11-10Nginx
- [翻譯] TransitionKit2015-02-08
- 翻譯篇2013-07-29
- OpenCV翻譯專案總結二——Mat翻譯2019-07-13OpenCV
- 用Python做一個翻譯軟體2019-01-29Python
- 【翻譯】基於 Cypress 測試 React 應用2018-03-15React
- Laravel 谷歌翻譯 /Bing 翻譯擴充套件包2019-06-11Laravel谷歌套件
- 使用google翻譯 api 翻譯中文成其他語言2018-08-06GoAPI
- 有道雲詞典--翻譯/螢幕取詞翻譯2020-12-12
- TailWind文件翻譯說明以及每日翻譯進度2021-01-19AI
- 翻譯軟體2019-05-03
- 翻譯介面整理2018-11-14