




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第四十二章-ACProtectV1.09脫殼(尋找OEP,繞過硬件斷點檢測,修復Stolen本章開始,討論更加復雜的殼-ACProtect1.09。我們直接運行起來,. 斷了下來,在寄存器窗口中,單擊鼠標右鍵選擇Viewdebugregisters,切換到調試寄存器顯示模式,如果沒有該選項的話,說明當前已經是調試寄存這些就是調試寄存器組,Dr0~Dr7。Dr0,Dr1,Dr2,Dr3是用于設置硬件斷點的,由于只有4個硬件斷點寄存器,所以同時最多只能設式,Dr6是用于顯示哪個硬件調試寄存器的斷點,如果是Dr0~Dr3的話,相應位會被置1。即如果是Dr0的斷點,則Dr6的第0位被置1,如果是Dr1的斷點,則Dr6的第1位被置1,依次類推。因為硬件斷點同時只會觸發一個,所以Dr6的低4位最多只有一位被置1,所LE和GE:P6family和之后的IA32處理器都不支持這兩位。當設置時,使得處理器會檢測觸發數據斷點的精確的指令。當其中一個個。切換任務時LE會被清除而GE不會被清除。為了兼容性,In建議使用精確斷點時把LE和GE都設置為1。示1字節),否則會產生不確定的行為。LEN0到LEN3(1)001(2)012(3)10保留(4)114R/W0到R/W3:指定各個斷點的觸發條件。它們對應于DR0到DR3中的地址以及DR6中的400只執行01寫入數據斷點10I/O端口斷點(只用于pentium+,需設置CR4的DE位,DE是CR4的第3位11讀或寫數據斷點GD位:用于保護DRx,如果GD位為1,則對Drx的任何都會導致進入1號調試陷阱(int1)。即IDT的對應,這樣可以保證調試此時Dr0為4271B5,表示4271B5地址處被設置了硬件斷點。現在我們來看看CONTEXT恢復。第二種方案:在context中定位到程序的返回地址,在返回地址處設置一個斷點,當斷在返回地址處時恢復硬件斷點,相當于重新設12FC8C+0B8=最后再次取內容就得到了異常的返回地址,好了,下面我們來看看執行的效果,重啟程序。,,
有些殼會通過一些方法來清除硬件斷點,現在我們就可以很完美的給stolenbytes設置硬件斷點了。首先我們來看看有沒有異常,我們從最后一次異常處開始。禁用 中用到的斷點現在我們重新啟動,斷在了最后一次異常處,給當前區段設置內存斷點,讓其斷在異常處理程序中按ShiftF9現在我們就可以從471090處開始了,不一會兒完畢了,我們現在到達了OEP處。這里的指令的最后幾行,這里我們可以搜索PUSHEBP,一般是從上往下搜索,但這里前面位于系統DLL中的PUSHEBP過多,所以 了,這里我們就找到了stolenbytes,關于前面的通過設置硬件斷點的技巧在下一章節中使用。本章附件第四十三章-ACProtectV1.09(編寫修復 下面我們來隨便定位一個API函數的調用處,單擊鼠標右鍵選擇SearchforAllintermodularcalls這里我們可以看到很多經過重定向的項,這些項直接就位于殼的區段中, 首先定位OEP的備份一下備份過的重命名為OEP.txt,接下來我們通過修改HBP.txt來定位修復IAT的關鍵跳轉。執行上面的,不一會兒彈出了是否繼續執行的消息框異或得到的結果就是API函數的地址,我們一起來計算一下。5BF11A9XOR793E0502=。 。址被保存在了堆棧中,確切點來說是[ESP-0C]中。我們可以看到對于正常的IAT項,[EBP-0C]處并不會保存正確的API函數 我們該怎么做呢?我們需要對寫入IAT項的指令設置硬件執行斷點,當執行到這里的時候,我們判斷EAX的值是正常的還是重定向 變量aux2來保存正確的API函數地址,正確的API函數地址保存在[ESP-0C]中。其寫入到EDI指向的IAT項中即可。下面我們就來執行一下該,試試效果運行 IAT=本章附件第四十四章-ACProtectV1.09脫殼(修復我們上一章節介紹了如何定位stolenbytes,以及IAT的修復。我們利用上一章編寫的可以很方便的修復IAT并且定位到OEP,接下接下來打開ImportReconstructor,定位到該程序所在進程。OEP=271B5IAT的起始地址(RVA)IAT=460F28460818點擊GetImports我們會發現有一項是無效的,其他項都是有效的, 942C0892xor斷在了這里,另一種更加快捷的方法就是通過OD的自動功能來定位,我們設置自動的終止條件為EIP大于500000,也就是說從當前區段轉這里我們選中EIPisoutsidetherange。范圍設置為0~500000 等數據都填入到IMPREC停在了OEP處,我們準備好stolenbytes 們從4271b0地址處開始寫入stolenbytes。OD加載剛剛保存的文件,我們可以通過在數據窗口中單擊鼠標右鍵選擇-Goto-Expression,輸入400000定位到PE頭。好了,現在我們就修復完畢了,但是我們運行修復后的程序會發現無法正常運行,程序了。好,那么我們不勾選忽略異常的選項,加載剛我們可以看到日志窗口中顯示了一 異常。我們通過單擊中的K按鈕查看調用堆棧我們到了這里,這里我的想法是用這6個字節替換掉那跳轉表中的6B這里將所有的代碼都以二進制的形式拷貝出來,接著保存所做的修改到文件,本章附件cmpjmpfinal//當斷在硬件斷點處時,就跳轉到finalto_clear:bphwc13ffc4to_recover:MSGYN是否繼續jebeginning//此時OD斷在硬件斷點處以搞定,但是我們整個的是OllyDbg,所以這里我們還是用OllyDbg來進行調試,嘿嘿。->斷在了系統斷點處, 5這款OD吧,前面章節我們介紹過,這款OD是打過補丁的,其內存斷點僅僅在執行代碼的時候才會斷下來,或者寫入并不會斷 我們在數據窗口中單擊鼠標右鍵選擇Goto-Expression,輸入400000(主模塊址)。 接下來我們在選中該字段,單擊鼠標右鍵選擇Copytoexecutablefile 很明顯有什么地方我們沒有繞過。提示正在一個不存在的區段地址,OD無法繼續運行。好了,下面我就來給大家介紹一些思路,這里并不是每一種思路都能奏效,但是你需要熟悉這些思路,試:(PS:這個功能大家應該不會陌生吧)當有程序的時候,OD就會自動附加上該程序。擊Restoreoldjust-in-timedebugger(恢復原來的即時調試器)按鈕。因為每當應用程序,就被OD附加上是很煩的。這里我們勾選上PEEditor以及Break&Enter分組中的Register 首先我們對這個程序具體情況一無所知。那我們就考慮一下常規情況的吧一般來說針對于該程序大部分殼會從0地址處開始區段。我們可以嘗試修改某些區段的權限比如說我們去掉某個區段的可寫權限。當殼嘗試寫入該區段的話就會報錯此時我們之前設置dt這個區段中也就是緊隨其后的一個區段所以這里我們首先嘗試t這個單擊右上方的takeit(確定)按鈕。這里我們可以看到.rdata這個區段的權限已經修改成功了。有可能殼的作者會在運行時調用VirutalProtect之類的API函數將各個區段的權限修改回去。沒有關系,我們還是來看看先。,MssBx.rt,。我以掉段的寫當到時序生常即調器O就自加。鍵選擇Fullaccess,給該區段賦予所有權限。該指令成功執行情形 0x402000,也就是說我們修改的是虛擬地址范圍為0x402000~0x403000對應的區段的屬性,嘿嘿。這里我們不要盲目的對OD中顯示的唯一的那一個區段設置內存斷點,OD這里對區段的解析是有誤的。這里我們在數據窗口中定 下面我們來定位IMPREC重建IAT所需要的數據。 IAT大小:0x1C路,劍走偏鋒往往能收到,嘿嘿。本章附件IMP第四十五章-ReCryptv0.80脫殼(續本章我們需要用到幾款工具,信息收集這些字段非常重要,因為很多殼在區段的過程中會修改這些字段。我們可以看到這里NumOfRvaAndSizes字段就被修改過了。 我們可以看到這3下面我們需要用到POKEMON這款工具,通過這款工具我們可以繞過該殼的AntiAttach(反附加),我們還記得恢復的那個偏移0xB4處 本章附件IMPREC.7zPatched5OD.7z ,這里我們打開O還記得之前介紹那款修改過的Pched4這款吧就它了配置好反反調試插件。這個Cck作者的要求不僅僅是脫殼還必須將D剝離讓EE單獨正常運行。Pick序 的這是一個LL如果將這個L刪除掉的主程序將無法正常運行。好了現在我們用Pc這款D加載Px。 開主菜單中的Debuggingoptions-Events,選中Systembreakpoint。 這里我們可以看到ImportTable(縮寫:IT,俗稱:導入表)的RVA(相對虛擬地址)(PS:不要將ImportTable與IAT搞了,IAT是ImportAddressTable(輸入函數地址表)的縮寫,嘿嘿).這里6F3C+映像址(400000)就可以定位到ImportTable了不道家是還記得入表的式L占W。SE結不解的童鞋可以參看中的小黃書你懂得!嘿sPE指南)L4WL的名稱字符串40712E這個地址就指向了第一個LL我們一起來看一看。這我可以到第一個L我們假設在到達點之如果該LL被執行了的話就終止。PS統D并不會進行反調試的處理這里只是舉個例子) 我看斷了來這是由于76B08B8地處內容導致的中。我們繼續運行直到觸發內存執行斷點為止。LL的流程就是這樣的接下來我們重啟這次我們直接對的代碼段設置內存斷點。也是不是檢測窗口名i它是檢測該進程是由誰創建的通過調用sN等函數來遍歷進程判斷當前進程的父進程是否為桌面進程來達到反調試的目的。kee如果是的話那么就說明正在被調試直接終止進程。進程父進程零代表是mPcss這個進程這個進程并不是我們要定位的我們直接運行起來。,程序終止了。怎么這樣就終止了呢道SysmPss這系統進程有問題不太可能,那么會不會i插件了的原因呢?我們去掉HiD中PcssNxt這一項的對勾試試。is2x這個選項的話當該函數執行完畢EA說明出錯了就直接退出了。這里我們不勾選這一項EA非零。函數執行成功這樣程序就不會直接退出了。為我用粉紅色標注出來了。為我用綠色標注出來了。這里我們可以看到此時定位到了Picke這個進程。P0x0AE4P0x8A這里我們對比著PE里面的進程信息來看。我們單擊PUE中的Aciz刷新按鈕。Picke的父進程并非l而是。所以Pticke會直接退出。這里我們直接對0x8A這,看什么地方會獲取該PPD。EiPces其反試如果處修改并存文件話那如果其他其反調試話程序還是無法正常運行。所以這里我們不進行修改我們刪除掉之前設置的硬件斷點。給進行比較的這一行指令設置硬件執行斷點。當程序斷在這里的時候,我們可以手動修改PickeP,lreP更加方便的方法是斷在這一行的時候修改EA的值。ke0x7即用于判斷是不是重命名過的。 計數,所在進程范圍內模塊計數,模塊 這里我們可以看到關于模塊的相關信息,我們來一起看看通過該CrackMe 鍵執行這個字符串比較函數。 EAX返回1,擇Followimmediateconstant(跟隨立即數)。這這我再定位了實際碼處通過這方式就以不行的代碼接位實代碼了比方便。我們繼續。我們繼續耐心跟吧。EPLEEE其余的比較都不相等。這里我們直接按850LasErPSLasEo得到的值)的返回值為ERRRUCSS,也就是創建互斥體成功。接下來調用lLasWiE這個函數獲取AP函數執行的錯誤碼,這里我們可以對照著來看。這里EA的值為,也就是D中顯示的sE的值。這里我們可以看到這個WAIT互斥體是第一次創建,所以跳過了ExitProcess,如果WAIT不是第一次創建的話,那么就會調 這里如果我們按F8鍵創建該進程的話,就算被創建了,該進程也會立即結束掉,所以這里我們可以嘗試將進程掛起,我們可以通過 我直接PsA件斷點來看為么創進程失。也就說此有兩個件斷點,一個是父進程與e進行比較處另一個就是該CPcssA的調用處。現在我們再將i的反反調試選項都勾選上。我們用PUPE查看一下進程。 我可通過下方式重其在系斷點處我們i這模塊代碼段置內存斷點我們運行起來會斷在該D的點處。79111A4ALL往Aillll的 當前程的領空屬于TLLLL,也就是當新創建的進程由掛起狀態恢復為運行狀態后,就會運行到該CA處我們要想辦法讓其在這里一直循環而不進去。這里父進程P修改leP,繼運行隨即就斷在了CPcssA的調用處。7911A4S注意你本機的地址單擊獲取原始字節接著填寫上要替換的字節碼EBE擊按鈕。這樣就完畢了。現在我們需要將該進程由掛起狀態恢復到運行狀態。 這樣掛起的線程就被恢復了,并且一直在79111A4接下來我們來附加該進程。接來設為即調試器我選新建的Pckxe標擇調。這樣D的時調試功能就生效了。此時并沒有模塊列表中并沒有出現Aill這個模塊我們會斷在79111A4如果還是沒有出現Aill我繼續運行直到ADDll這個模塊為止。如果為0xB7的話表示互斥體已經存在,該進程是并非第一次創建,如果不為0xB7的話,的INT3斷點,運行起來,這樣就可以斷在AntiDebugDll.dll的點處了。 斷在了這里這里由于父進程已經創建了所以我們如果執行了該函數Ls的錯誤碼將返回即。這里我們執行到返回驗證一下。斷在了這里,這里是該錯誤碼進行比較。 IAT設置內存斷點。 叫做第一個實例。這里要創建的互斥體叫做。顧名思義主體實例。TLLLLPssTLLLL的函數指針。iBin我們繼續運行。 而是調用A來打開這個互斥體這里可以順利獲取到之前父進程中創建的互斥體的句柄。我們繼續F9鍵運行。里iFc的第二參數由0x1388修為了FFFFF1,。這里為了讓父進程釋放號量的時候我們能夠子進程能夠順利斷下我們給下一條指令處設置一個斷點。 量,子進程就會調用ExitProcess退出了。所以超時時間修改為了FFFFFFFF(即INFINITE),那么子進程只能的一直等們將之前設置的INT3都刪除掉。下面我們就不設置INT3斷點了,如果實在需要設置斷點,我們就用內存斷點替代。這明這個序想通過lA然通過ile相字節碼進行比較看看是否被修改這里我們并沒有修改文件中的內容我們修改的都是內存中的內容。這里大部分參數我們都不是很關系,我們只需要注意一下dwShareMode這個參數,共享模式為FILE_SHARE_READ,我們來看 起始地址為9F0000,接著它將會怎么做呢?不它沒有只比較了起始的幾個字節。我們在數據窗口中定位到9地址處。而們前正運行的的為 我們再數據窗口中定位到該地址我們可以看到兩者的內容是一的。 修改FLESA_A讓開文件功接下會件后對到的文件內容進行應的處理我們來看看對文件內容處理以后后續流程會有什么影響。 入整個代碼段,貌似像是在區段的樣子。繼續。現在子進程調用互斥體的信號量信號量的等待我們繼續子進程繼續按鍵運行。這又是跟父進程一樣調用修改內存權限為下一調用PsyWcs讀寫內存做鋪墊。PiEP155我們現在來看看40155看到的確像是點的樣子說明之前循環寫入的確是在主程序代碼段。 現在我們就不需要執行AntiDebugDll.dll這個反調試模塊中的內容了,所以我們可以直接將AntiDebugDll.dll 點處的指令修 。為第二個L這里我們為了剔除掉我們可以將的D項修改得與這一個D項一致。嘿嘿,這個CrackMe四十八章-PeSpinV1.3.04脫殼-我們可以看到量調用處顯示了API函數名稱,我們隨便選擇一個 的OEP處時,此時的棧頂指針也應該是指向的12FFC4。我們知道通過情況下OEP處的第一個指令為PUSHEBP,執行了這條指令斷在了這里,這里有條PUSHEBP指令,有點像OEP處的指令,嘿嘿,我們繼續往下單步,驗證一下看看到底是不是OEP處的指令,對于無JMP指令我們并不會感,因為其并不影響寄存器組以及堆棧的狀態。 這里又是一條語句,繼續本章附件第四十九章-PeSpinV1.3.04脫殼- 大細觀的話會現我淺色注來這指令面創的段已執過了不得話以減鍵往回)這做目很能防止者過在P的 點設斷以來斷不被定到該數這果們知該P函是么話在中VEX,ODPRSS:P+]條令鼠右選擇wiine將EP指針向指。(P:實需這做,可直將編口內地與器中的一線右拖,以看為了增們修復IAT的難度。我們該如何來修復IAT呢? 寄存器中會出現7C9110ED這個值,我們利用OD的自動功能來定位這個值。我們來設置一個自動的條件作指令的話耗費的時間可能會非常長,接下來我們選中Debug-Traceinto菜單項開始自動。我們再次選擇Debug-traceinto菜單項進行自動點。接著給MOVDWORDPTRSS:[ESP+1C],ESI這一條指令處設置硬件執行斷點。所以我們來 指令相當于是費的,其NOP掉。如下 項轉化為CALLIAT中的項,下面我們就通過一個簡單的來完成。首先varvar_callvarvar_tablevarvar_apivarvar_iatvarvar_programvarvar_endmovmovfindopvar_program,#FF15??#log$RESULT這里才是我們真正開始執行的地方。TheStart是一個,顧名思義:開始。接下來是通過findop命令從401000地址處開始查命令將movvar_call,$RESULTcmpvar_call,0jecmpvar_call,44904BjaeTheFinal接CALL,那么就直接跳轉到TheFinal處結束該的執行,如果找到了,判斷間接CALL指令的地址是否高于代碼段中最后一項間addvar_call,2logvar_callmovvar_table,[var_call]logvar_tablemovvar_api,[table]logvar_apicmpvar_api,jbTheJmp這里將間接CALL指令的地址+2,然后4字節的內容保存到變量var_table中,也就是IAT2中的表項,接著表項的值也就是讀 cmpvar_api,[var_iat]jeTheSolveaddcmpvar_iat,460F28jaeTheJmpjmp logvar_iatlogmovmov不做,所以我們不得不添加一個STL命令,讓其單步執行,相當于F7,然后再將eip指向的OEP處。好了,現在我們來dump,然后用IMPREC修復IAT們單擊鼠標右鍵選擇Searchfor-Allintermodularcalls。查看所有的API函數的調用處。但愿不需要我們編寫第二個來進行修復 了VirtualProtect這個函數的地址。接著調用VirtualProtect給PE頭賦予寫入權限。該函數的參數如下:存單元中。接著將起始地址為45CAB0,長度為的數據拷貝到起始地址為,長度為1000的內存單元(也就是PE頭)本章附件 段所在區域設置內存斷點來定位OEP了,但是有了OllyAdvanced這個插件,這一切都可以省略了,嘿嘿。 這里我們可以看到BPOutputDebugStringA這個按鈕就出現了,我們只需要單擊一下BPOutputDebugStringA這個按鈕,就可以 說吾愛的OD)重啟OD,接著在命令欄中輸入HEOutputDebugStringA給該API函數設置一個硬件執行斷點試試看。我們可以看到量的API函數調用,IAT如下 我們打開IMPREC本章附件新版(PS:作者當年的版)。本章就由我解決簡單的部分,大家來完成復雜的部分,嘿嘿,給大家充分練手的機會。注意一點,如果OD加載目標程序以后,到達OEP之前就由于該殼的保護報錯了的話,大家可以將其到別的路徑下,然后重啟加載試(PS:我實驗的時候,采用XPSP3的虛擬機,所有異常都忽略了,但是直接運行起來,還是報這個錯誤框,后來我換成XPSP2的虛擬機,忽略所有異常又是正確的,具體原因還不清楚。所以這里大家遇到這個問題實在搞不定的話,就換XPSP2的系統吧)Copyollybone.dllandi386/ollybone.systoyourOllyDbgdirectory 大家在脫ASProtect這款殼的時候要格外,因為它會對INT3斷點以及硬件斷點進行檢測,如果檢測到的話,就會報錯,那我們就只能據s的擴展名來看就知道這是一個驅動程序這個插件主要是用來模擬執行斷點的協助我們的我們前面章節介紹的專門用于定位EP的那款)更快的定位到就是我們不能對程序進行單步所以說我們在調試之前先要將igisitpek說明如: 我們大概按4,5下F鍵就可以由第一個區段跳轉到起始地址為 置break-onexecute(執行斷點,該功能是OllyBone插件提供的)。我們來看看的說明:可以看到確實啟用了DEP,未啟用DEP的時候這個選項卡的框是灰下去的,無法選擇。 我實驗的環境是XPSP2。停在了殼的點處實上ASPrtct者伎。接來 略選勾可以看到,接下來,忽略內存異常這個選項的對勾去掉 ysisfrommodule選項重新分析代碼OEP=IAT=IAT=,擊Add按鈕來添加DLL,譬如這里的460F24這個IAT項所在的DLL就被遺漏了。我們來看看該項的參考。我們直接單擊Fixdump按鈕修改dump文件。能,我們單擊鼠標右鍵選擇Fixntdll.dllcalls即可。給大家的任務就是15天之內編寫出一個來修復AntiDump。完成任務的童鞋可以發郵件給我,我會一個一個的看并進行點評。在下一個章節中,我會給出一個在我看來最簡單最高效的。未修復IAT之前ASProtect將其替換成了一個占5個字節的CALL(很明顯第6個字節是指令)。未修復IAT的情況下4272D5這004272D5E8268D5801CALL004272DA 來的地方不是很像關鍵點的話,就繼續自動,直到確認是關鍵點為止。我們還有另一個切入點可以更加精確的定位關鍵點。就是執行完CALL019B0000這條指令后,正常情況下會返回到4272DA這個地址處,但是4272DA處這個字節是指令。所 本章附件: 地址輸入完以后,單擊OK,該就開始執行了。 目的:修復ASProtectv2.3SKE:Scitv13x或者更高版本,執行到EP處忽略所有異常日期:備注varvarvar_ini_iatvarvar_dirvarvar_sigvarvar_api //jbcmp$RESULT,0jemovvar_base_aip,$RESULT //保存用戶輸入的待修復的地址movvar_oep,eip gmieip,codebase //獲取主程序代碼段的址 // //movvar_base_aspr,[46C048] addvar_base_aspr,3B02E //在址的基礎上加上這個常量就可以定位到關鍵地址了 //如果沒有找到,就輸出總共找到的CALL個數,并退出jeno_calls //movvar_sig,var_dir movvar_dest,var_dir addvar_sig,5 //計算該CALL下一條指令的地址并保存到變量var_sig中incvar_dest movvar_dest,[var_dest] //獲取操作碼E8后的偏移量,并保存到變量var_dest中addvar_dest,var_sig //計算CALL的目標地址cmpvar_dest,var_base_aip je // //jmp // cmpeip,var_base_aspr // // // //判斷待修復的CALL的指令有沒有參考 eval"Calldword[{var_dir_iat}]"asmvar_dir,$RESULT //更新已修復項的計數incmov //eval"Jmpasmvar_dir,$RESULT incvar_countincmov //msg發生異常了,是否繼續"cmp$RESULT,0msg$RESULTbphwcmsg$RESULTbphwcvar_base_asprmoveip,var_oep附幾張的截圖movvar_base_aspr,[46C048] addvar_base_aspr,3B02E //在址的基礎上加上這個常量就可以定位到關鍵地址了 jmp // cmpeip,var_base_aspr // // // 首先判斷待修復CALL指令是否存在參考,如果不存在存在處則將其匯編為CALL[對應IAT項的地址]的形式,如果存在參考引用,則將其匯編為JMP[對應IAT項的地址]的形式。然后按照上面的步驟繼續修復其他的項, Part1:編寫定位OEP并修復StolenbytesPart2:編寫修復IAT確實有點弱智,),嘿嘿)MartianTPPpack本章到此結束,感謝大家的本章附件上一章中最后留的那個小比賽最后的獲勝者是Ularteck童鞋。下面我們就用Ularteck童鞋編寫的第一個來定位OEP以及修stolenbytes。如下#############################################################################################################CracksLatinoS-作者描述:該的功能的定位TPPpack的OEP以及修復其stolen目標程序配置要求:ODBGScript1.48,HideDebugger1.24,HideOD,停在點處,忽略Kernel32的異常,其他異常均不忽略.本以下關于該的詳細注vardir_excepvarNewoepvardir_JMPvardir_CALLvaroepvarStartScanvartempvartemp2vartemp3movNewoep, // 點保存到變量Newoepask"最后一次異常的地址是多少?"http://彈出一個框讓用戶輸入最后一次異常的地cmp je //如果用戶沒有輸入地址則跳轉到warningmovdir_excep, //將用戶輸入的地址保存到變量dir_excepjmp //跳轉到Initiationmsg"請重新執行該,再次輸入一個有效的地址!"jmpfinal eoe //如果發生異常斷了下來,就跳轉到checkcmp je //斷下來的地方剛好是最后一次異常處,則跳轉到last //忽略掉異常繼續執行,相當于在OD中按SHIFT+F9jmpIntiation: //跳轉Initiation處繼續定位最后一次異常處findopeip,#FFE0# //從最后一次異常處開始搜索JMPEAX指令,以便下面定位stolenbytesmovdir_JMP,$RESULT//將JMPEAX指令的地址保存到變量dir_JMP中bp //對JMPEAX //忽略掉異常繼續執行,相當于在OD中按了SHIFT+F9bcdir_JMP //刪除掉JMPEAX指令處的斷點 //單步步入,相當于在OD中按F7,單步以后就到了stolenbytes處movoep,eip //將stolenbytes的起始地址保存到變量oep中mov //將stolenbytes的起始地址保存到變量StartScan //開始搜索Stolenbytes中需要修正偏移量的findop //搜索以機器碼E8開頭的CALL指令,即待修正偏移量的CALLcmp$RESULT, //判斷是否搜索到了待修正偏移量的CALLje //沒有搜索到的話,則跳轉到finalmovdir_CALL, //將待修正偏移量CALL的地址保存到變量dir_CALLmovStartScan,$RESULT //將待修正偏移量的CALL指令的地址賦值給變量StartScanadddir_CALL,1 //指向偏移量movOpcodes, //獲取待修正的偏移量并保存到變量OpcodesaddOpcodes //將偏移量加上CALLadd //加上CALL這樣就得到了CALLmovtemp, //將CALL指令的地址保存到臨時變量tempsubtemp,oep //計算CALL指令距離stolenbytes起始地址的長度,并保存到臨時變量temp中movtemp2,Newoep //將 addtemptemp //計算CALL指令新的地址,并保存到變量tempsubOpcodes, //將目標地址減去CALLsubOpcodes, //然后減去5,就得到了CALL //將CALLmovtemp3, //將CALL指令所在的地址保存到臨時變量temp3add mov[temp3Opcod jmpLookForCall附的截圖下面我來給大家詳細講解這個的作用Part1:定位OEP并修復stolenbytes(byUlarteck)情下面我們利用最后一次異常法來定位OEP,對于最后一次異常法大家應該很熟練了吧。我們經常會用到它。此法同樣適用ASProtect2.1SKE,2.2SKE,2.3SKE以及帶VM接著將程序運行起來,然后打開日志窗口,這里后次異指令在地址為0046D36B,下我們可以用來位OEP在使用之前,我先演示一下如何手工定位。LT+M打開區段列表窗口。對代碼段設置內存斷點。我們現在將修改一下,讓其自動定位到最后一次異常處。將好,我們重啟OD以后,執行該里彈了個框要我輸入后一異指令在的址這里輸入46D36B。單擊OK。我可看到行了我可以到剛斷在最一次常處。我們按ALT+M打開區段列表窗口。下來們不是剛才樣代碼設置存斷點,次我對始地為8B0000的區段置內存斷點。按SHIFT+F9忽略掉運行起來,斷在了stolenbytes處。下是據artian先在的中介的定位stlenbytes的路寫,定stlenbytes思路下:先位到后一次異常處,接著往下搜索機器碼為FFE0的JPEX指令,搜到該指令以后,對其設置斷點,接著運行起來,斷到了MPEX,按F鍵單步一下,就可以到達stnbyts處了。我們在中添加一個變量變量dir_JMP用于保存JMPEAX指令的地址。我們執行 看看效果我們可以看到成功定位到了stolenbytes處。下面我們要做的就是將stolenbytes拷貝 點處里我8B0E48開拷貝,一8B0EA4為,意是進制。粘貼到點處。但是由于這是一個間接CALL,所以我們這里直接將其二進制到別的地方的話,目標地址就變了所以這個CALL被到別處的話,首先需要修正偏移量,我們來看看如何修正偏移量,首先我們在數據窗口中定位到該指令FFB784FC,為了下面列方便,這里其命名為OPCODES這里008B0E9F,即這個CALL指令所在的地址命名為DIR_CALL。我們來算一下目標地址004293A0是如何得到的:目標地址=OPCODES+DIR_CALL+好了現在我們已經知道004293A0OCODES目標地址-CL指令新的地址-5=新的CDCLL指令新的地址即該CLL如果Stolenbytes拷貝 點處里我看46B067個地。這地的計算下:原地址-tnbyts的起始地址+ 點stolenbytes所以說新地址為好了現在我們來計算新的OCODE。目標地址-新地址-5=FFB這里新的OPCODES我們有了。現在我們來手動編輯它。我們定位到stolenbytes我們在數據窗口中定位到這個將其替換成新的 點處我們可以看到46B067CLL給添加一些內容讓其自動完成上述操作。執行該里我可看到行了該后,面CALL的移都被正了。下面我們要做的就是將stolenbytes二進制到 點處。 點處,EIP修改 點處修改為這里我不使用OllyDump來修復IAT,所以我去掉了RebuidImport的對勾。然后按dp按鈕進行dp。,這里我們就dump完成了,,因為IAT還沒有修復。下面我們來修復IAT。這里提一句,HideOD這款插件有時候會出錯導致程序正常運行,所以最好將其用HideDebugger和OllyAdvanced代替。好了,第一個已經給大家介紹完了,接下來給大家介紹第二個。vardir_VirtualAllocvardir_VirtualProtectvardir_movgpa"VirtualAlloc","kernel32.dll" movdir_VirtualAlloc,$RESULTlogdir_Virtgpa"VirtualProtect","kernel32.dll"movdir_VirtualProtect,$RESULTbpdir_VirtualAlloclogbasebcdir_VirtualAllocbpdir_VirtualProtectcmpesi,bcdir_VirtualProtectmovReg_esp,[esp]bpReg_espfindbase,#897C24188B4424#movdir_mov,$RESULTlogdir_movjmpNopeobNop2msg"NOP完畢,請按F9鍵運行."附第二個截圖是修IAT其一比較典的法,Martian生在的中細介過。到達OEP之前們可對IAT中定向項設置內存寫入斷點,IAT進行寫入的話,首先得讓IAT,所會調VirtualProtect來改IAT所在存單的存屬性,予其入權。以我們以先對VirtualProtect這Martian先生 這張圖們可看到在了Virtualrotect這個AP函的處,其修改T在內單元的屬性。我們執行到返回,然后對重定向的T項設置內存寫入斷點,接著運行起來,斷在了寫入重定向值的地方。,EAX中保存了重定向的值,EBPIAT們面幾行處設置一個斷點,一下,看看是什么情況。IT,而接下來會將正確的ITNOP掉。首先要做的第一件事情就是查找VirtualAlloc這個API函數的地址,首次斷到VirtualAlloc這個API函數時,我們就可以獲取需NOP掉的指令所在內存單元的首地址了,因為在不同的機器上,待NOP掉的指令的地址是會變的,vardir_VirtualAllocvardir_VirtualProtectvardir_movgpa"VirtualAlloc","kernel32.dll" movdir_VirtualAlloc,$RESULTgpa"VirtualProtect","kernel32.dll"movdir_VirtualProtect,bpdir_VirtualAlloclogbasebcdir_VirtualAllocbp接著對VirtualAlloc設置斷點,運行起來,如果斷下來就跳轉到info處,將該程序剛申請的內存單元的首地址保存到變base中,下面我們需要NOPcmpesi,jeReturnjmpArea下來的,斷ESI值是等460000IT的起地址,為程序調用irtualrotect修改T在內單的屬性。如果等于6的話,就跳轉到rtrn處。bcdir_VirtualProtectmovReg_esp,[esp]bpReg_espfindbase,#897C24188B4424#movdir_mov,$RESULTlogdir_movjmpNopVirtualProtect調用返回后,NOP:897C24188B4424。搜索到了的話就跳轉到Nop處eobNop2msg"NOP完畢,請按F9鍵運行.",這第二個也介完了感謝Ularteck童鞋供的兩個及Martian生提供的我從Martian先的中截了一張來解釋第二個。本章,大家應該對于如何編寫更加了解了吧。SCRIPT.TPPpack-(S:的選什同等們該的個護研透了后再分我最的標序就很。就該布版我對前深解分其應不太因通來本改 這 我們應該很熟悉了吧,可以說幾乎本系列的每一個章節都可以看到。由謂,但是BreakonTLSCallback這個選項這里要記得勾選。如大O加載PckMxrytr....x的話會現沒達到程就出。是為Exrytr了TSABAK一性在點前行碼檢否在調試如則出程TSABAK以在點前Exrytr我們一運行起來就會斷在TLSCALLBACK處。這是OllyAdvanced這個插件幫我們定位到的TLSCALLBACK回調函數的地址。下面我們來看看如何手工定位TLSCALLBACK回調函數的地址。 窗口中定位到該地址,我們往下面看就可以找到TLS回調函數的地址。這里我們就定位到了ExeCryptor在到達點之前要執行代碼的起始地址了,使用OllyAdvanced插件的話,它可以幫助我們直接定位到 我們可以看到TLSTable起始地址的RVA為93110,大小為18。這右邊還有個TLS按鈕,單擊該按鈕我們就可以精確的查看TLS的回調 這里我們打開斷點窗口查看一下,盡管我們之前并沒有設置斷點,我們可以看到這里有一個斷點CALLBACK回調函數的處。老規矩,刪除掉斷點列表窗口中的斷點。我們要的是執行導致的中斷,而不是或者寫入導致的中斷)繼續給返回地址處設置一個斷點,我們繼續往下單步來驗證一下 本章一個來復的能童到這有頭的。嘿一來說人編好的通都較起非復的子會覺頭發撒但我里換不直拿個成的大是著家零始寫個逐加樣家受來容的。varmovtable,460818 logtablevarmovtable,460818cmp[table],jaToSkiplogtablejmpstart這里我們已經改過來了,再次執行該看看效果vartablemovtable,460818cmpjaloglogcontentjmpstart令,然后停在斷點處。好了,現在我們關閉這個窗口,繼續給我們的添加新的內容。varmovcmptable,460F28jafinalcmp[table],jaToSkiplogtablelogcontentjmpstartvartablemovtable,460818cmptable,460F28jafinalcmp[table],jaToSkiplogtablelogcontentjmpstart這里我們就將logcontent后面ret命令去掉了,這樣處理之后,在記錄完重定向IAT項的地址以及值以后,會到達ToSkip處繼續遍歷后面的IAT項,重復上面的過程,直到遍歷完整個IAT為止,我們來看看該執行的效果。vartablemovtable,460818cmptable,460F28jafinalcmp[table],jaToSkipcmpcontent,0jeToSkiplogtablejmpstart -- cobToRepair-- cobToRepair 處,我們繼續wrn將A處執后發二的沒被這是會異因也們的輯用OD的自動功能),OD自動大約要花5分鐘左右的時間。部分指令序列如下:00483C91MainMOVAL,1;00483C93MainJMP00483C7EMainPOPECX; ,00483C7FMainPOPECX;ECX=77DA6C75,00483C80MainPOPEBP;ESP=0012FE74,00483C81MainRETN;004833D5MainTESTAL,AL;004833D7MainJNZ0047CC50MainPOPECX; ,0047CC51MainPOPECX;ECX=77DA6C75,0047CC52MainPOPEBP;ESP=0012FE84,0047CC53MainRETN;CMainMOVEAX,DWORDPTRSS:[EBP-C];EAX=77DA6BF0FMainMOVESP,EBP;ESP=0012FFB0MainJMP004765DC004765DCMainJMP0047F15C0047F15CMainPUSH47C9B5;004737D4MainRETN;0047C9B5MainPOPEBP;ESP=0012FFB4,Memorybreakpointwhenwritingto CMainMOVEAX,DWORDPTRSS:[EBP-C];0046E81DC3RETN這里正確的IAT函數地址將被保存到EAX中,所以下面我們來修改,讓其斷在47691C這條指令處,執行完這條指令后,EAX就保存了正確的API函數地址,接著其填充到對應的IAT項中。vartablemovtable,460818cmptable,460F28jafinalcmp[table],jaToSkipcmpcontent,0jeToSkiplogtablemoveip,contentcobToRepairlogeaxmov[table],eaxjmpstart好,那么現在table指針初始化為460988,然后執行,看看還會不會報錯。vartablemovtable,460988cmptable,460F28jafinalcmp[table],jaToSkipcmpcontent,0jeToSkiplogtablemoveip,contentcobToRepairlogeaxmov[table],eaxjmpstart導致我們無法繼續修復,下面大家來看看我的解決方案,cmplogeaxmov[table],eax決定)。當執行的過程中觸發了異常的話,我們判斷該程序是不是在嘗試調用ZwTerminateProcess這個函數來結束進程,如果是的經修改后,我們的就變成了這個樣子cmptable,460F28jafinalcmp[table],jaToSkipcmpcontent,0jeToSkiplogtablemoveip,contentmov[47691F],0mov[476920],0cobToRepaircmpeip,7C91E88EjeToSkiplogmov[table],eaxjmpstart這里我們把忽略內存異常這個選項的對勾去掉,執行打開IMPREC進一步分析,我個人感覺這個方法不是很通用,如果大家也搞不定的話,可以參考我之前發過的那套國外的脫殼全集,里面本章附件:第五十六章-EXECryptorv2.2.50.b 這里我們可以看到斷在了系統斷點處,我們打開斷點列表窗口,刪除里面的斷點我們可以看到D右下角狀態仍然是但是程序的主界面還是沒有彈出來所以我們再次將該線程掛起繼續恢復下一個線程如面接著運行起來,發現并沒有斷下來, 話,那就最好不過了,如果不是的話,我們就還需要定位讓程序正常運行必需的第三個或者的線程。好,下面這兩個線程以外的其他線程都掛起 也就是說該程序要想正常運行,這里我給大家一些小小的建議:在脫一些強殼的時候,大家沒有必要按照一些的步驟來生搬硬套,大家要學會靈活變通有時候,看到網上的一些的脫殼步驟(譬如:按5次F8,3次F7就可以到達OEP處了+_+),說實話這種有點滑稽可笑,不免有誤人子這里就拿我當前的這個脫殼方案來說吧說不定換了一臺機器就行不通了也說不定。不可控的因素太多了有時候可能同一款殼在不同反件的可會,種東能我量以家平脫的程中要總結經驗,活學活用。 對OEP下面調用的第一個API函數對應的IAT項設置內存寫入斷點,接著利用OD的Traceinto功能來進行自動,自動的時間大這次MOVEAX,DWORDPTRSS:[EBP-C]這條指令的地址為483420,好,下面我們對上一章中編寫的那個進行相應的修改,上一章中的如下vartablemovtable,460818cmptable,460F28jafinalcmp[table],jaToSkipcmpcontent,0jeToSkiplogtablemoveip,contentbphws47691F,"x"mov[47691F],0mov[476920],0cobToRepaircmpeip,7C91E88EjeToSkiplogmov[table],eaxjmpstart-CMainMOVEAX,DWORDPTRSS:[EBP-C];EAX=77DA6BF0FMainMOVESP,EBP;ESP=0012FFB0>8B45F4MOVEAX,DWORDPTRSS:[EBP-C];.|8BE5MOVvartablemovtable,460818cmptable,460F28jafinalcmp[table],jaToSkipcmpcontent,0jeToSkiplogtablemoveip,contentmov[483423],0movcobToRepaircmpeip,7C91E88EjeToSkiplogmov[table],eaxjmpstart cmpeip,483423jnetoToSkiplogeaxmov[table],eax這里我們執行該,會發現還是出錯。沒有調用ZwTerminateProcess,難道是這里我們需要忽略內存異常嗎?好,我們忽略掉內存異常試試。完整的如下:vartablemovcmpjafinalcmp[table],jaToSkipcmpcontent,0jeToSkiplogtablemoveip,contentmov[483423],0movcobToRepaircmpeip,483423jneToSkiplogmov[table],eaxjmpstart這里大家要記住在執行該之前,需要手動在ZwTerminateProcess這個API函數 將TLSTableaddress和TLSTablesizeUnPackMe會檢測是否存在表以及文件監視工具,如果檢測到了會將它們關閉。EAX,DWORDPTRSS:[EBP-C]這條指令的地址為486DF7。00486DF78B45F4MOVEAX,DWORDPTRSS:[EBP-00486DFA CALL0049D560;00486DFF5BPOP00486E008B0424MOVEAX,DWORDPTR00486E0352PUSH如下vartablemovtable,460818cmptable,460F28jafinalcmp[table],jaToSkipcmpcontent,0jeToSkiplogtablemoveip,contentbphws486DFA,"x"mov[486DFA],0mov[486DFB],0cobToRepaircmplogeaxmov[table],eaxjmpstart 執行該修復IAT,IAT修復完畢以后就可以進行dump了,然后打開IMPREC修復dump文件,這樣UnPackMeC就搞定了。UnPackMe我們可以看到調試消息這個選項開啟了,也就是說會檢測調試消息。不知道對我們有沒有影響,我們用OD加載UnPackMeD,還是跟之 自動需要一段時間0046D8DC8B45F4MOVEAX,DWORDPTRSS:[EBP-C];0046D8DF8BE5MOVvartablemovtable,460818cmpjafinalcmp[table],jaToSkipcmpcontent,0jeToSkiplogtablemoveip,contentbphws46D8DF,"x"mov[46D8DF],0mov[46D8DF],0cobToRepairjneToSkiplogmov[table],eaxjmpstart個硬件執行斷點,接著執行該。UnPackMe們直接來看UnPackMeG,UnPackMeG的話就會玩一些新花樣了。UnPackMe我們雙擊運行UnPackMeG,可以看到這個等級反 EAX,DWORDPTRSS:[EBP-C]這條指令,不知道反 點,接著運行起來,我們會發現在到達OEP之前,會斷下來5到6次(由于單步異常導致的),這是反這個選項帶來第一處影響。我們可以看到OD狀態欄中提示:發生了單步異常,需要我們手動按Shift+F7/F8/F9忽略掉這個異常繼續往下執行。這里我們不能夠勾選忽略單步異常這個選項,如果我們勾選了這個選項的話,那么OllyBone插件就不起作用了,所以這里須手動按Shift+F9忽略這些單步異常,大約按5到6次Shift+F9就可能斷到OEP處了。我們可以看到這里只有該程序運行必需的兩個線程如果還存在其他線程這里我們姑且稱這些線程為線程的話,我們需要將這些線掛。由反式了以萬一件面以及這個選 和 下面我們在日志中定位MOVEAX,DWORDPTRSS:[EBP-C]這條指令00491E658B45F4MOVEAX,DWORDPTRSS:[EBP-C];kernel32.GetVersion00491E688BE5MOV 這 中硬件執行斷點的地址替換掉vartablemovtable,460818cmptable,460F28jafinalcmp[table],jaToSkipcmpcontent,0jeToSkiplogtablemoveip,contentbphws491E68,"x"mov[491E68],0mov[491E68],0cobToRepairjneToSkiplogeaxmov[table],eaxjmpstart我們可以看到IMPREC中顯示有無效的項,我們單擊該項左邊的加號將其展開,可以看到這些項修復后的值是錯誤的。movtable,460818cmptable,460978jafinalcmp[table],jaToSkip 執行了該以后,我們可以看到所有的項都被修復了本章附件ExeCryptor2.2.50.rar第五十八章-ExeCryptor我們可以看到點保護開啟了。也就是說,點可能被隱了貌似有點不對勁,我們再來看看之前脫過殼的版本的原理,對于大部分殼(PS:有少數殼可能會玩一些把戲,譬如說:ExeCryptor,它利用了TLS在點之前執行代碼,所以此時的棧頂指針就我們當前這個例子來說,點處時棧頂指針ESP指向的地址是12FFC4。大家在平時脫殼的時候也要多多留意點處的棧頂指面我們來執行PUSHEBP這條指令。我們可以看到EBP的值被保存到12FFC0中了,這是原程序執行的第一條指令。下面我們來看看UnPackMeH,此時的棧頂指針指向的 004271CD83C4A8ADDESP,-58已脫殼設置完內存寫入斷點以后,我們運行起來,00496CBB01變成了000048E2C28F85C0A04700POPDWORDPTRSS:[EBP+47A0C0];EDI7C920738保存到47A4CCB89BDC0A44700MOVDWORDPTRSS:[EBP+47A4C0],EBX=7FFDB000保存到中00498D03899D8C114800MOVDWORDPTRSS:[EBP EAX=0012FFC0保存到0047B0D8中EAX=14F43E150047ACCC中00496CAB01變成了00EDI7C9207380047A888 ESIFFFFFFFF0047AC8800470F8289B5C0A84700MOVDWORDPTRSS:EBP+47A8C0ESIEDX=0047F3EF0047C0B4中EBX=7FFDB000保存到中00498D03899D8C114800MOVDWORDPTRSS: C],雖然我們已經執行了大量的指令,但是還是沒有遇到第一條該程序真正要執行的指令,我們只能耐心的繼續往下跟EAX0012FFC40047B49400498D0B8985CCB04700MOVDWORDPTRSS:[EBP+47B0CC],0047B494C4FF1200C83ADCCB047000>SUBDWORDPTRSS:[EBP+47B0CC],0047B494C0FF120048E2C28F85C0A04700POPDWORDPTRSS:[EBP+47A0C0];大家應該還記得吧-還沒有執行該程序真正要執行的指令呢,EDI=7C9207380047A848B89BDC0A44700MOVDWORDPTRSS:[EBP+47A4C0],EDI;ESI=FFFFFFFF0047AC4800470F8289B5C0A84700MOVDWORDPTRSS:[EBP+47A8C0],繼續耐心往下EBX= 00498D03899D8C114800MOVDWORDPTRSS: C],EBX;EAX=0012FFBC0047B454EAX=192082C00047B048我們明顯的看出這里實際上是一個循環, EBX=0048F082保存到 00496D8A01變成了000048E2C28F85C0A04700POPDWORDPTRSS:[EBP+47A0C0];EDI=7C9207380047A60C中ESIFFFFFFFF0047AA0CEDX=0047F3EF0047BE38中ECX=0047F3EF0047BA2C中EAX=0047E97E0047B624中EBX=7FFDB000004812D800498D03899D8C114800MOVDWORDPTRSS:[EBP CEBXEAX=0012FFC0保存到0047B218中EAX=1B700602保存到0047AE0C中EAX=FFFFFFFF0047B6247EE94700中00496CEB00 還是沒有看到真正要執行的第一條指令,EBX=7FFDB000保存到 004923C8871C24XCH
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 孔隙結構與孔隙水飽和度對水工混凝土強度的影響研究
- NHE7上調通過增強肝細胞癌中巨胞飲體的成熟來增強小細胞外囊泡的攝取
- 城市記憶視角下鄭州國棉廠區文創產品設計研究
- 2025石油模擬考試試題及答案
- 內蒙古呼和浩特市回民區2024-2025學年高二上學期期末考試語文試題(解析版)
- 中小微企業證券設計及股權資產證券化數學模型
- 2025年干細胞治療神經性頭痛的臨床療效評估報告
- 從公所到同業公會-漢口茶業同業組織的演變(1868-1937)
- 基于軟開關的兩級式AC-DC變換器研究
- 基于納米線陣列結構高效分離微納尺度物質
- 2025年化妝師職業技能考試試題及答案
- GA 1812.1-2024銀行系統反恐怖防范要求第1部分:人民幣發行庫
- 2025中信建投證券股份限公司校園招聘易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年山東省泰安市新泰市中考二模化學試題(原卷版+解析版)
- 2025年雞蛋市場調查報告
- 2025年職業技能競賽(計算機程序員賽項)參考試題(附答案)
- 合伙人商業保密協議書9篇
- 湖北省武漢市2025屆高中畢業生四月調研考試語文試卷及答案(武漢四調)
- 2025年全國中小學生百科知識競賽題庫及答案(480題)
- 測控技術培訓課件
- 2025年度專業技術人員繼續教育公需科目考試題(附答案)
評論
0/150
提交評論