❶ 逆向,反病毒,驅動開發,一些問題。
其實目前中國的軟體行業很浮腫……
大量的軟體公司都在做外包,而外包程序員無非就是高級打字員……
真正中國自主開發的軟體並不多,能做好做大的就更少了~
前景來看,驅動開發和逆向工程都是很辛苦但也是收入頗豐的~
而且目前來看國內這方面的人才都很緊俏~
所以如果能在學校期間熟悉這兩門技術之一,
對於以後就業直接走進國內一線軟體公司或者大的外企
都是一個有力的籌碼
逆向和驅動如果結合起來,就是內核調試
而逆向和你學的.NET平台結合起來,則是.NET逆向
都屬於更為稀缺和搶手的技術!
而你說的反病毒,如果是病毒分析,其實只是逆向的一個初步。
如果你能深入的學習逆向,那病毒分析就如砍瓜切菜一般容易~
而再加上正想的驅動開發技術,那開發屬於自己的殺毒軟體或是HIPS也絕非難事~
這樣想來,你說就業前景還會差么?
但是話說回來,真的很難。
我現在還沒接觸到內核,還在摸索階段
望你早日成功吧~
❷ 如何防止程序員反編譯
java從誕生以來,其基因就是開放精神,也正因此,其可以得到廣泛愛好者的支持和奉獻,最終很快發展壯大,以至於有今天之風光!但隨著java的應用領域越來越廣,特別是一些功能要發布到終端用戶手中(如android開發的app),有時候,公司為了商業技術的保密考慮,不希望這裡面的一些核心代碼能夠被人破解(破解之後,甚至可以被簡單改改就發布出去,說嚴重點,就可能會擾亂公司的正常軟體的市場行為),這時候就要求這些java代碼不能夠被反編譯。
這里要先說一下反編譯的現象。因為java一直秉持著開放共享的理念,所以大家也都知道,我們一般共享一個自己寫的jar包時,同時會共享一個對應的source包。但這些依然與反編譯沒有什麼關系,但java的共享理念,不只是建議我們這樣做,而且它自己也在底層上「強迫」我們這么做!在java寫的.java文件後,使用javac編譯成class文件,在編譯的過程,不像C/C++或C#那樣編譯時進行加密或混淆,它是直接對其進行符號化、標記化的編譯處理,於是,也產生了一個逆向工程的問題:可以根據class文件反向解析成原來的java文件!這就是反編譯的由來。
但很多時候,有些公司出於如上述的原因考慮時,真的不希望自己寫的代碼被別人反編譯,尤其是那些收費的app或桌面軟體(甚至還有一些j2ee的wen項目)!這時候,防止反編譯就成了必然!但前面也說過了,因為開放理念的原因,class是可以被反編譯的,那現在有這樣的需求之後,有哪些方式可以做到防止反編譯呢?經過研究java源代碼並進行了一些技術實現(結果發現,以前都有人想到過,所以在對應章節的時候,我會貼出一些寫得比較細的文章,而我就簡單闡述一下,也算偷個懶吧),我總共整理出以下這幾種方式:
代碼混淆
這種方式的做法正如其名,是把代碼打亂,並摻入一些隨機或特殊的字元,讓代碼的可讀性大大降低,「曲線救國」似的達到所謂的加密。其實,其本質就是打亂代碼的順序、將各類符號(如類名、方法名、屬性名)進行隨機或亂命名,使其無意義,讓人讀代碼時很累,進而讓人乍一看,以為這些代碼是加過密的!
由其實現方式上可知,其實現原理只是擾亂正常的代碼可讀性,並不是真正的加密,如果一個人的耐心很好,依然可以理出整個程序在做什麼,更何況,一個應用中,其核心代碼才是人們想去了解的,所以大大縮小了代碼閱讀的范圍!
當然,這種方式的存在,而且還比較流行,其原因在於,基本能防範一些技術人員進行反編譯(比如說我,讓我破解一個混淆的代碼,我寧願自己重寫一個了)!而且其實現較為簡單,對項目的代碼又無開發上的侵入性。目前業界也有較多這類工具,有商用的,也有免費的,目前比較流行的免費的是:proguard(我現象臨時用的就是這個)。
上面說了,這種方式其實並不是真正加密代碼,其實代碼還是能夠被人反編譯(有人可能說,使用proguard中的optimize選項,可以從位元組流層面更改代碼,甚至可以讓JD這些反編譯軟體可以無法得到內容。說得有點道理,但有兩個問題:1、使用optimize對JDK及環境要求較高,容易造成混淆後的代碼無法正常運行;2、這種方式其實還是混淆,JD反編譯有點問題,可以有更強悍的工具,矛盾哲學在哪兒都是存在的^_^)。那如何能做到我的class代碼無法被人反編譯呢?那就需要我們下面的「加密class」!
加密class
在說加密class之前,我們要先了解一些java的基本概念,如:ClassLoader。做java的人已經或者以後會知道,java程序的運行,是類中的邏輯在JVM中運行,而類又是怎麼載入到JVM中的呢(JVM內幕之類的,不在本文中闡述,所以點到為止)?答案是:ClassLoader。JVM在啟動時是如何初始化整個環境的,有哪些ClassLoader及作用是什麼,大家可以自己問度娘,也不在本文中討論。
讓我們從最常見的代碼開始,揭開一下ClassLoader的一點點面紗!看下面的代碼:
Java代碼
publicclassDemo{
publicstaticvoidmain(String[]args){
System.out.println(「helloworld!」);
}
}
上面這段代碼,大家都認識。但我要問的是:如果我們使用javac對其進行編譯,然後使用java使其運行(為什麼不在Eclipse中使用Runas功能呢?因為Eclipse幫我們封閉,從而簡化了太多東西,使我們忽略了太多的底層細節,只有從原始的操作上,我們才能看到本質),那麼,它是怎麼載入到JVM中的?答案是:通過AppClassLoader載入的(相關知識點可以參考:http://hxraid.iteye.com/blog/747625)!如果不相信的話,可以輸出一下System.out.println(Thread.currentThrea().getContextLoader());看看。
那又有一個新的問題產生了:ClassLoader又是怎樣載入class的呢?其實,AppClassLoader繼承自java.lang.ClassLoader類,所以,基本操作都在這個類裡面,讓我們直接看下面這段核心代碼吧:
看到這里,已經沒有必要再往下面看了(再往下就是native方法了,這是一個重大伏筆哦),我們要做的手腳就在這里!
手腳怎麼做呢?很簡單,上面的代碼邏輯告訴我們,ClassLoader只是拿到class文件中的內容byte[],然後交給JVM初始化!於是我們的邏輯就簡單了:只要在交給JVM時是正確的class文件就行了,在這之前是什麼樣子無所謂!所以,我們的加密的整個邏輯就是:
在編譯代碼時(如使用ant或maven),使用插件將代碼進行加密(加密方式自己選),將class文件裡面的內容讀取成byte[],然後進行加密後再寫回到class文件(這時候class文件裡面的內容不是標準的class,無法被反編譯了)
在啟動項目代碼時,指定使用我們自定義的ClassLoader就行了,而自定義的部分,主要就是在這里做解密工作!
如此,搞定!以上的做法比較完整的闡述,可以仔細閱讀一下這篇文章:https://www.ddtsoft.com/#developerworks/cn/java/l-secureclass/文章中的介紹。
通過這個方法貌似可以解決代碼反編譯的問題了!錯!這里有一個巨大的坑!因為我們自定義的ClassLoader是不能加密的,要不然JVM不認識,就全歇菜了!如果我來反編譯,呵呵,我只要反編譯一下這個自定義的ClassLoader,然後把裡面解密後的內容寫到指定的文件中保存下來,再把這個加了邏輯的自定義ClassLoader放回去運行,你猜結果會怎樣?沒錯,你會想死!因為你好不容易想出來的加密演算法,結果人家根本不需要破解,直接就繞過去了!
現在,讓我們總結一下這個方法的優缺點:實現方式簡單有效,同時對代碼幾乎沒有侵入性,不影響正常開發與發布。缺點也很明顯,就是很容易被人破解!
當然啦,關於缺點問題,你也可以這么干:先對所有代碼進行混淆、再進行加密,保證:1、不容易找到我們自定義的那個ClassLoader;2、就算找到了,破解了,代碼可讀性還是很差,讓你看得吐血!(有一篇文章,我覺得寫得不錯,大家可以看一看:http://www.scjgcj.com/#blog/851544)
嗯,我覺得這個方法很好,我自己也差點被這個想法感動了,但是,作為一個嚴謹的程序員,我真的不願意留下一個隱患在這里!所以,我繼續思索!
高級加密class
前面我們說過有個伏筆來著,還記得吧?沒錯,就是那個native!native定義的方法是什麼方法?就是我們傳說中的JNI調用!前面介紹過的有一篇文章中提到過,其實jvm的真實身份並不是java,而是c++寫的jvm.dll(windows版本下),java與dll文件的調用就是通過JNI實現的!於是,我們就可以這樣想:JNI可以調用第三方語言的類庫,那麼,我們可不可以把解密與裝載使用第三方語言寫(如C++,因為它們生成的庫是不好反編譯的),這樣它可以把解密出來的class內容直接調jvm.dll的載入介面進行初始化成class,再返回給我們的ClassLoader?這樣,我們自定義的ClassLoader只要使用JNI調用這個第三方語言寫的組件,整個解密過程,都在黑盒中進行,別人就無從破解了!
嗯,這個方法真的很不錯的!但也有兩個小問題:1.使用第三方語言寫,得會第三方語言,我說的會,是指很溜!2.對於不同的操作系統,甚至同一操作系統不同的版本,都可能要有差異化的代碼生成對應環境下的組件(如window下是exe,linux是so等)!如果你不在乎這兩個問題,我覺得,這個方式真的挺不錯的。但對於我來說,我的信條是,越復雜的方式越容易出錯!我個人比較崇尚簡潔的美,所以,這個方法我不會輕易使用!
對了,如果大家覺得這個方法還算可行的話,可以推薦一個我無意中看到的東西給大家看看(我都沒有用過的):jinstall,
更改JVM
看到這個標題,我想你可能會震驚。是的,你沒看錯,做為一個程序員,是應該要具有懷疑一切、敢想敢做的信念。如果你有意留心的話,你會發現JVM版本在業界其實也有好幾個版本的,如:Sun公司的、IBM的、Apache的、Google的……
所以,不要阻礙自己的想像力,現在沒有這個能力,並不代表不可能。所以,我想到,如果我把jvm改了,在裡面對載入的類進行解密,那不就可以了嗎?我在設計構思過程中,突然發現:人老了就是容易糊塗!前面使用第三方語言實現解密的兩個問題,正好也是更改JVM要面對的兩個問題,而且還有一個更大的問題:這個JVM就得跟著這個項目到處走啊!
❸ 黑客與普通程序員有什麼不同
在一些影視劇里,經常可見那些超級厲害的黑客,可以靠一台電腦,敲幾個字元就能讓整個網路系統出現大規模的癱瘓,侵入到各種高大上的企業網路中,來去自如,看別人的電腦秘密如探囊取物一般;
還有一個工種是與黑客不同的存在——程序員,每天坐在工位上,噼里啪啦敲著一行行的代碼,還總被產品經理改需求。不愛說話,穿著邋遢,愛穿格子衫沖鋒衣、牛仔褲、背雙肩背包、黑眼圈配疲憊的臉,頭頂越來越聰明,這是大眾對程序員們的綜合認知......
一提起黑客,人們一臉崇拜,那種神秘感好像聽說了明星的一個爆炸新聞一樣;一提起程序員,人們記住的卻只是那些黑程序員的段子。同樣是敲代碼,差距咋就那麼大呢?
黑客之所以讓人崇拜,一是因為其神秘性,二是各種電影里對黑客的演繹誇張。可以這樣說「黑客因其神秘性,更加容易造英雄。程序員給人印象加班多,整天加班還是有無窮無盡的問題。一個在明處,一個在暗處,暗處的給人更多遐想空間」。
如果要成為黑客,必須是一名合格的程序員,掌握必備的編程語言,而且黑客相對於普通的程序員,在某些專業領域做的而更加驚喜,而且很多都是標準的程序的逆向。這就給了人們一種「黑客是最牛的程序員」的印象,其實不然,術業有專攻而已,而且黑客和程序員的關系就是剪不斷理不亂。
很多程序員和黑客其實都是難兄難弟,程序員編程為生,黑客以發現程序員的錯誤為生,國內的許多大公司的網路安全部門,多數是黑客招安來的,黑客化身成為公司的安全工程師,然後以工程師的名義繼續和黑客對戰。看似是難兄難弟,其實是相親相愛一家人,兩者隨時可能角色互換。
就像阿里巴巴的首席安全技術專家吳翰清,在20歲的時候去阿裡面面試的時候,被面試官問到有啥技術特長,吳二話沒說,拿著面試官的電腦當場黑掉了阿里一台路由設備,導致阿里內部網路中斷,從此在阿里傳為佳話,更是在業內流傳開來。
黑客碾壓程序員這種說法在很多人眼裡是真理,其實黑客和程序員不是水平高低的區別,是分工不同,就像長槍兵和魔法師。舉個簡單的例子,程序員就是建築工人,有的人做設計,有的人做施工,有人搬磚,有人和泥,有人砌牆,各有所專,分工合作,建築一幢大廈。
黑客呢就是想方設法鑽到大廈裡面非開放區域,或者偷點東西,或者在牆上噴個圖案,或者就是看看,窺測心理。攻防技術不分伯仲。都可以非常強,或許能強的離譜,你眼中的一般程序員能創造黑客使用的C語言,腳本語言等。同樣強悍的黑客能一夜間讓你辛苦做好的程序系統癱瘓、資料庫徹底消失。他們互相制約,同樣也能使得產品更加安全。
最後,黑客和程序員的區別就是一句話的區別:程序員是一種職業,而黑客是一種興趣,並且黑客也分好壞兩種。
那麼作為企業開發中至關重要的程序員崗位,只有具備更強更完備的編程技術,才能更好的避免一些不良黑客的侵入,更好的保障公司的網路及軟體安全,這也要求程序員們在技術上的學習任何時刻都不應該鬆懈。
❹ 程序員老了怎麼辦
我27歲,也在思考這個問題。就是要一直往上升,不能停下來,舉個例子,你一直停留在P7升不上去,這時一個比你年輕10歲的人也升到了P7,既然你們職位一樣,說明能力一樣,而你,又老,拿錢又多(每年有固定漲薪幅度),等裁員的時候,不裁你裁誰。所以真的要拼,要向上爬,爬不上去的時候,就要想想出路。比如,年輕時候有投資意識,年老時注意防範風險;比如,多接觸業務而不僅僅局限於技術;比如,提高自己軟實力,政治覺悟,表達能力;比如,提高自己在業界影響力;比如,多接觸社會,現實點,以賺錢立業為己任。最關鍵的一點,要有憂患意識。不要以為程序員拿錢多,就可以做一輩子的鐵飯碗。大家可以想想,不管是工程師還是經理CTO,不過就是工人包工頭,從改革開放以來,有哪一行的工人一直吃香,隨著生產力的提高,工人就是會不斷被淘汰,哪怕當初待遇再高。這個世界,只有搞金融的,做生意的,玩政治的,永遠不會被淘汰(除了自己作死)。所以請各位記得要留一條除技術以外安身立命的後路。
❺ android逆向程序員怎麼學
你只有搞清了編譯(或解釋)系統,並精通順向的編程,你才有可能做好逆向工作。
❻ 會反匯編能找到工作嗎
安全公司的病毒分析
網游公司的反木馬/反外掛
還有一些其他軟體公司會需要底層調試或逆向程序員
這些職位都需要具備一定的反匯編能力
但只會反匯編還是不夠的,要根據職業定位再學一些其他的東西
❼ 請問一下逆向工程分析師的學習路線
必須要看的書:看雪站長段剛所著《加密與解密》第三版;《琢石成器—Windows環境下32位匯編語言程序設計》.羅雲彬.第三版;《windows高級編程》;《C++反匯編與逆向分析技術解密》;《windows編程循序漸進》《程序員密碼學》
建議看的書:《0Day安全:軟體漏洞分析技術》《C語言深度剖析》《windows核心編程》
必須要精通的語言:C語言,匯編語言
必須要會的語言:C++(到了一定境界你會覺得跟C 沒區別),English
必須要熟悉的專業工具:IDA Pro,OllyDBG
必須要知道的一些小工具:PEID,LordPE,一個上手的16進制編輯器
必須具備的素質:對計算機知識充滿好奇,不斷學習的能力
❽ 怎麼樣才能成為一個優秀的程序員
程序員離不開產品的開發,開發產品經常需要和產品經理溝通、和客戶溝通了解客戶的需求,了解用戶的體驗,了解產品的細節。在溝通中能戒驕戒躁,耐心聆聽合理提出自己的建議,有些程序員往往喜歡把產品經理或者客戶當成自己同等專業水平的群體來溝通,那是萬萬不行的。
❾ 程序員和黑客哪個更厲害
程序員更厲害 。
因為黑客只會搞破壞,程序員會修復 。
所以程序員也會搞破壞,但他更會修復 。而黑客他修復不了 。
❿ 為什麼許多程序員從來都不用break或者continue語句
寫程序應該盡量的避免使用break和continuefor、while循環語句里出現return是沒有問題的,但如果你的循環里出現了break和continue,往往是因為對循環的邏輯沒有考慮情況,考慮周全了基本不需要break和continue。因為用了break和continue之後會讓循環的邏輯和終止的條件變得復雜,難以確保正確的結果。
好的代碼不可能一蹴而就,代碼靈感總是零零星星的陸續到來,所以再厲害的程序員都是通過很長一段時間的沉澱才能寫出簡單而優雅的代碼。如果此時你反復提煉代碼已經不再有進展不煩暫時放下過幾個星期或者幾個月再回過頭來看,又會獲得煥然一新的靈感。以上個人淺見,歡迎批評指正。認同我的看法,請點個贊再走,感謝!喜歡我的,請關注我,再次感謝!