修改進程常量的幾種方法-如何修改進程只讀數(shù)據(jù)段的訪問控制屬性_第1頁
修改進程常量的幾種方法-如何修改進程只讀數(shù)據(jù)段的訪問控制屬性_第2頁
修改進程常量的幾種方法-如何修改進程只讀數(shù)據(jù)段的訪問控制屬性_第3頁
修改進程常量的幾種方法-如何修改進程只讀數(shù)據(jù)段的訪問控制屬性_第4頁
修改進程常量的幾種方法-如何修改進程只讀數(shù)據(jù)段的訪問控制屬性_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1.引言本文筆者在研究某著名軟件的安全性時,碰到要修改進程中只讀數(shù)據(jù)段(.rdata)中的常量值的場景。筆者將這方的方法技巧及相關的經(jīng)驗向廣大讀者朋友進行分享,同時由于筆者技術(shù)水平有限,本文中若有錯誤懇請不吝賜教)。術(shù)水平有限,本文中若有錯誤懇請不吝賜教)。sNewvalue:圖-1sNewvalue:圖-1修改常量值的程序代碼修改常量值,為避免編謂昔誤,直接修改內(nèi)存r而不能賦值.為了簡單的說明問題,筆者使用~0心匕寫了一個小示例程序(其實,使用什么語言并不重要,本示例程序只是為了分析問題,并驗證問題解決思路是否正確,從嚴格意義來說該示例也有許多不嚴謹之處,例如因為編譯器不同對字符串常量的處理也是不同的,但這些細節(jié)問題我們暫時可以忽略),在本示例程序中,聲明了一個全局常量,在程序中動態(tài)修該常量值,看看運行下過如何。

改寫常里改寫常里2021-1.CHBL321so2021-1.CHBL321so9*36;藥ei-UHBL3:E5英?4L2021-LCHZ6L3£509M”2O2L-LCHBL325?比ia-Lir*FL3.”.典nh]0*艇nnmuitUx“<wrtNlmMnnnn!qH*a白值¥乳(Aec*xx-vialitim*L*ldr*xx tnnodul*'Bfiit?£d ?nU**o.u*'.Krittof UHE2:}04修改常量值報寫內(nèi)存錯誤作?占國鳳患遂向班快件或缶IS的卡后,底近和廣加本看史g卻在QQ:7Q75W12.圖-2運行程序修改常量值報寫內(nèi)存錯誤如圖-2所示,運行示例程序修改常量值,會報寫內(nèi)存錯誤。當然,本示例只是修改本進程中的常量值,在實際的生產(chǎn)環(huán)境沒有太大的實際意義,筆者使用該示例只是聚焦問題本質(zhì),簡化實際場景。在軟件安全研究領域,經(jīng)常需要修改第三方進程注入常量的只讀數(shù)據(jù)中的數(shù)據(jù),分析思路和方法是相同的,筆者接下來,將圍繞該示例對報錯原因進行深入分析,并且給出該問題的解決方法。.問題分析本小節(jié)筆者對在進程運行期間修改常量值報寫內(nèi)存錯誤的原因進行分析。筆者曾看到過一篇博客博客,其作者認為常量的只是在編譯期間進行檢查其值是否發(fā)生變化,在運行期間常量的值是可以修改的。這個觀點是錯誤的(至少來說是不準確的)。在程序運行期間常量的值也是不可以修改的,那么這是如何做到的呢?在進程中一般都含有三個段(section),代碼段(.text),數(shù)據(jù)段(.data),只讀數(shù)據(jù)段(.rdata),段的名稱會因為編譯器不同而有差異,微軟的C,C++編譯器一般將代碼段命名為".text”,數(shù)據(jù)段名為“.data”,只讀數(shù)據(jù)段命名為”.rdata”。Borlad的pascal和C++編譯器將代碼段名為“CODE”,數(shù)據(jù)段命名為“DATA”,只讀數(shù)據(jù)段名為”.rdata”。代碼段(.text)的訪問控制屬性是可執(zhí)行,可讀,不可寫的。數(shù)據(jù)段的訪問控制屬性是可讀寫。只讀數(shù)據(jù)段(.rdata)中的訪問控制屬性是只讀的,資源文件,動態(tài)鏈接庫導入表,常量一般都存儲在該段。如果本進程或者外部進程中的代碼嘗試寫不可讀內(nèi)存,則會觸發(fā)異常。常量具體存儲在哪個數(shù)據(jù)段,會因編譯器的不同而有差異,但其所在段的訪問控制屬性應該是不可寫的。該結(jié)論的分析過程如下。

