① 想寫個JAVA文件加密解密程序,希望被加密的文件能被正確的keys解鎖讀取但是不能被改寫和拷貝。超高分答謝
想寫個JAVA文件加密解密程序,希望被加密的文件能被正確的keys解鎖讀取但是不能被改寫和拷貝。超高分答謝
我推薦用文件夾加密超級大師,這是一款安全易用的文件夾加密軟體。
支持所有windows系統。可以加密文件夾,加密文件,加密磁碟,安全易用。加密後的資料防刪除,復制。
使用方法很簡單:
1 下載安裝文件夾加密超級大師。
2 在需要加密的文件夾上單擊右鍵選擇加密。
3 在彈出的窗口中設置密碼就OK了。
希望對你有幫助。
② Win7網路憑據裡面的賬戶密碼存在哪個文件,能提取出來嗎
1、用戶密碼存儲於X:\windows\system32\config\sam文件中,但是存儲的密碼是經過不可逆加密演算法處理的。
2、SAM文件本身是系統使用的文件,是無法直接復制出來的,要復制出來,程序員的作法一般有兩種,其一、在句柄表中修改訪問許可權拷貝SAM,其二、直接硬碟復制,Windows通過簇的形式來管理硬碟文件,通過簇相關的api函數直接復制。網上有具體的源碼,有興趣可以搜索下載慢慢研究。
③ 有那個程序員能把這個 PDF 密碼給破解掉。本人必定重金感謝。其他人不妨一試
已經聯系你,希望能幫到你
④ 什麼是木馬程序,他是怎樣盜取密碼的,能詳細說說嗎應該怎樣判斷是否是木馬程序呢
什麼是木馬?
特洛伊木馬(以下簡稱木馬),英文叫做「Trojan house」,其名稱取自希臘神話的特洛伊木馬記。
它是一種基於遠程式控制制的黑客工具,具有隱蔽性和非授權性的特點。
所謂隱蔽性是指木馬的設計者為了防止木馬被發現,會採用多種手段隱藏木馬,這樣服務端即使發現感染了木馬,由於不能確定其具體位置,往往只能望「馬」興嘆。
所謂非授權性是指一旦控制端與服務端連接後,控制端將享有服務端的大部分操作許可權,包括修改文件,修改注冊表,控制滑鼠,鍵盤等等,而這些權力並不是服務端賦予的,而是通過木馬程序竊取的。
從木馬的發展來看,基本上可以分為兩個階段。
最初網路還處於以UNIX平台為主的時期,木馬就產生了,當時的木馬程序的功能相對簡單,往往是將一段程序嵌入到系統文件中,用跳轉指令來執行一些木馬的功能,在這個時期木馬的設計者和使用者大都是些技術人員,必須具備相當的網路和編程知識。
而後隨著WINDOWS平台的日益普及,一些基於圖形操作的木馬程序出現了,用戶界面的改善,使使用者不用懂太多的專業知識就可以熟練的操作木馬,相對的木馬入侵事件也頻繁出現,而且由於這個時期木馬的功能已日趨完善,因此對服務端的破壞也更大了。
所以所木馬發展到今天,已經無所不用其極,一旦被木馬控制,你的電腦將毫無秘密可言。
參考資料:http://bbs.51ww.com/365000/ShowPost.aspx
回答者:完顏康康 - 探花 十一級 9-18 12:40
--------------------------------------------------------------------------------
DLL 木馬揭秘
相信經常玩木馬的朋友們都會知道一些木馬的特性,也會有自己最喜愛的木馬,不過,很多朋友依然不知道近年興起的「DLL木馬」為何物。什麼是「DLL木馬」呢?它與一般的木馬有什麼不同?
一、從DLL技術說起
要了解DLL木馬,就必須知道這個「DLL」是什麼意思,所以,讓我們追溯到幾年前,DOS系統大行其道的日子裡。在那時候,寫程序是一件繁瑣的事情,因為每個程序的代碼都是獨立的,有時候為了實現一個功能,就要為此寫很多代碼,後來隨著編程技術發展,程序員們把很多常用的代碼集合(通用代碼)放進一個獨立的文件里,並把這個文件稱為「庫」(Library),在寫程序的時候,把這個庫文件加入編譯器,就能使用這個庫包含的所有功能而不必自己再去寫一大堆代碼,這個技術被稱為「靜態鏈接」(Static Link)。靜態鏈接技術讓勞累的程序員鬆了口氣,一切似乎都很美好。可是事實證明,美好的事物不會存在太久,因為靜態鏈接就像一個粗魯的推銷員,不管你想不想要宣傳單,他都全部塞到你的手上來。寫一個程序只想用到一個庫文件包含的某個圖形效果,就因為這個,你不得不把這個庫文件攜帶的所有的圖形效果都加入程序,留著它們當花瓶擺設,這倒沒什麼重要,可是這些花瓶卻把道路都阻塞了——靜態鏈接技術讓最終的程序成了大塊頭,因為編譯器把整個庫文件也算進去了。
時代在發展,靜態鏈接技術由於天生的弊端,不能滿足程序員的願望,人們開始尋找一種更好的方法來解決代碼重復的難題。後來,Windows系統出現了,時代的分水嶺終於出現。Windows系統使用一種新的鏈接技術,這種被稱為「動態鏈接」(Dynamic Link)的新技術同樣也是使用庫文件,微軟稱它們為「動態鏈接庫」——Dynamic Link Library,DLL的名字就是這樣來的。動態鏈接本身和靜態鏈接沒什麼區別,也是把通用代碼寫進一些獨立文件里,但是在編譯方面,微軟繞了個圈子,並沒有採取把庫文件加進程序的方法,而是把庫文件做成已經編譯好的程序文件,給它們開個交換數據的介面,程序員寫程序的時候,一旦要使用某個庫文件的一個功能函數,系統就把這個庫文件調入內存,連接上這個程序佔有的任務進程,然後執行程序要用的功能函數,並把結果返回給程序顯示出來,在我們看來,就像是程序自己帶有的功能一樣。完成需要的功能後,這個DLL停止運行,整個調用過程結束。微軟讓這些庫文件能被多個程序調用,實現了比較完美的共享,程序員無論要寫什麼程序,只要在代碼里加入對相關DLL的調用聲明就能使用它的全部功能。最重要的是,DLL絕對不會讓你多拿一個花瓶,你要什麼它就給你什麼,你不要的東西它才不會給你。這樣,寫出來的程序就不能再攜帶一大堆垃圾了——絕對不會讓你把吃剩的東西帶回家,否則罰款,這是自助餐。
DLL技術的誕生,使編寫程序變成一件簡單的事情,Windows為我們提供了幾千個函數介面,足以滿足大多數程序員的需要。而且,Windows系統自身就是由幾千個DLL文件組成,這些DLL相互扶持,組成了強大的Windows系統。如果Windows使用靜態鏈接技術,它的體積會有多大?我不敢想。
二、應用程序介面API
上面我們對DLL技術做了個大概分析,在裡面我提到了「介面」,這又是什麼呢?因為DLL不能像靜態庫文件那樣塞進程序里,所以,如何讓程序知道實現功能的代碼和文件成了問題,微軟就為DLL技術做了標准規范,讓一個DLL文件像乳酪一樣開了許多小洞,每個洞口都註明裡面存放的功能的名字,程序只要根據標准規范找到相關洞口就可以取得它要的美味了,這個洞口就是「應用程序介面」(Application Programming Interface),每個DLL帶的介面都不相同,盡最大可能的減少了代碼的重復。用Steven的一句話:API就是一個工具箱,你根據需要取出螺絲刀、扳手,用完後再把它們放回原處。在Windows里,最基本的3個DLL文件是kernel32.dll、user32.dll、gdi32.dll。它們共同構成了基本的系統框架。
三、DLL與木馬
DLL是編譯好的代碼,與一般程序沒什麼大差別,只是它不能獨立運行,需要程序調用。那麼,DLL與木馬能扯上什麼關系呢?如果你學過編程並且寫過DLL,就會發現,其實DLL的代碼和其他程序幾乎沒什麼兩樣,僅僅是介面和啟動模式不同,只要改動一下代碼入口,DLL就變成一個獨立的程序了。當然,DLL文件是沒有程序邏輯的,這里並不是說DLL=EXE,不過,依然可以把DLL看做缺少了main入口的EXE,DLL帶的各個功能函數可以看作一個程序的幾個函數模塊。DLL木馬就是把一個實現了木馬功能的代碼,加上一些特殊代碼寫成DLL文件,導出相關的API,在別人看來,這只是一個普通的DLL,但是這個DLL卻攜帶了完整的木馬功能,這就是DLL木馬的概念。也許有人會問,既然同樣的代碼就可以實現木馬功能,那麼直接做程序就可以,為什麼還要多此一舉寫成DLL呢?這是為了隱藏,因為DLL運行時是直接掛在調用它的程序的進程里的,並不會另外產生進程,所以相對於傳統EXE木馬來說,它很難被查到。
四、DLL的運行
雖然DLL不能自己運行,可是Windows在載入DLL的時候,需要一個入口函數,就如同EXE的main一樣,否則系統無法引用DLL。所以根據編寫規范,Windows必須查找並執行DLL里的一個函數DllMain作為載入DLL的依據,這個函數不作為API導出,而是內部函數。DllMain函數使DLL得以保留在內存里,有的DLL裡面沒有DllMain函數,可是依然能使用,這是因為Windows在找不到DllMain的時候,會從其它運行庫中找一個不做任何操作的預設DllMain函數啟動這個DLL使它能被載入,並不是說DLL可以放棄DllMain函數。
五、DLL木馬技術分析
到了這里,您也許會想,既然DLL木馬有那麼多好處,以後寫木馬都採用DLL方式不就好了嗎?話雖然是這么說沒錯,但是DLL木馬並不是一些人想像的那麼容易寫的。要寫一個能用的DLL木馬,你需要了解更多知識。
1.木馬的主體
千萬別把木馬模塊寫得真的像個API庫一樣,這不是開發WINAPI。DLL木馬可以導出幾個輔助函數,但是必須有一個過程負責主要執行代碼,否則這個DLL只能是一堆零碎API函數,別提工作了。
如果涉及一些通用代碼,可以在DLL里寫一些內部函數,供自己的代碼使用,而不是把所有代碼都開放成介面,這樣它自己本身都難調用了,更不可能發揮作用。
DLL木馬的標准執行入口為DllMain,所以必須在DllMain里寫好DLL木馬運行的代碼,或者指向DLL木馬的執行模塊。
2.動態嵌入技術
Windows中,每個進程都有自己的私有內存空間,別的進程是不允許對這個私人領地進行操作的,但是,實際上我們仍然可以利用種種方法進入並操作進程的私有內存,這就是動態嵌入,它是將自己的代碼嵌入正在運行的進程中的技術。動態嵌入有很多種,最常見的是鉤子、API以及遠程線程技術,現在的大多數DLL木馬都採用遠程線程技術把自己掛在一個正常系統進程中。其實動態嵌入並不少見,羅技的MouseWare驅動就掛著每一個系統進程-_-
遠程線程技術就是通過在另一個進程中創建遠程線程(RemoteThread)的方法進入那個進程的內存地址空間。在DLL木馬的范疇里,這個技術也叫做「注入」,當載體在那個被注入的進程里創建了遠程線程並命令它載入DLL時,木馬就掛上去執行了,沒有新進程產生,要想讓木馬停止惟有讓掛接這個木馬DLL的進程退出運行。但是,很多時候我們只能束手無策——它和Explorer.exe掛在一起了,你確定要關閉Windows嗎?
3.木馬的啟動
有人也許會迫不及待的說,直接把這個DLL加入系統啟動項目不就可以了。答案是NO,前面說過,DLL不能獨立運行,所以無法在啟動項目里直接啟動它。要想讓木馬跑起來,就需要一個EXE使用動態嵌入技術讓DLL搭上其他正常進程的車,讓被嵌入的進程調用這個DLL的DllMain函數,激發木馬運行,最後啟動木馬的EXE結束運行,木馬啟動完畢。
啟動DLL木馬的EXE是個重要角色,它被稱為Loader,如果沒有Loader,DLL木馬就是破爛一堆,因此,一個算得上成熟的DLL木馬會想辦法保護它的Loader不會那麼容易被毀滅。記得狼狽為奸的故事嗎?DLL木馬就是爬在狼Loader上的狽。
Loader可以是多種多樣的,Windows的rundll32.exe也被一些DLL木馬用來做了Loader,這種木馬一般不帶動態嵌入技術,它直接掛著rundll32進程運行,用rundll32的方法(rundll32.exe [DLL名],[函數] [參數])像調用API一樣去引用這個DLL的啟動函數激發木馬模塊開始執行,即使你殺了rundll32,木馬本體還是在的,一個最常見的例子就是3721中文實名,雖然它不是木馬。
注冊表的AppInit_DLLs鍵也被一些木馬用來啟動自己,如求職信病毒。利用注冊表啟動,就是讓系統執行DllMain來達到啟動木馬的目的。因為它是kernel調入的,對這個DLL的穩定性有很大要求,稍有錯誤就會導致系統崩潰,所以很少看到這種木馬。
有一些更復雜點的DLL木馬通過svchost.exe啟動,這種DLL木馬必須寫成NT-Service,入口函數是ServiceMain,一般很少見,但是這種木馬的隱蔽性也不錯,而且Loader有保障。
4.其它
到這里大家也應該對DLL木馬有個了解了,是不是很想寫一個?別急,不知道大家想過沒有,既然DLL木馬這么好,為什麼到現在能找到的DLL木馬寥寥無幾?現在讓我來潑冷水,最重要的原因只有一個:由於DLL木馬掛著系統進程運行,如果它本身寫得不好,例如沒有防止運行錯誤的代碼或者沒有嚴格規范用戶的輸入,DLL就會出錯崩潰。別緊張,一般的EXE也是這樣完蛋的,但是DLL崩潰會導致它掛著的程序跟著遭殃,別忘記它掛接的是系統進程哦,結局就是……慘不忍睹。所以寫一個能公布的DLL木馬,在排錯檢查方面做的工作要比一般的EXE木馬多,寫得多了自己都煩躁……
六、DLL木馬的發現和查殺
經常看看啟動項有沒有多出莫名其妙的項目,這是Loader的所在,只要殺了狼,狽就不能再狂了。而DLL木馬本體比較難發現,需要你有一定編程知識和分析能力,在Loader里查找DLL名稱,或者從進程里看多掛接了什麼陌生的DLL,可是對新手來說……總之就是比較難啊比較難,所以,最簡單的方法:殺毒軟體和防火牆(不是萬能葯,切忌長期服用)。
⑤ 用c語言程序能對文件夾加密嗎,怎樣加密
沒有無用的語言,只有無用的程序員。如果C++都不行的話,哪個語言可以?
⑥ bat文件開機密碼文件
新建一個new.bat
輸入 shutdown -r -t 1
保存退出
雙擊就可以直接重啟電腦。
如果你想鎖別人機器我不太贊同。
畢竟程序員的初衷不是干壞事,代碼我不會提供給你。
但是我可以告訴你思路,設置了密碼,其實密碼就是個文件而已,你可以給電腦設個密碼,然後把那個對應的密碼文件復制到別人的電腦里,密碼是會生效的,用這種bat批處理文件把自己的密碼文件用替換命令替換一下就可以了。
⑦ 為什麼我的計算機文件屬性里的加密文件不能打鉤 是ibm Windows7操作系統
為什麼我的計算機文件屬性里的加密文件不能打鉤 是ibm Windows7操作系統
我推薦用文件夾加密超級大師,這是一款安全易用的文件夾加密軟體。
支持所有windows系統。可以加密文件夾,加密文件,加密磁碟,安全易用。加密後的資料防刪除,復制。
使用方法很簡單:
1 下載安裝文件夾加密超級大師。
2 在需要加密的文件夾上單擊右鍵選擇加密。
3 在彈出的窗口中設置密碼就OK了。
你可以試試,挺不錯。
⑧ 如何設置文件加密
步驟一:打開Windows資源管理器。
步驟二:右鍵單擊要加密的文件或文件夾,然後單擊「屬性」。
步驟三:在「常規」選項卡上,單擊「高級」。選中「加密內容以便保護數據」復選框
我按這個方法加密了一個文件夾,看來沒什麼作用,還是是因為我沒操作正確。
這個是賬戶加密的的。也就是說
那賬戶加密的那個就可用。你換一個賬戶就不能用了。
你還是用加密軟體加密方便一些
⑨ 簡述最常用的加密標准及其實現方法和技術
作者:老羅
這是從「VC編程經驗總結7」中轉出來的
借花獻佛——如何通過崩潰地址找到出錯的代碼行
作為程序員,我們平時最擔心見到的事情是什麼?是內存泄漏?是界面不好看?……錯啦!我相信我的看法是不會有人反對的--那就是,程序發生了崩潰!
「該程序執行了非法操作,即將關閉。請與你的軟體供應商聯系。」,呵呵,這句 M$ 的「名言」,恐怕就是程序員最擔心見到的東西了。有的時候,自己的程序在自己的機器上運行得好好的,但是到了別人的機器上就崩潰了;有時自己在編寫和測試的過程中就莫名其妙地遇到了非法操作,但是卻無法確定到底是源代碼中的哪行引起的……是不是很痛苦呢?不要緊,本文可以幫助你走出這種困境,甚至你從此之後可以自豪地要求用戶把崩潰地址告訴你,然後你就可以精確地定位到源代碼中出錯的那行了。(很神奇吧?呵呵。)
首先我必須強調的是,本方法可以在目前市面上任意一款編譯器上面使用。但是我只熟悉 M$ 的 VC 和 MASM ,因此後面的部分只介紹如何在這兩個編譯器中實現,請讀者自行融會貫通,掌握在別的編譯器上使用的方法。
Well,廢話說完了,讓我們開始! :)
首先必須生成程序的 MAP 文件。什麼是 MAP 文件?簡單地講, MAP 文件是程序的全局符號、源文件和代碼行號信息的唯一的文本表示方法,它可以在任何地方、任何時候使用,不需要有額外的程序進行支持。而且,這是唯一能找出程序崩潰的地方的救星。
好吧,既然 MAP 文件如此神奇,那麼我們應該如何生成它呢?在 VC 中,我們可以按下 Alt+F7 ,打開「Project Settings」選項頁,選擇 C/C++ 選項卡,並在最下面的 Project Options 裡面輸入:/Zd ,然後要選擇 Link 選項卡,在最下面的 Project Options 裡面輸入: /mapinfo:lines 和 /map:PROJECT_NAME.map 。最後按下 F7 來編譯生成 EXE 可執行文件和 MAP 文件。
在 MASM 中,我們要設置編譯和連接參數,我通常是這樣做的:
rc %1.rc
ml /c /coff /Zd %1.asm
link /subsystem:windows /mapinfo:exports /mapinfo:lines /map:%1.map %1.obj %1.res
把它保存成 makem.bat ,就可以在命令行輸入 makem filename 來編譯生成 EXE 可執行文件和 MAP 文件了。
在此我先解釋一下加入的參數的含義:
/Zd 表示在編譯的時候生成行信息
/map[:filename] 表示生成 MAP 文件的路徑和文件名
/mapinfo:lines 表示生成 MAP 文件時,加入行信息
/mapinfo:exports 表示生成 MAP 文件時,加入 exported functions (如果生成的是 DLL 文件,這個選項就要加上)
OK,通過上面的步驟,我們已經得到了 MAP 文件,那麼我們該如何利用它呢?
讓我們從簡單的實例入手,請打開你的 VC ,新建這樣一個文件:
01 file://****************************************************************
02 file://程序名稱:演示如何通過崩潰地址找出源代碼的出錯行
03 file://作者:羅聰
04 file://日期:2003-2-7
05 file://出處:http://www.luocong.com(老羅的繽紛天地)
06 file://本程序會產生「除0錯誤」,以至於會彈出「非法操作」對話框。
07 file://「除0錯誤」只會在 Debug 版本下產生,本程序為了演示而盡量簡化。
08 file://注意事項:如欲轉載,請保持本程序的完整,並註明:
09 file://轉載自「老羅的繽紛天地」(http://www.luocong.com)
10 file://****************************************************************
11
12 void Crash(void)
13 {
14 int i = 1;
15 int j = 0;
16 i /= j;
17 }
18
19 void main(void)
20 {
21 Crash();
22 }
很顯然本程序有「除0錯誤」,在 Debug 方式下編譯的話,運行時肯定會產生「非法操作」。好,讓我們運行它,果然,「非法操作」對話框出現了,這時我們點擊「詳細信息」按鈕,記錄下產生崩潰的地址--在我的機器上是 0x0040104a 。
再看看它的 MAP 文件:(由於文件內容太長,中間沒用的部分我進行了省略)
CrashDemo
Timestamp is 3e430a76 (Fri Feb 07 09:23:02 2003)
Preferred load address is 00400000
Start Length Name Class
0001:00000000 0000de04H .text CODE
0001:0000de04 0001000cH .textbss CODE
0002:00000000 00001346H .rdata DATA
0002:00001346 00000000H .edata DATA
0003:00000000 00000104H .CRT$XCA DATA
0003:00000104 00000104H .CRT$XCZ DATA
0003:00000208 00000104H .CRT$XIA DATA
0003:0000030c 00000109H .CRT$XIC DATA
0003:00000418 00000104H .CRT$XIZ DATA
0003:0000051c 00000104H .CRT$XPA DATA
0003:00000620 00000104H .CRT$XPX DATA
0003:00000724 00000104H .CRT$XPZ DATA
0003:00000828 00000104H .CRT$XTA DATA
0003:0000092c 00000104H .CRT$XTZ DATA
0003:00000a30 00000b93H .data DATA
0003:000015c4 00001974H .bss DATA
0004:00000000 00000014H .idata$2 DATA
0004:00000014 00000014H .idata$3 DATA
0004:00000028 00000110H .idata$4 DATA
0004:00000138 00000110H .idata$5 DATA
0004:00000248 000004afH .idata$6 DATA
Address Publics by Value Rva+Base Lib:Object
0001:00000020 ?Crash@@YAXXZ 00401020 f CrashDemo.obj
0001:00000070 _main 00401070 f CrashDemo.obj
0004:00000000 __IMPORT_DESCRIPTOR_KERNEL32 00424000 kernel32:KERNEL32.dll
0004:00000014 __NULL_IMPORT_DESCRIPTOR 00424014 kernel32:KERNEL32.dll
0004:00000138 __imp__GetCommandLineA@0 00424138 kernel32:KERNEL32.dll
0004:0000013c __imp__GetVersion@0 0042413c kernel32:KERNEL32.dll
0004:00000140 __imp__ExitProcess@4 00424140 kernel32:KERNEL32.dll
0004:00000144 __imp__DebugBreak@0 00424144 kernel32:KERNEL32.dll
0004:00000148 __imp__GetStdHandle@4 00424148 kernel32:KERNEL32.dll
0004:0000014c __imp__WriteFile@20 0042414c kernel32:KERNEL32.dll
0004:00000150 __imp__InterlockedDecrement@4 00424150 kernel32:KERNEL32.dll
0004:00000154 __imp__OutputDebugStringA@4 00424154 kernel32:KERNEL32.dll
0004:00000158 __imp__GetProcAddress@8 00424158 kernel32:KERNEL32.dll
0004:0000015c __imp__LoadLibraryA@4 0042415c kernel32:KERNEL32.dll
0004:00000160 __imp__InterlockedIncrement@4 00424160 kernel32:KERNEL32.dll
0004:00000164 __imp__GetMoleFileNameA@12 00424164 kernel32:KERNEL32.dll
0004:00000168 __imp__TerminateProcess@8 00424168 kernel32:KERNEL32.dll
0004:0000016c __imp__GetCurrentProcess@0 0042416c kernel32:KERNEL32.dll
0004:00000170 __imp__UnhandledExceptionFilter@4 00424170 kernel32:KERNEL32.dll
0004:00000174 __imp__FreeEnvironmentStringsA@4 00424174 kernel32:KERNEL32.dll
0004:00000178 __imp__FreeEnvironmentStringsW@4 00424178 kernel32:KERNEL32.dll
0004:0000017c __imp__WideCharToMultiByte@32 0042417c kernel32:KERNEL32.dll
0004:00000180 __imp__GetEnvironmentStrings@0 00424180 kernel32:KERNEL32.dll
0004:00000184 __imp__GetEnvironmentStringsW@0 00424184 kernel32:KERNEL32.dll
0004:00000188 __imp__SetHandleCount@4 00424188 kernel32:KERNEL32.dll
0004:0000018c __imp__GetFileType@4 0042418c kernel32:KERNEL32.dll
0004:00000190 __imp__GetStartupInfoA@4 00424190 kernel32:KERNEL32.dll
0004:00000194 __imp__HeapDestroy@4 00424194 kernel32:KERNEL32.dll
0004:00000198 __imp__HeapCreate@12 00424198 kernel32:KERNEL32.dll
0004:0000019c __imp__HeapFree@12 0042419c kernel32:KERNEL32.dll
0004:000001a0 __imp__VirtualFree@12 004241a0 kernel32:KERNEL32.dll
0004:000001a4 __imp__RtlUnwind@16 004241a4 kernel32:KERNEL32.dll
0004:000001a8 __imp__GetLastError@0 004241a8 kernel32:KERNEL32.dll
0004:000001ac __imp__SetConsoleCtrlHandler@8 004241ac kernel32:KERNEL32.dll
0004:000001b0 __imp__IsBadWritePtr@8 004241b0 kernel32:KERNEL32.dll
0004:000001b4 __imp__IsBadReadPtr@8 004241b4 kernel32:KERNEL32.dll
0004:000001b8 __imp__HeapValidate@12 004241b8 kernel32:KERNEL32.dll
0004:000001bc __imp__GetCPInfo@8 004241bc kernel32:KERNEL32.dll
0004:000001c0 __imp__GetACP@0 004241c0 kernel32:KERNEL32.dll
0004:000001c4 __imp__GetOEMCP@0 004241c4 kernel32:KERNEL32.dll
0004:000001c8 __imp__HeapAlloc@12 004241c8 kernel32:KERNEL32.dll
0004:000001cc __imp__VirtualAlloc@16 004241cc kernel32:KERNEL32.dll
0004:000001d0 __imp__HeapReAlloc@16 004241d0 kernel32:KERNEL32.dll
0004:000001d4 __imp__MultiByteToWideChar@24 004241d4 kernel32:KERNEL32.dll
0004:000001d8 __imp__LCMapStringA@24 004241d8 kernel32:KERNEL32.dll
0004:000001dc __imp__LCMapStringW@24 004241dc kernel32:KERNEL32.dll
0004:000001e0 __imp__GetStringTypeA@20 004241e0 kernel32:KERNEL32.dll
0004:000001e4 __imp__GetStringTypeW@16 004241e4 kernel32:KERNEL32.dll
0004:000001e8 __imp__SetFilePointer@16 004241e8 kernel32:KERNEL32.dll
0004:000001ec __imp__SetStdHandle@8 004241ec kernel32:KERNEL32.dll
0004:000001f0 __imp__FlushFileBuffers@4 004241f0 kernel32:KERNEL32.dll
0004:000001f4 __imp__CloseHandle@4 004241f4 kernel32:KERNEL32.dll
0004:000001f8 \177KERNEL32_NULL_THUNK_DATA 004241f8 kernel32:KERNEL32.dll
entry point at 0001:000000f0
Line numbers for .\Debug\CrashDemo.obj(d:\msdev\myprojects\crashdemo\crashdemo.cpp) segment .text
13 0001:00000020 14 0001:00000038 15 0001:0000003f 16 0001:00000046
17 0001:00000050 20 0001:00000070 21 0001:00000088 22 0001:0000008d
如果仔細瀏覽 Rva+Base 這欄,你會發現第一個比崩潰地址 0x0040104a 大的函數地址是 0x00401070 ,所以在 0x00401070 這個地址之前的那個入口就是產生崩潰的函數,也就是這行:
0001:00000020 ?Crash@@YAXXZ 00401020 f CrashDemo.obj
因此,發生崩潰的函數就是 ?Crash@@YAXXZ ,所有以問號開頭的函數名稱都是 C++ 修飾的名稱。在我們的源程序中,也就是 Crash() 這個子函數。
OK,現在我們輕而易舉地便知道了發生崩潰的函數名稱,你是不是很興奮呢?呵呵,先別忙,接下來,更厲害的招數要出場了。
請注意 MAP 文件的最後部分--代碼行信息(Line numbers information),它是以這樣的形式顯示的:
13 0001:00000020
第一個數字代表在源代碼中的代碼行號,第二個數是該代碼行在所屬的代碼段中的偏移量。
如果要查找代碼行號,需要使用下面的公式做一些十六進制的減法運算:
崩潰行偏移 = 崩潰地址(Crash Address) - 基地址(ImageBase Address) - 0x1000
為什麼要這樣做呢?細心的朋友可能會留意到 Rva+Base 這欄了,我們得到的崩潰地址都是由 偏移地址(Rva)+ 基地址(Base) 得來的,所以在計算行號的時候要把基地址減去,一般情況下,基地址的值是 0x00400000 。另外,由於一般的 PE 文件的代碼段都是從 0x1000 偏移開始的,所以也必須減去 0x1000 。
好了,明白了這點,我們就可以來進行小學減法計算了:
崩潰行偏移 = 0x0040104a - 0x00400000 - 0x1000 = 0x4a
如果瀏覽 MAP 文件的代碼行信息,會看到不超過計算結果,但卻最接近的數是 CrashDemo.cpp 文件中的:
16 0001:00000046
也就是在源代碼中的第 16 行,讓我們來看看源代碼:
16 i /= j;
哈!!!果然就是第 16 行啊!
興奮嗎?我也一樣! :)
方法已經介紹完了,從今以後,我們就可以精確地定位到源代碼中的崩潰行,而且只要編譯器可以生成 MAP 文件(包括 VC、MASM、VB、BCB、Delphi……),本方法都是適用的。我們時常抱怨 M$ 的產品如何如何差,但其實 M$ 還是有意無意間提供了很多有價值的信息給我們的,只是我們往往不懂得怎麼利用而已……相信這樣一來,你就可以更為從容地面對「非法操作」提示了。你甚至可以要求用戶提供崩潰的地址,然後就可以坐在家中舒舒服服地找到出錯的那行,並進行修正。
⑩ 加密文件,加密演算法:每個細節高低4位交換,求程序員大佬幫助
l = a & 0xf 就是 低四位,需要 左移4位
h = a & 0xf0 就是 高四位,需右移四位
兩個 相或 h | l 就可以
可以試一試用 %x 輸出 處理前後 的數據,看是不是 高低四位互換