調試好幫手ODbgScript 入門(mén)系列(二) ODbgScript的腳本語(yǔ)言和命令
(作者:hnhuqiong)
總觀(guān)ODbgScript洋洋灑灑那么多腳本命令,其實(shí)它分成了6大類(lèi):
1.變量和注釋類(lèi)和雜類(lèi) 2.斷點(diǎn)類(lèi) 3.系統和操作類(lèi) 4.流程控制類(lèi) 5.計算和寄存器操作類(lèi)
6.字符串操作和搜索和替換類(lèi)
這里我就不那么具體的舉例子了,因為那么多命令要是逐一圖片講解將成為天書(shū)了.
而具體的例子將在后面的章節來(lái)論述.這里將論述的是思想.授人以漁是上策!
文章不短,建議邊聽(tīng)音樂(lè )邊看(建議曲目:喜唰唰,披著(zhù)羊皮的狼)
一. 變量和注釋以及雜類(lèi)
$RESULT :這個(gè)是系統保留變量,函數和ODS的命令返回都放這里.它還有一個(gè)隱含的變量
為$RESULT_1,有的返回是2個(gè)參數,第二個(gè)放這里.
$VERSION :返回當前版本號
VAR :在腳本中,聲明一個(gè)變量
AN :從指定處,對代碼進(jìn)行分析
CMT :在指定地址處,加入注釋
MSG :將指定消息,顯示到一個(gè)對話(huà)框中
MSGYN :將指定消息,顯示到一個(gè)對話(huà)框中,這個(gè)對話(huà)框有“是”、“否”按鈕
ASK :顯示一個(gè)提示輸入框,讓用戶(hù)輸入,并將結果保存轉保留變量$RESULT中
(如果用戶(hù)按了取消鍵,則$RESULT=0)
#INC :腳本里面包含了另外的腳本
這是一個(gè)小類(lèi),它們主要就是做變量和注釋工作.其中唯一需要注意的是var命令,它是一個(gè)變量聲明
命令,如果要養成一個(gè)好的腳本編輯習慣,你最好將腳本的變量名字命令的通俗易懂,這樣,不會(huì )到了時(shí)間
久遠而不至于你自己都看不懂你的腳本.
例子:
var a :這就不是一個(gè)好的變量名,其它人或者時(shí)間久了你都不知道它是干什么用的了.
好的例子--var entrypoint
二.斷點(diǎn)類(lèi)
------普通斷點(diǎn)類(lèi)
BP :在指定地址設斷點(diǎn)
BC :清除指定地址的斷點(diǎn)
------條件斷點(diǎn)類(lèi)
BPCND :在指定地址處,設置條件斷點(diǎn)
BPL :在指定地址處設置記錄斷點(diǎn),將表達式的結果記錄到記錄窗口中
BPLCND :在指定地址處設置記錄斷點(diǎn),如果條件為真時(shí),將表達式的結果記錄到記錄窗口中
------硬件斷點(diǎn)類(lèi)
BPHWS :在指定地址,設置硬件斷點(diǎn)
BPHWC :刪除指定地址處的硬件斷點(diǎn)
BPHWCALL :刪除所以的硬件斷點(diǎn)
------內存斷點(diǎn)類(lèi)
BPRM :在指定地址處,設置一個(gè)內存讀取斷點(diǎn)
BPWM :在指定地址處,設置一個(gè)內存讀寫(xiě)斷點(diǎn)
BPMC :清除內存斷點(diǎn)
對于調試和逆向工作來(lái)說(shuō),斷點(diǎn)是重中之重!只有掌握了斷點(diǎn)基本技能,才能說(shuō)你學(xué)會(huì )了逆向工作的入門(mén).
有過(guò)編程經(jīng)驗的人都知道在源代碼下調試還是比較容易的,因為你可以在源代碼上直接下斷點(diǎn)調試.而逆向就
不同了,你面對的是二進(jìn)制文件,如何找斷點(diǎn),怎么下斷點(diǎn)都是靠常年累月積累下來(lái)的經(jīng)驗.當然在看雪你能學(xué)
到很多很多的下斷點(diǎn)技巧.ODbgScript里面提供的斷點(diǎn)基本囊括了OD強大的下斷點(diǎn)的功能.而如何靈活的組
合和使用它們將讓你的逆向水平有質(zhì)的飛躍.
這一節可以和CCdebuger的OD斷點(diǎn)文章相參照學(xué)習腳本的編輯和斷點(diǎn)使用.
ODbgScript斷點(diǎn)命令是通過(guò)OD的API接口向OD下斷點(diǎn)命令的,所以,只要你在OD中能下的斷點(diǎn),那么,在
腳本中就能一樣下同樣的斷點(diǎn).所不同的是一個(gè)是你手工下,一個(gè)是腳本幫你下!可以這樣說(shuō),逆向和解密就
是不斷的靠近自己所需要的核心地帶,只要真正的找到了核心地帶,那么剩下的就是程序等待你的肢解和解
剖了.而這個(gè)過(guò)程就是如何利用斷點(diǎn)來(lái)靠近它.而讓人痛苦的是,常常你要經(jīng)過(guò)無(wú)數次的實(shí)驗和驗證你才會(huì )
靠近你所需要的核心地帶.沒(méi)有ODbgScript以前,這個(gè)是一個(gè)讓人痛苦不堪的過(guò)程,特別是如果程序有大量
的干擾和anti,你必須手工小心翼翼的越過(guò)這些障礙,爬山涉水千艱萬(wàn)險的來(lái)到程序某個(gè)地方,一不留神被
ANTI打倒,你必須重頭再來(lái),這個(gè)過(guò)程任何玩逆向的人都深有體會(huì ).特別是在沒(méi)有OD以前,記得多年前我在2.8
版的SICE上,為記錄很多東西不得不鬼畫(huà)桃符的寫(xiě)的到處都是記錄.而一旦"失手",那么很多過(guò)程是不得不再
做一遍.其中的艱辛不是能描述的.
而有了ODbgScript你就不同了,anti也好干擾也好,它能讓你過(guò)去的工作在瞬間幫你完成.你就能集
中力量尋找你的核心地帶,而不會(huì )被已經(jīng)分析過(guò)的各種干擾,anti所打倒!它就是我們對付ANTI和蟲(chóng)海戰術(shù)的
利器!!!可以說(shuō)一個(gè)軟件或者一個(gè)殼無(wú)論你有多復雜,無(wú)論你多蟲(chóng)海,只要有一個(gè)人有真正進(jìn)展!并公布工作
腳本,盡管是半成品那么其它人就可以利用腳本不斷的站在前人的肩膀上,向你進(jìn)攻!殼是相對靜態(tài)的防守,
這就是加密和加殼軟件的悲哀!你是anti是利用不為人知的后門(mén),就有無(wú)數人想方設法靠近你的命門(mén),那么
你的"專(zhuān)利"就大白天下了.你是多么復雜的算法,多么變態(tài)的VM,那么只要每天有人在算法上進(jìn)步一點(diǎn)點(diǎn),
點(diǎn)點(diǎn)滴滴的積累將會(huì )鐵棒磨成針,不要小看逆向界人的耐心!!!!
由于后門(mén)和有效ANTI越來(lái)越少,加密和加殼開(kāi)始向蟲(chóng)海方向發(fā)展,也就是利用反復的加密算法和動(dòng)態(tài)解碼
,以及VM(虛擬機)來(lái)產(chǎn)生大量的垃圾代碼,反復和你斗你的耐心,從個(gè)人角度來(lái)說(shuō),的確逆向界開(kāi)始遇到了一
堵厚實(shí)的墻.但大家要相信一句話(huà),自古有矛就有盾!!!.我還相信一句就是眾志成城!!!
這也是我想發(fā)展ODbgScript的初衷和下力氣寫(xiě)這篇文章的動(dòng)力.
羅嗦了半天,我自己都感覺(jué)我像纏腳的老太婆了.
其實(shí)我們用ODbgScript的一個(gè)主要目的就是-----直奔主題!
好了,我現在也回來(lái)直奔主題.我說(shuō)到哪里里了??(各種磚頭都來(lái)了)
這里,我們來(lái)演示一下斷點(diǎn)的設置,看看在ODbgScript中下一個(gè)斷點(diǎn),那么OLLYDBG中有什么反應???
我們調出你的編輯器,先寫(xiě)一個(gè)簡(jiǎn)單的腳本如下,然后保存成txt或者osc文件:
bp 40a910
bc 40a910
然后調出腳本運行窗口,引導你剛才寫(xiě)的腳本進(jìn)來(lái),按下S鍵,我們看看ODbgScript和OD中的斷點(diǎn)窗口各有什么反應.
(插入圖一:2-bp.jpg)
腳本窗口里面一按S,馬上OD的斷點(diǎn)窗口就產(chǎn)生了一個(gè)斷點(diǎn).再按一下S,OD中的斷點(diǎn)窗口中的斷點(diǎn)又消失了.
哈哈,我再按,我再按.喲,怎么沒(méi)有反應了?當然就2句命令,你按那么多抽風(fēng)呀???
(被一頓暴打,教學(xué)就教學(xué),哪來(lái)那么多怪話(huà))
那么,現在我們知道了,ODbgScript和OD之間通過(guò) Plug-in API接口能很好的溝通.最起碼比OD斷點(diǎn)窗口里面
你要手工設斷點(diǎn)激活或者刪除強多了吧?要知道偷懶的人多了去了(被無(wú)數人怒目而視,寒~~~~),能省下時(shí)間干什么
去??直奔主題!!!!每次開(kāi)會(huì )看見(jiàn)我們單位的頭我都在假想,他會(huì )逆向多好呀....
OD中斷點(diǎn)主要分為4小類(lèi),普通斷點(diǎn),內存斷點(diǎn),硬件斷點(diǎn),條件斷點(diǎn).我不打算講解斷點(diǎn)的原理,有興趣大家
可以看看雪大量的文章,大俠級別的,斷點(diǎn)玩的都不叫斷點(diǎn)叫INT,這個(gè)是什么?我不知道,我是菜鳥(niǎo)級別,不敢往
這個(gè)上面發(fā)言....
那么,這四小類(lèi)斷點(diǎn)和其它命令的的組合將帶你進(jìn)入五光十色的逆向世界!!!
3.系統和操作類(lèi)
-----內存操作類(lèi)
ALLOC :分配新的內存頁(yè), 你能讀/寫(xiě)/執行.
FREE :釋放由ALLOC申請的內存.
-----文件操作類(lèi)
DM :從指定地址處開(kāi)始,在內存中提取指定大小的數據,并保存到指定的文件中
DMA :從指定地址處開(kāi)始,在內存中提取指定大小的數據,并保存到指定的文件中;
如果指定文件已存在,則將數據追加到指定文件尾部。
DPE :提取執行模塊到指定文件中。
WRT :Write to file (replace existing on
e) the only accepted symbol is
"\r\n"Numbers are wrote as strings... for the moment
WRTA :Append to file
LM :引導Dm文件到內存 ,LM is the opposite of the DM command
-----系統信息類(lèi)
GPA :在指定的動(dòng)態(tài)鏈接庫中,獲得指定函數的地址。
GCMT :獲得指定地址的注釋
GMEMI :獲得內存塊的指定信息
GPI :獲得進(jìn)程信息
GN :獲得指定地址的符號名(比如指向API函數)
GMI :獲得指定地址所在模塊的相關(guān)信息。
HANDLE :獲得句柄信息
-----匯編和OD控制類(lèi)
ASM :修改指定地址的指令。
EXEC/ENDE :對當前調試進(jìn)程,執行在EXEC和ENDE之間的指令
KEY :相對于在OD中執行按鍵
古話(huà)有說(shuō):滿(mǎn)紙荒唐言,一把辛酸淚.
其實(shí),這段是最難寫(xiě)的,因為這段是承上啟下的一段,有了這段你才能體會(huì )ODbgScript的強大,才
能從這里開(kāi)始和中斷組合產(chǎn)生各種五光十色的腳本世界,來(lái)到這段我常常有一種如履薄冰的感覺(jué),生怕
誤人子弟.這里別看命令不多,可句句都是重點(diǎn).我在看源程序的時(shí)候,對這段的了解才更加的加深了我
對OD和ODbgScript的理解.
而ODbgScript今后如果能成功升級,核心的重點(diǎn)也在這里.
古人云:工欲善其事,必先利其器.如果說(shuō)中斷是ODbgScript的器.那么這里就是利你的器!!!
是情報和特工及軍隊機構,沒(méi)有情報機構,那就是瞎打亂打.沒(méi)有特工機構,就會(huì )讓你身處危險而不知其險.
沒(méi)有軍隊,你面對敵人強大的防護,束手無(wú)策!
希望不至于寫(xiě)成類(lèi)MSDN的東西,可很多東西又難以取舍,霍金有一句話(huà),你的一個(gè)公式能讓你的讀
者少50%.我盡量能寫(xiě)成入門(mén)級的東西,霍金的名言才讓他的<時(shí)間簡(jiǎn)史>讓無(wú)比抽象的時(shí)空概念深入人
心,讓千千萬(wàn)萬(wàn)的老百姓明白什么是黑洞和黑洞輻射.
好了我們再次奔小康,不是不是,是奔主題!!!!(場(chǎng)外人全部處于抓狂中....)
首先我們在腳本里面寫(xiě)下這樣一些命令,引入ODbgScript然后按S執行.
gpa "MessageBoxA", "user32.dll"
bp $RESULT
esto
bc $RESULT
(圖片2-gpa.jpg)
大家看到了,在返回值欄里面有一個(gè)值,這個(gè)值是什么呢?就是函數MessageBoxA的入口地址,這個(gè)
函數常常被注冊碼類(lèi)的程序所調用,給大家一個(gè)比如注冊碼錯誤之類(lèi)的提示.如果我們要定位這個(gè)注冊
碼的算法位置,那么如果彈出來(lái)了這樣的窗口,算法就在附近不遠的地方.情報機構上!!!!告訴我坐標,
中斷大炮在后面等著(zhù).大炮要打敵人第一件事情是要知道敵人在什么地方.而這個(gè)MessageBoxA的入口
地址就是敵人首先暴露的一個(gè)坐標點(diǎn).我們利用GPA命令來(lái)定位它的位置,而這個(gè)位置是隨著(zhù)計算機的不
同而不同的,我們要抓住敵人,就要充分利用GPS來(lái)定位它!不對不對,不是GPS是GPA!!!(場(chǎng)下開(kāi)始騷亂,
臺上死豬不怕開(kāi)水燙的繼續說(shuō)),情報機構準確的抓到了這個(gè)位置,那么通信兵是誰(shuí)???就是$Result!!
它越過(guò)重重封鎖線(xiàn)將坐標地址給中斷大炮陣地送來(lái)了坐標,預備!~~~放!!!我們按下空格鍵讓中斷大炮
去打吧.
轟!程序詫然停止.打中啦~~士兵狂吼,硝煙散去.
作為指揮官的你鄒了一下眉頭,自言自語(yǔ)的說(shuō),是打中了,可離人家指揮中心差老鼻子了.又不是原
子彈,覆蓋范圍可以那么大!
怎么辦?還需要更加精確的坐標!我們要派特別行動(dòng)隊出動(dòng)了.
腳本上開(kāi)始加下面的句子,然后執行,并調出OD的內存窗口,可以進(jìn)行觀(guān)察:
alloc 2000
我們可以看到OD的內存區中增加了一個(gè)塊,大小2000屬性RWE.大家對比一下圖3和圖4
(插入圖三: 2-alloc1.jpg)
(插入圖四: 2-alloc2.jpg)
(我們在敵人的眼皮低下打了一個(gè)埋伏區..這個(gè)埋伏區可以藏彈藥,可以藏軍隊,還可以打一場(chǎng)CS............
....臺上不說(shuō)話(huà)了,CS激戰中......想暗渡陳倉?小心點(diǎn)記得留退路喲...
突然聽(tīng)見(jiàn)MS中央電臺廣播在不斷的播放歌曲:
"洗刷刷,洗刷刷,請你--拿了給我的送回來(lái),吃了我的給我吐出來(lái),欠了我的給我補回來(lái),偷了我的給我交出來(lái)!!!"
偵測連長(cháng)看偷襲陣地這樣長(cháng)期占領(lǐng)危險,還是有借有還!再來(lái)不難,馬上燒軍火等等走人.)
free $RESULT,2000
這里指揮官還派出了外交官,要打擊敵人就要從多方面的入手.
gmi eip,CODEBASE (或者CODESIZE,或者 MODULEBASE,MODULEDSIZE等,外交部在不斷擴大范圍中...)
(插入圖五:2-gmi.jpg)
某某情報局派出了天下無(wú)敵光頭武乞丐功夫王"零零漆"----外號"走醒醒"上場(chǎng).
GPI MAINTHREADID(可以是 HPROCESS,PROCESSID,HMAINTHREAD,MAINTHREADID,MAINBASE,PROCESSNAME......)
(插入圖片六:2-GPI.jpg)
某新聞社派出了強大的以"不是零"為代表的著(zhù)名文字分析專(zhuān)家記者代表團.要知道記者是無(wú)冕之王!!!!!!
這里可以說(shuō)你會(huì )明白為什么"焦點(diǎn)訪(fǎng)談"為什么那么可怕了.老百姓歡迎,有的人就要....
(這里放到下面的一章專(zhuān)門(mén)講敘)
為了打好這場(chǎng)戰役,某野戰軍派出了王牌之師,ASM給以策應.
ASM eip,"mov [eax],edx"
從戰役角度來(lái)說(shuō),圍點(diǎn)一定要打援,那么,現在敵人那么狡猾,我們怎么能缺少這樣的策應隊伍呢???
它為什么是策應隊伍呢?因為它只能向代碼區匯編一句,效率比較低.但是畢竟是在和敵人干上了...
最高首長(cháng)派出了空軍王牌師EXEC/ENDE,直接轟炸給予空中支持,可惜空軍轟炸機只有能裝255顆炸彈的彈藥倉.
exec
mov eip,[eax]
ENDE
對當前調試進(jìn)程,執行在EXEC和ENDE之間的指令。
有這個(gè)命令就是你可以越過(guò)ODbgScript直接跳入進(jìn)程,對進(jìn)程進(jìn)行直接控制.
它的原理就是取當前進(jìn)程的信息進(jìn)行保存,然后新分配一個(gè)代碼內存區(可讀/寫(xiě)/執行.大小1000)
調用OD匯編器將你的匯編語(yǔ)句轉成OPcode,將OPcode拷貝到代碼區,然后將EIP指向你的代碼開(kāi)頭.
然后將控制權交給你.執行完后將EIP歸還原位,然后將控制權交還ODbgScript.
這里的好處就是讓你以很高的效率來(lái)避免在較慢的腳本環(huán)境運行需要高效的操作.
!注意:由于進(jìn)程控制權交給你了,那么,你的代碼有效性將只有你自己來(lái)控制了.
!注意:執行后不保存現場(chǎng).這都需要你來(lái)做工作.(要保存現場(chǎng),你可以使用pushad,popad)
有大括號的,會(huì )被大括號中的變量的值替代。
(這對命令有小BUG在下一個(gè)發(fā)布版本中修正)
還有就是我們英雄的幕后部隊,電子對抗隊伍KEY在默默的支持著(zhù)這場(chǎng)生死之戰..
key 20, 1 //Shift+space
一場(chǎng)戰役就這樣開(kāi)始打響,轟轟烈烈.................(世界沒(méi)有免費的午餐)
各種部隊和敵人短兵相接....刺刀見(jiàn)紅..............(見(jiàn)后章)
你會(huì )看見(jiàn)我們的軍隊是那么連貫的一氣呵成完成了使命..(效果出來(lái)了)
千帆過(guò)盡譜寫(xiě)的是華麗篇章........................(過(guò)程是那么美不盛收)
盡管盡管曾經(jīng)歷經(jīng)千山萬(wàn)水........................(過(guò)程是那么令人辛酸)
可最終還是劍指七寸紅顏笑........................(原來(lái)是披著(zhù)羊皮的狼)
最后是你哼著(zhù)"日落西山打靶歸...."
打掃戰場(chǎng),收獲你的戰利品,文件類(lèi)操作就是干這個(gè)的.......
dpe "c:\unpack.exe", 401000
(再不睡覺(jué)我LP要和我刺刀見(jiàn)紅了 :( )
好了,這篇先到這里,下一篇將介紹ODbgScript的文字串命令和流程控制命令.