使用CE查看示例程序中全局變量內(nèi)存在圖-2示例程序運行的日志中可以得知全局常量G_Name的內(nèi)存地址為0x00452700,使用CE(CheatEngine是一款內(nèi)存分析、修改的工具,和IDA,OD并稱為逆向分析的三劍客)查看到全局變量G_Name所在頁的基地址為0x0045200,內(nèi)區(qū)頁的訪問控制屬性是可執(zhí)行/只讀,故寫內(nèi)存操作會觸發(fā)異常。那么,全局量G_Name在哪個段(Section)呢?根據(jù)其訪問控制屬性來看其應該是在代碼段,該推論是否正確呢?圖-3使用CE查看示例程序內(nèi)存分析示例程序的PE頭在PE文件頭中會對程序的段信息詳細的描述,如圖-4和圖-5所示,使用UE打開示例程序RDataSectionDemo.exe所呈現(xiàn)PE文件頭。關于PE文件結(jié)構(gòu)細節(jié),本文不再展開敘述,后續(xù)如果時間允許,筆者會寫一篇專本關于PE文件分析的文章。如圖-4所示,在PE文件的IMAGE_NT_HEADER中可以看出示例程序共分為8個段。如圖-5所示可看出這8個段分別為CODE段、DATA段、BSS段、.idata段、.tls段、.rdata段、.reloc段、.rsrc段。每個段頭40字節(jié),包括段名,段大小,段RAV地址,段屬性信息。筆者不再對每個段進行一一分析,重點分析代碼段(CODE,在其它編譯器編譯的目標程序中通常叫.text)。如圖-5所示,代碼段的RAV地址0x00001000,根據(jù)該地址加上exe的基地址0x00400000(默認是該基地址,在程序編譯時可以設置為不同的值)計算出代碼段的虛擬基地址(VA)是0x00401000。代碼段的大小(未頁對齊)0x00052054,Win32默認的內(nèi)存頁的大小4K,內(nèi)存頁對齊后大小為0x00053000,據(jù)此可以推算出代碼段的虛擬地址(VA)的范圍是0x00401000-0x00454000o同樣如圖-5所示,可以看出代碼段的屬性為0x60000020=0x40000000or0x20000000or0x00000020。其中0x40000000表示據(jù)段可讀,0x20000000表示段可執(zhí)行,0x0000002表示段中包含代碼。根據(jù)2.1節(jié)所分析的全局變量的地址(虛擬地址VA)為0x00452700可以的得出全局常量G_Name是在代碼段(CODE段)中的結(jié)論,同時根據(jù)段屬性的分析也佐證了這一點。由于代碼段訪問控制屬性是可執(zhí)行/只讀,所以在修改全局常量的值時會觸發(fā)異常。00|0:^01aDDoaa5DhOODOOOeDhOQDOQQ-3Dh&OO0OMClhDQDOQOvDhOQDOOOOOh“口。。乳口hOODOOCl2DhooDoauiiDhoomocohOODOQOdDh■jijDOGOSDhOOmOdGhClDDOQClaDh段數(shù)量,共g個段JMAGENTHEADER看移量hxodbouiooIMAGENTHEADERCODE...ODOD1?..rh.19program融umlDeiununderWDATAia■■??■>9aaitss00|0:^01aDDoaa5DhOODOOOeDhOQDOQQ-3Dh&OO0OMClhDQDOQOvDhOQDOOOOOh“口。。乳口hOODOOCl2DhooDoauiiDhoomocohOODOQOdDh■jijDOGOSDhOOmOdGhClDDOQClaDh段數(shù)量,共g個段JMAGENTHEADER看移量hxodbouiooIMAGENTHEADERCODE...ODOD1?..rh.19program融umlDeiununderWDATAia■■??■>9aaitssOQ??贘ld.3^.. ++―+?+MOOOlDDh:OODOQLlDhiaoDOQiaoh:0000014011:00oooisoh:OODOOlfiDh:ooDdonohsOOOOGieCih:OODOOlSDhiOODOOlaDh;OOOQGIbahzUODOOICDH::DQ0001<lDh4口g@mh;0000口工上加m於Mh:MaouiniiOD0OO22Oh:MO0G23Oh;叩心Q0HQI1;PJL…一下題 ■??圖-4示例程序PE文件DOS和NT_HEADER頭口m:3的;DDaa0230hiDDGuO24Oh:口口。口0a口m:3的;DDaa0230hiDDGuO24Oh:口口???a0即GCK)CK)210h:UUijQiJ23Uh:ODOaijSSGh::DOOOOSaQh:000002b0hfOOOOOScOh!00LL02duh:DO□□aaa2eohdd0口Qg2mhiK:MW0300I1:M0000&310hE2E00il0012ph:ODjjLCL-3JUh;Jjjj00iJijij34uh:DD00&G0GM$0h?gg000003^DhrDO00OOOGOSTOhsDO0=0ODijijO^SOh::DO□□ODaao^sohtddoo000a03a0h;ooooflflaaaabOh:OD00LQ。口40^0OGOC^FT^ToTT00gM4。g00000000GO00000。D&&&ijiiQO00DOCdDOgM001口口00gM4。00GCkd)白00Q白白E3cli口0??诳诳赱Ci000。oqD0>0000M000-0-%000。0000-0000 00 OD 0-0- 0。00 DO OO 00 ijijoo aa uq o>q oog QQ QQ 00 OG口口 z on fro- 口口^^G^SECTION^HEADER白白白也Da白。s. 圖-5示例程序PE文件段頭.改變段屬性的方法通過第2節(jié)的分析,我們已經(jīng)清楚的知道,為什么在程序運行期間修改常量值會觸發(fā)異常的原因。那么有沒有方法可以繞過該限制,使得程序運行期間可以修改常量值呢?答案時肯定的,并且方法有多種,筆者在本文中重點介紹兩種方法。靜態(tài)修改PE文件段屬性在第2節(jié)的圖-5中,我們得知代碼段的屬性0x60000020=0x40000000or0x20000000or0x00000020,該值屬性值控制了代碼段是只讀的。那么我們能否通過修改代碼段的屬性值賦予其讀寫屬性呢。0x80000000表示段可寫,我們將代碼段屬性修改0xE0000020=0x80000000or0x40000000or0x20000000or0x00000020。如圖-6所示,修改示例程序PE文件中數(shù)據(jù)段屬性賦予可寫屬性,將其另存為新的示例程序(exe)。匚口口口口上0口匕:&00M2LUI1:000DDZ2Dh.000&G230h000DD24DhG00002SJUQ00DD2£QhijOODC2731iQ00DD2SDh00000251DhQMJD2當口HijOODij2bJii匚口口口口上0口匕:&00M2LUI1:000DDZ2Dh.000&G230h000DD24DhG00002SJUQ00DD2£QhijOODC2731iQ00DD2SDh00000251DhQMJD2當口HijOODij2bJiiDMM2卑曲GOOCO2dDh.。00網(wǎng)配口11M0X虹此000M30nhClOODOllSti00001032011CGODClSjh:44:00S00':El3:001:2E3OQ1:00310:003ZEs00s0。:DCi00:上宜5003004112DO■j3g然2000。。0073020000€A00?。DO'''j0。0。M0。CO00GO0073005ei0-QDODO??趖lDDDOgDOEl50DODODODODODODODOOOOOOOQOcco-ooccoo-osfl-ooosB311DCiOOQOOO42寫35300GO&G00。。叩SAIFDO0。00g2E"6C0。gg"00DO18g0。00OO002E126900"DO00GOMgeJl000040MMGODCI00000000w00。。73000。w00-6C0000000000g0。00gg00ggg00g"J'J£Fg9。g00004005gQ0DO0038C5DO0070OSDO0000005BUS0000M05OG00電30。SAOS0000100300000000QO;00;00;00;co:M;Q0:M;Q0:m;g2M;00;M;50;M;00;00;、代碼段屬性修改為◎EOOOOOZCtt予?皿七”"…??可寫屬性???占?』七一…7……:X-『rd息七矗十丁丁£,..rare-aaB..*■,』??????. …@?P….…圖-6修改代碼段屬性運行修改過代碼段屬性的示例程序,不出所料,在程序運行期間可以動態(tài)修改常量值了,運行結(jié)果如圖-7所示。

