使用ollydbg從零開始cracking第五十三章tpppack脫殼_第1頁
使用ollydbg從零開始cracking第五十三章tpppack脫殼_第2頁
使用ollydbg從零開始cracking第五十三章tpppack脫殼_第3頁
使用ollydbg從零開始cracking第五十三章tpppack脫殼_第4頁
使用ollydbg從零開始cracking第五十三章tpppack脫殼_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

上一章中最后留的那個小比賽最后的獲勝者是lateck童鞋。下面我們就用lateck童鞋編寫的第一個來定位EP以及修復(fù)tolenbtes。如下:CracksLatinoS-作者描述:該的功能的定位TPPpack的OEP以及修復(fù)其stolen目標程序UnPackMe_TPPpack配置要求:ODBGScript148,HideDebugger124,HideOD,停在點處,忽略Kernel32的異常,其他異常均不忽因為我們這里要用到最后一次異常法,所以在執(zhí)行該之前首先要知道最后一次異常的地址,然后再執(zhí)行該腳本以下關(guān)于該的詳細注vardir_excepvarNewoepvardir_JMPvardir_CALLvaroepvarStartScanvarOpcodesvartempvartemp2varmovNewoep, //將點保存到變量Newoepask"最后一次異常的地址是多少 //彈出一個框讓用戶輸入最后一次異常的地cmp //判斷用戶是否輸入了地je //如果用戶沒有輸入地址則跳轉(zhuǎn)到warningmovdir_excep //將用戶輸入的地址保存到變量dir_excepjmp //跳轉(zhuǎn)到Initiationmsg"請重新執(zhí)行該,再次輸入一個有效的地址jmp //運行起eoe //如果發(fā)生異常斷了下來,就跳轉(zhuǎn)到checkcmp //判斷斷下來的地方是不是最后一次異常je //斷下來的地方剛好是最后一次異常處,則跳轉(zhuǎn)到last //忽略掉異常繼續(xù)執(zhí)行,相當于在OD中按SHIFT+F9jmpInitiation: //跳轉(zhuǎn)Initiation處繼續(xù)定位最后一次異常處findopeip,#FFE0# //從最后一次異常處開始搜索JMPEAX指令,以便下面定位stolenbytesmovdir_JMP,$RESULT //將JMPEAX指令的地址保存到變量dir_JMP中bp //JMPEAX指令設(shè)置斷 //忽略掉異常繼續(xù)執(zhí)行,相當于在OD中按了bc //刪除掉JMPEAX指令處的斷 //單步步入,相當于在OD中按F7,單步以后就到了stolenbytesmov //stolenbytes的起始地址保存到變量oepmov //stolenbytes的起始地址保存到變量StartScan //開始搜索Stolenbytes中需要修正偏移量的findop //搜索以機器碼E8開頭的CALL指令,即待修正偏移量的CALL指 //判斷是否搜索到了待修正偏移量的CALL指je //沒有搜索到的話,則跳轉(zhuǎn)到finalmovdir_CALL,$RESULT //將待修正偏移量CALL的地址保存到變量dir_CALL中movStartScan,$RESULT //將待修正偏移量的CALL指令的地址賦值給變量StartScanadddir_CALL,1 //指向偏移量movOpcodes //獲取待修正的偏移量并保存到變量Opcodesadd //將偏移量加上CALL指令所在的地add //加上CALL指令的長//這樣就得到了CALL指令的目標地//修正CALL指令的偏移movtemp //CALL指令的地址保存到臨時變量tempsubtemp //計算CALL指令距離stolenbytes起始地址的長度,并保存到臨時tempmovtemp2, //將點的值保存到臨時變量temp2add //計算CALL指令新的地址,并保存到變量tempsubOpcodes //將目標地址減去CALL指令新的地subOpcodes //然后減去5,就得到了CALL指令修正后的偏移 //將CALL指令的偏移量修movtemp3 //CALL指令所在的地址保存到臨時temp3add //指向待修正的偏移movtemp3 //修正偏移jmp附的截圖Part1:定位OEP并修復(fù)stolenbytes(byUlarteck)。首先我們需要配置一下反反調(diào)試插件OD加載目標程序以后直接運行起來,可以看到完美運行下面我們利用最后一次異常法來定位OEP,對于最后一次異常法大家應(yīng)該很熟練了吧。我們經(jīng)常會用到它。此法同樣適用于ASProtect21SKE,22SKE,23SKE以及帶VM的版本。這里我們先將所有忽略的異常選項都勾選上接著將程序運行起來,然后打開日志窗口,看看最后一次異常發(fā)生指令所在的地址是哪里我這里最后一次異常指令所在的地址為004636B,下面我們就可以利用來定位E。在使用之前,我先演示一下如何手工定位EP。我們重啟OD接著將忽略的異常選項的對勾都去掉接著直接按F9鍵運行起來。如果斷在了不是0046D36B的異常處的話,就直接按SHIFT+F9忽略掉異常繼續(xù)執(zhí)行這里我們就斷在了最后一次異常處。接下來按TM對代碼段設(shè)置內(nèi)存斷點。按SHIFT+F9忽略掉異常運行起來,斷在了這里如果我們觀察一下堆棧的話就會發(fā)現(xiàn)這里并不是真正的OEP,明顯存在stolenbytes我們可以看到之前已經(jīng)執(zhí)行過stolenbytes了。返回地址為8B0EA4,該地址屬于起始地址為8B0000的區(qū)段好,下面我們重啟OD我們現(xiàn)在將修改一下,讓其自動定位到最后一次異常處。將修改成如下:好,修改完畢以后我們重啟OD以后,執(zhí)行該這里彈出了一個框要求我們輸入最后一次異常指令所在的地址,這里我輸入4636B單擊K。好了,我們可以看到執(zhí)行完畢了,我們可以看到剛好斷在了最后一次異常處。我們按TM打開區(qū)段列表窗口。接下來我們并不是跟剛才一樣對代碼段設(shè)置內(nèi)存斷點,這次我們對起始地址為8B0000的區(qū)段設(shè)置內(nèi)存斷點。按SHIFT+F9忽略掉運行起來,斷在了stolenbytes處。如果我們按減號鍵可以看到回到了最后一次異常指令處以下是根據(jù)Martian先生在他的中介紹的定位stolenbytes的思路編寫的,定位stolenbytes的思路如下:首先定位到最后一次異常處,接著往下搜索機器碼為FFE0的JMPEAX指令,搜到該指令以后,對其設(shè)置斷點,接著運行起來,斷到了JMPEAX處,后按F7鍵單步一下,就可以到達stolenbytes處了。變量dir_JMP用于保存JMPEAX指令的地址。接下來在last處添加以下內(nèi)容:我們執(zhí)行該看看效果我們可以看到成功定位到了stolenbytes處。下面我們要做的就是將stolenbytes拷貝到點處這里我們從8B0E48開始拷貝,一直到8B0EA4為止,注意是二進制粘貼到點處這里我們可以看到46B067處的這個CALL是一個間接CALL這里原stolenbytes應(yīng)該是CALL004293A0,目標地址是004293A0但是由于這是一個間接CALL,所以我們這里直接將其二進制到別的地方的話,目標地址就變了所以這個CALL被到別處的話,首先需要修正偏移量,我們來看看如何修正偏移量,首先我們在數(shù)據(jù)窗口中定位到該指令這里我們不用考慮前面的操作碼,直接看后面的4個字節(jié)的偏移量FFB784FC,為了下面列方便,這里其命名為OPCODES這里008B0E9F,即這個CALL指令所在的地址命名為DIR_CALL。我們來算一下目標地址004293A0是如何得到的:目標地址OPCODESDIR_CALL目標地址FFB784FC008B0E9F5好了,現(xiàn)在我們已經(jīng)知道0042930這個目標地址是如何得來的了。下面我們來計算新的CE。目標地址-CLL指令新的地址-5=新的OCOES何謂CALL指令新的地址:即該CALL指令被拷貝到的新的地址。如果Stolenbytes拷貝到點處這里我們看到46B067這個地址。這個地址的計算如下:原地址-Stolenbytes的起始地址+點這里原地址為008B0E9Fstolenbytes的起始地址點為0046B0108B0E9F-8B0E48+46B010=所以說新地址為目標地址-新地址-5=FFFBE334004293A0-0046B067-5=FFFBE334這里新的OPCODES我們有了。我們定位到stolenbytes處我們在數(shù)據(jù)窗口中定位到這個這里我們跳過E8這個機器碼,直接修改后面的4個字節(jié)的偏移量將其替換成新的我們可以看到該CALL的OPCODE已經(jīng)改變了,現(xiàn)在stolenbytes拷貝到點處我們可以看到46B067處的CALL的目標地址這次正確了下面我們給添加一些內(nèi)容讓其自動完成上述操作然執(zhí)行該這里我們可以看到執(zhí)行了該后,下面CLL的偏移量都被修正了。下面我們要做的就是將tolenbyts二進制到點處。好,現(xiàn)在我們定位到了點處,EIP修改到點處我們選擇是,下面來進行dumpMartian先生的中提到了,這個大小也得修改,不然單擊Dump按鈕,會報錯修改為然后按dump按鈕進行dump。好了,這里我們就dump完成了,但是肯定是無法正常運行的,因為IAT還沒有修復(fù)。下面我們來IAT。如果我們直接用OD加載dump文件的話,直接就會報錯我們嘗試用PE編輯工具重建PE好,重建PE完畢了,我們再次用OD加載它這里提一句,ideD這款插件有時候會出錯導(dǎo)致程序正常運行,所以最好將其用ideebugger和llyvancd代替。好了,第一個已經(jīng)給大家介紹完了,接下來給大家介紹第二個。varvardir_VirtualAllocvardir_movgpaVirtualAllockernel32 //獲取VirtualAlloc這個API函數(shù)的地logdir_VirtualAllocgpa"VirtualProtect","kernel32dll"movdir_VirtualProtect,$RESULTbpdir_VirtualAlloceobmovbase,eaxlogbasebcdir_VirtualAllocbpdir_VirtualProtecteobSectioncmpesi,jeReturnjmpbcdir_VirtualProtectmovReg_esp,[esp]bpReg_espeobArea_1bcfindbase,#897C24188B4424#movdir_mov,$RESULTlogdir_movjmpNopbpdir_moveobNop2bcfilldir_mov,4,msgNOP完畢,請按F9鍵運行附第二個截圖這是修復(fù)T其中一個比較經(jīng)典的方法,Matian先生在他的中詳細介紹過。在到達EP之前我們可以對T中重定向的項設(shè)置內(nèi)存寫入斷點,T進行寫入的話,首先得讓IT所在的內(nèi)存單元具有寫入權(quán)限,所以勢必會調(diào)用itualotect來修改T所在內(nèi)存單元的內(nèi)存屬性,賦予其寫入權(quán)限所以我們可以先對itualotect這個I函數(shù)設(shè)置一個斷點,等執(zhí)行完該函數(shù)賦予寫入權(quán)限以后,我們再對IT中重定向的項設(shè)置內(nèi)存寫入斷點。從Martian先生中這張截圖我們可以看到斷在了VirtualProtect這個API函數(shù)的處,其想修改IAT所在內(nèi)存單元的屬性。我們執(zhí)行到返回,然后對重定向的IAT項設(shè)置內(nèi)存寫入斷點,接著運行起來,斷在了寫入重定向值的地方。這里就斷在了寫入重定向值的地方,仔細觀察我們可以知道此時EX中保存了重定向的值,而EBP指向的是對應(yīng)的T項?,F(xiàn)在我們面幾行處設(shè)置一個斷點,一下,看看是什么情況。我們可以看到前面幾行會獲取正確的T值,而接下來會將正確的T值覆蓋為重定向的值。所以我們要做的就是將寫入重定向值的語句NP掉。所以要做的事情就是定位到寫入重定向值的指令,并將其NOP掉首先要做的第一件事情就是查找VirtualAlloc這個API函數(shù)的地址,首次斷到VirtualAlloc這個API函數(shù)時,我們就可以獲取需要NOP掉的指令所在內(nèi)存單元的首地址了,因為在不同的機器上,NOP掉的指令的地址是會變的,所以我們有必要動態(tài)獲取varvardir_VirtualAllocvardir_movgpaVirtualAllockernel32 //獲取VirtualAlloc這個API函數(shù)的地logdir_VirtualAlloc這里是獲取VirtualAlloc這個API函數(shù)的地址,然后將其保存到變量dir_VirtualAlloc中,同理VirtualProtect也是一樣gpa"VirtualProtect","kernel32dll"movdir_VirtualProtect,$RESULT獲取VirtualProtect這個API函數(shù)的地址,然后將其保存到變量dir_VirtualProtect中bpdir_VirtualAlloceobmovbase,eaxlogbasebcdir_VirtualAllocbpdir_VirtualProtect接著對VirtualAlloc設(shè)置斷點,運行起來,如果斷下來就跳轉(zhuǎn)到info處,將該程序剛申請的內(nèi)存單元的首地

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論