電芍一rda場幽洞 - □K1r 長三苴亶 j空三國出程受信息|:第21尸巾Y4配:葡曾如J—— 口卜號生厘值 ,2IE1-LCHJ400:E0SJ⑼]莒激匚Hm盤!他把:J04位他。KE1-L0-B400:2021?51首營0如旗;lUHNlOlltjuiisgut,^21-LQ-fl4CO;202131J6交豐亙肅 懺 .. _ ,2021-10-0400:20£1煙J懵握用H;2"第穗,尋林國沛*G 俯:………曲面上逅卓百工I:YihsdhltttNmt作者性明拈事助MS幫三至方面為薩奇旅理引廣K掠正覆好科若二縫轉(zhuǎn)京沆IQQ;707534332,圖-7修改代碼段屬性后運行結(jié)果在現(xiàn)實的生產(chǎn)環(huán)境中,通過該方法修改段屬性,使常量值在運行期間可以修改有很大的局限性。為什么這么說呢?因為軟件病毒和反病毒,調(diào)試于與調(diào)試雙方一直進行斗志斗勇,激烈的較量,這也促進了軟件技術(shù)的發(fā)展。在生產(chǎn)環(huán)境中軟件都會加殼,而且有很多的先進的殼能到容易加殼但去殼卻是不可逆的(關于加殼與脫殼的技術(shù)細節(jié)筆者在本文中不再展開敘述)。在實際的生產(chǎn)環(huán)境中應用一旦加殼,該方法就很難實施,是否有別的方法可以起到同樣的作用呢?這就是筆者要介紹的第二種方法,在程序運行期間動態(tài)修改數(shù)據(jù)段的屬性。動態(tài)修改虛擬內(nèi)存訪問控制屬性在程序運行期間動態(tài)修改常量值的方法有很多種,例如修改CR0寄存器停用內(nèi)存禁用內(nèi)存保護模式,或者通過DML修改虛擬內(nèi)存的訪問控制屬性,DML表地址存儲在CR3寄存器。這兩種方法都需要有系統(tǒng)內(nèi)核權(quán)限(R0),也就是需要開發(fā)驅(qū)動程序才能達到該目的。另外這兩種方法很底層,不同的操作系統(tǒng),32位和64位等相差都比較大,所以筆者不建議使用該方法。有一種簡單易行的方法也可以達到該目的,使用VirtualQuery查詢要修改的變量所在的虛擬內(nèi)存頁,然后通過調(diào)用VirtualProtect來修改目標內(nèi)存頁的訪問控制屬性,這樣即可實現(xiàn)我們的目標。關于這兩個函數(shù)的細節(jié)筆者在此不再贅述,直接貼出相關的代碼片段如下圖所示。

EpE-pcedureTfrmMain-btnLClick(Sendsr;TObject};E氏:翳蠹―小w; 笥旬誓串常呈所在的虛概內(nèi)存頁TOC\o"1-5"\h\zpConst:.Pointer; /rH&inIinfo:TNemoryBssiclnfoimation; /早begj_n /口匕口口目七:二GAdjdrEiBiBff$Q配二七|&耳目字符串始斌GWarne白[地,止 [uRe?t:=ViEtujLlQii9<¥(pCoDStFEMamlnfOFlSiEaDf(Ttfenic):ryBm;sj.c:I:nfoErftati0Rj);]thenbeginwritcrLog(‘洞用VlKtibilQu白r

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論