写这个东西是为了用来和老师请假的 程序设计方面实在是小白 看到大牛们的经历也把自己的经历贴出来和大家共勉学习吧
对了 斑竹 上回发的邀请码由于忙着准备日语一级 报名费352呢 心疼死我了 所以一直没注意斑竹给我发验证码了 能不能再发一次呗 现在是2011年三月十号,昨天刚日语一级报上名。心里有点乱。
写这个给老师我也考虑了很久,也下了很大的決心,突然和老师说我先不来上课了,我去学计算机去,老师会怎么想我。
这件事困扰了我老长时间了,日语还是计算机的问题。曾经打算转专业,但是问了一个计算机专业的同学,叫他A吧,他说他们的计算机专业也不算理想,数电、模电、数学、物理。老多用不上的专业都要学,而且转专业过去之后以前你没学的东西(数电、模电、数学、物理)都要补考,要算学分。数电模电讲的是硬件方面的(全都是理论,而且将来工作的时候大多数人用不上),数学学了也没有用,除非是想搞密码学的,而物理好多大学的计算机专业早就取消了。这个计算机专业的同学是我在图书馆认识的,很擅长网络渗透(也就是网络入侵),能够进教务处网站自由的改分,学校主页有四台服务器三台linux服务器,一台server2003的服务器(在内网,不好拿),三台linux服务器都被他拿了下来。不知道老师听到这些什么感觉,是不是感觉他挺厉害的,一开始我也这么觉得,然后每个周末我们一般都会在一起交流一下又学到了什么新东西,渐渐的我就觉得这些也算正常,他觉得不是因为他厉害而是服务器的管理员太业余。比方说administrator的密码,老师把密码设置成了13位的,有大小写数字还有特殊符号,是很难破解出来的,但是咱学校的服务器是2003的系统,口令默认启用的是LM HASH加密的方式(可以手动改成NT HASH加密的方式),而在2008和2008R2上才默认用的是NT hash加密的方式,所以密码被他挂在服务器上跑了三天就跑出来了。老师是不是想这个管理员是不是不是计算机专业毕业的,我们这两个小屁孩都知道的东西管理员可能不知道?不排除管理员是非计算机专业的,但是与这个没关系,就是计算机专业的学生也不知道,因为这东西只有动手操作才知道,书上不会教。可能2003,2008老师都没有听说过,但是可以确定的是直到毕业了好多计算机专业的学生也不知道他们是啥。因为书上也没教,他们也对这些不感兴趣。
再说说自己的日语专业,因为高中学理科实在是学的都想吐了,打死都不想再学理科了,学文科那就学语言吧,平常爱看动画片,而大部分动画片又都是日本的,到高三那年的时候突然知道了村上春树,源氏物语,枕草子,感觉都是好东西,挺好看。高三以前也看过日本不少的文学作品吧,川端康成的 雪国 古都 千只鹤,星新一的小说,还有一些其他作家的,不过都忘了,好长时间不看了。直到大一上学期我还觉得村上春树的挪威的森林是我目前看到的最满意的小说,不过现在不是了,现在最喜欢的小说叫疯狂的程序员,不过书的作者现在在监狱里呆着,因为做外挂被腾讯起诉了。
大概是大一下学期吧,发现学日语实在是很吃力啊,然后碰巧在图书馆遇到了A,他把我们图书馆的电脑的还原卡给破坏了,我在图书馆干活嘛,维护图书馆的机器,也算是不打不相识了。我呢,一直到大二上学期都没有目标,都不知道自己将来要干什么,从事计算机安全类的工作?去杀毒软件公司?就凭我这三脚猫的功夫?因为那时候除了会做做系统,维护一下电脑,入侵一下安全设施没有弄好的电脑,貌似除了这些我就啥也都不会了。曾经和A讨论过,将来都要做什么,我问A将来会不会做安全,他说不一定,安全这个领域很窄啊,公司就那么几家,而且对人的要求很高啊,能进安全公司的不是大牛也得是牛人啊,他说现在还要学一些上层的东西,java之类的,对这方面需求很大,虽然工资很低,底层正好相反,工资高,但是技术门槛同样高。我深有同感。
这个暑假,看了一本书叫疯狂的程序员,我终于找到了自己的目标,像顿悟一样,一下子醒过来了,我终于可以用语言来表达清除我究竟要学的是什么,写Windows底层的程序,再具体一点就是Windows驱动程序设计。这个暑假我的效率非常高,十天,把C++常用的东西都弄完了,(类,继承,模板,构造函数,析构函数,虚函数,纯虚函数,封装,多态)我发现学程序设计,很简单,动手就够了,而且要结合具体实现的例子,我结合的例子是SDK程序设计(就是纯粹的调用API)和MFC中各种类(假期才刚开始学然后一回来要考一级就又放下了)的使用。至于ATL和WTL我只听过还没动手操作过。
我发现程序设计才是王道,而现在Windows又是很普及的系统,所以自然而然都来搞这个Windows平台下的程序设计。就是我以前觉得很厉害的A会自己拿webshell(用于挂马)却不会写自己的shellcode(用于溢出)。Windows程序设计对于咱们学校来说门槛还是很高的(咱们学校开了Windows程序设计 是选修课 但是学生是必选的课 但是讲的东西就是用来糊弄人的)更不用说底层的Windows驱动了。
说了这么多只是想让老师大致了解自己的计算机历史,甚至还说了A入侵的事。
就像风险投资(VC)一样,你的计划说的再伟大,VC商都不会在意,他在意的是切实可行的盈利模式。
我也给自己定了计划,参考了很多前辈的学习经历,其中有一个同学网名叫sudami,北京林业大学的,08年进360公司了,他是地理专业的,我把他的经历贴出来,感觉我和他的经历很相似。
西西哈哈:现在黑基里可能很多人都不认识你了,给大家介绍下自己吧。sudami: 网名: sudami (记得是5年前上高2时的泡泡堂游戏账号) 性别: 男 年龄: 20 爱好: WINDOWS内核、T足球、偶儿看点《萌芽》等文章西西哈哈:能说说您学计算机的历史吗?sudami: 高中时一直是班上的好学生,可惜在高考前最后一个月经常通宵玩泡泡堂,导致高考发挥一般般。考入浙江大学的希望破灭,于是进了北京的一所还算可以的一类大学(离清华大学最近.住在海淀区的可能知道是哪里了). 读的专业和计算机无缘,在开始的2年中没有目标, 虚度了2年光阴. 大1上半年(2005年10月)教了唯一一门计算机的课--C语言.学完了不知道C语言是干什么的,盯着古老的TC,不知道如何写代码. 这科理所当然的挂掉了; 大2上半年(2006年10月)又开了一门课--C++. 事过一年,有关C的东西全忘了.然后又混过了这半年的C++课时,考试的时候勉强得了60多分,算是过了...但是啥都不会,学了基本白学了. 但这时候也成了一个转折点. 平时在网上溜达,看了不少前辈门关于编程的经验,也期望着想成为一个编程牛人.萌发了重新学习C/C++的念头, 与是在这年的寒假, 在图书馆把所有关于C/C++的有价值的书都翻了一遍,找了其中的3本开始重新学起来.整个寒假在家过得很充实,对C/C++的理解也更深刻了一层.这个时候觉得C语言真的很有魅力. 开学之后,也就是大2下半年(2007年3月)开了一门数据结构的课,这半年是进步最快的时段, 一边上数据结构的课,一边学习 <WINDOWS程序设计>、 <WINDOWS核心编程>、 <操作系统原理>、 <编程高手箴言>、<深入浅析MFC>等乱七八糟的书,一有时间就打开熟悉的VC 6.0开始写代码.这样时间慢慢的过去了,我也学到了很多东西,对应用层的编程,WIN32 API, MFC等熟悉掌握了,也写了几个小软件,算是练练手. 当然这些东西都是利用业余时间去学的.专业课的压力也很大,但兴趣在,所以一直坚持着. 到了大3上半年(2007年10月),开始逐渐接触到一些WINDOWS底层的东西,当然这个时候多是在学习HOOK、DLL之类的老技术。在2007年9月份开始真正的学习WINDOWS内核了,到现在差不多有3个月。但是这段时间进步是最快的。图书馆没有任何关于驱动的书,仅有一本 武河安 编著 的 《WDM驱动程序设计》,讲的是用DS写驱动,当时真是摸不着头脑,配制那些东西超级麻烦(现在看来这本书真是垃圾,误导了不少人),然后不会配制DriverStudio,开始网上到处求助,最后在kanxue论坛了解了一些对偶来说起引导作用的信息,于是呼放弃了DS,开始用命令行编译驱动程序。无奈网上没有系统的关于驱动的教程,一切东西只能靠自己用google去搜索。从此以后google、baidu成了我最好的老师,遇到不懂的问题便搜索之,往往能在CSDN,DriverDevelop,kanxue还有一些国外网站找到解决方法. 就这样过了一个月,学了很多关于驱动的东西,看着别人的代码,自己加注释,不懂的查DDK,用Windbg,上google搜,然后纪录到笔记中。当编译的驱动被加载成功,进程被成功隐藏,文件在眼皮底下消失,注册表中也无痕迹时,偶觉得这些东西非常的有意思,兴趣越来越大,学的越来越多,越来越深. 一个月之后就开始接触WRK,OSreact。前者是W2K的源码,后者是一个开源的操作系统。没事的时候就读里面的代码。遇到未导出的函数,就在WRK中查,一行一行的读,一笔笔的纪下心得和理解过程。这样对好多东西有了一个更深层次的理解。 然后开始接触逆向,颤巍巍的拿着IDA,直接把ntfs.sys拖进去,看来看去,偶这个逆向刚入门的菜鸟也渐渐的对它熟悉起来。由于之前木有学过asm。只能硬着头皮把它搞定,到图书馆借了一些关于80x86的书,然后买了本 罗云杉的 汇编书,开始啃起来。有一段时间读的一本清华大学出版的原版英文资料,关于80x86汇编和单片机的东西,足足有1000多页,偶看了200多页实在是看不下去了,再到图书馆去借的时候发现它的旁边就是一本翻译过的中文版。晕死了,于是又把中文版的借回去读。 经过一个多月的断断续续的学习,终于对那些寄存器,堆栈等汇编有关的东西熟悉了。 但是此时只能看懂人家的asm代码,要偶自己完整的写出来,然后编译成程序,偶还没有去试验过。毕竟偶现在对C很熟悉,在C中镶嵌asm足以。逆向的时候就要看汇编功底了。所以偶还在不断的学习汇编中。 在学习别人逆向的驱动代码中,偶发先必须得学习文件过滤驱动了,于是在网上找到了绝对经典的NTFSI一英文原版资料。这本书在书店的很少,而且中文版的要100RMB。难买到又贵,偶只能硬着头皮看英文了。学了几章,感觉书中对WINDOWS底层的一些细节讲的非常好。学了 the caching manager。终于知道了I/O Manager、VMM、File System Driver之间的联系和操作,IRP是如何产生并向下传递的。 相应的也就学到了cnnic这个流氓的一些丑陋行径,在学习360SuperKill驱动的过程中,知道了如何恢复被cnnic劫持的FSD的IRP分发例程IRP_MJ_CREATE(0x00)、IRP_MJ_SET_INFORMATION(0x06)。在学习粉碎文件的过程中知道了MmFlushImageSection内部的实现过程(参考WRK),原来要删除正在运行的文件方法是很多的,直接发IRP删除,然后HOOK fastfat.sys Ntfs.sys中IAT的MmFlushImageSection即可.要么可以将ImageSectionObject、DataSectionObject 置空. 网上有很多资源,往往搜索一个问题的时候便附带把其他问题学习了,偶也就开始接触到了shellcode.在最近kanxue举办的软件漏洞分析中,要用到大量的shellcode和逆向的技巧,偶这个菜鸟就只能在一旁观战+学习了.... 然后陆续学习了其他的一些英文资料,eg: <Undocument WINNT> <Rootkit:Subverting the windows kernel> <Windows Internals> ... 这些资料真的是学习内核所必须的.偶还在学习中.也经常用代码去一些国外的网站看写文章,eg: Rootikit.com, codeproject.com, security.org... 在kanxue论坛学到了不少东西,因为大家都是相互学习,共享成果的.像内核监控,RING3和RING0间的同步通信, 文件隐藏, 进程隐藏, 过主动防御, 感染PE文件, 感染驱动文件, shellcode,无驱进RING0, VmProtect,逆向,F5... 偶现在对RootKit非常感兴趣.这是一个非常广阔的发展空间,谁对WINDOWS底层了解的更透彻,谁就能掌握更加深刻的技术.在RK 和ARK之间徘徊,在杀毒软件和主动防御间游击,在虚拟机和还原卡之间测试... 到现在,偶还很菜,需要继续加紧时间学习.因为要学的东西实在是太多了。 在内核群里面跟那些内核大牛们交流,真是觉得非常惭愧. 这里要严重向360safe 公司的核心开发者MJ0011 学习,这个牛MM不是一般的牛啊.内核界的绝对高手~~~西西哈哈:你是什么时候来到黑基的?sudami: 最早接触黑基是在06年5月份,那时候在玩网络游戏--泡泡堂,听说hack可以盗号,于是到baidu一搜,就进了黑基了. 放眼一望,自己什么都不会,于是看到一篇文章就拿来学习一回. 逐渐的,黑基成了偶每次上网第一打开的论坛. 刚开始什么都不懂,乱发帖,乱回复被斑竹扣过分. 呵呵, 先在想想自己真菜~~~真正开始喜欢上黑基是在06年10月份,那时在黑基的活动开始频繁起来, 当时对病毒木马比较感兴趣,于是有时间在泡在"病毒木马区", 接着熊猫烧香开始肆虐整个网络,偶从中也知道了病毒的厉害,第一次在原创区发表了手工清楚熊猫的过程,心中无比喜悦.06年是在黑基过的年,在水区很高兴,还中了个红包,被+了好多分,依稀记得猫, walker110, 疯子, 5046820, lyxn 和它的老婆,yyx... 到了07年, 逛的为数不多的几个论坛,黑基就像一个网上的家. 有段时间真是一天不上黑基,就很挂念.一种说不出的感觉. 眨眼的工夫,07年过去了,我在这里当了1.5个月的斑竹就此告辞. 我静下心来想了很多,最后还是决定离开这个曾经熟悉的地方. 别的什么都不说,至少这是我电脑方面的启蒙.真实她培养了我对电脑,对编程,对WINDWOS内核的兴趣.通过她我接触到了一些前辈,一些牛人.从他们那里学习到了很多宝贵的经验,这是我以后学习发展的一个基础西西哈哈:离开黑基后有经常回来看看吗?sudami:因为要学的东西很多,可能不回来了吧.不过我会一直记得这个地方的.红冰泪是个非常负责,非常出色的管理员.西西哈哈:你大学的专业不是计算机,有想过毕业以后从事计算机方面的工作吗?还是有其他的打算?sudami:这只能是个业余爱好,不能当饭吃. 我想不会从事吧西西哈哈:现在黑基上有非常多的新人都在问怎么入门,能不能谈谈你的看法或者说说你的经验?sudami:呵呵,我也是个菜鸟.大道理就不说了.关键几点:英文不用太好(能看懂MSDN WDK就行了);求知欲很重要;学习自己感兴趣的东西;baidu/google是最好的老师;要用时间和耐心去战胜一切;学习靠自己,不要依赖任何人;要勤快的做笔记.这是你以后的一笔巨大财富.经常和比自己牛的人交流, 不经意间你会有所获;学习是一个循序渐进的过程,需要不断温习不断巩固;...西西哈哈:对于现在的黑基,你有没有什么建议?sudami:呵呵, 我希望黑基能吸引更多的牛人进来.现在的黑基,我只能说是菜鸟的乐园.可能大家认为我说过了。但是从一个旁观者的角度,确实是这样的.好久不来黑基, 希望黑基能培养出更多的人才~~~~西西哈哈:离开这么久了,最想对朋友们说些什么?sudami:大家学习,生活,工作快乐,顺利.sudami正在加油的学习,希望有一天能将名字刻在黑基的名人堂上.
Sudami是我假期知道的,我把他的经历看了好几遍,感觉我和他好像,我也是大二下学期的暑假从C++再度重头,一路杀奔Windows驱动,虽然现在水平很菜。他曾经总结了一下如何从菜鸟到Windows底层,我也贴出来,勉励自己。
若对Windows底层开发没有兴趣,不建议继续深究; 若有些兴趣可以继续 2. 先广泛打基础,比如C/MFC/C++/ASM,再学习Windows核心编程,对R3上的一些开发有所熟悉; 再系统的学习<操作系统>等书籍,理解整个系统的原理,构架,实现. 3. 有了以上基础,可以开始阅读一些驱动入门书籍,如 毛德草 的<Windows内核情景分析>, 多上google搜索资料; 下一份WRK/ReactOS,没事翻一翻,搭好驱动编译环境后,可以尝试写些小驱动,在实践蓝屏中摸索总结,从而积累初级的经验. 4. 等成了驱动开发初级工后,可开始学习Windbg,IDA的使用. 多看源码多F1看帮助文档. 5. 等熟练以上工具后,开始Windbg动态调试,IDA静态逆向其他驱动(包括微软自己的). 在这一过程中,你又会接触到脚本语言,汇编知识点,Intel手册,加密解密,Vmvare等一堆的东西,同样你需要熟悉它们. 6. 等你熟悉以上东西后,可以给自己提些需求,并实现该需求; 比如写个小型ARK; 在这个过程中,你可以切实感受到开发一个程序是一个系统的东西,你又需要回到R3写界面,重温MFC,WTL等设计与使用.当然又要写驱动程序,保证兼容性等问题; 这个过程是漫长的,期间你会发现写一小部分功能,你可以扩展收获很多知识点. 7. 等你熟悉以上东西后, 已经可以自己独立解决问题了.基本不需要到网上求助; 遇到问题,会利用WRK / Windbg / IDA / Google 等方式自行搞定; 如网上有现成的解决方法,借用之,取其精华,唾其糟粕; 若网上没有现成的,则需要你IDA 系统文件,load pdb; windbg动态调试内核等手段自行挖掘; 若网上只有类似的程序,你可以逆向其关键部分参考之,而后变成自己的东西. 8 ,等你经历了以上7个阶段,你可以开始系统的了解WINDOWS的构架,站在产品的角度思考问题,分析问题,解决问题. 对自己多提需求.进而再去实现之. 这阶段是积累经验的阶段... 9. 基本能够胜任大多数公司的项目需求了.
刚把日语1级的99个文法看完,感觉忘得好快,还在不断温习中,日语一级听力没有NHK说的快,但是有的听力我看了原文都没选出答案,350块钱呢,前几天,我彻底下定决心不碰电脑方面的事,这四个月全都学习日语了冲刺一级了,最好是一级过了,大三的时候向各科老师请假,专心学习Windows驱动程序设计,然后在大三 十月份的时候360来哈工大招人,我去哈工大试试,然后大四的时候Windows驱动 IDA windbg就学的差不多了,即使去不了360找个做软件的小公司也应该能找得到了,在公司学到的东西是最多的了,因为会获得实际项目开发的经验。和sudami那个时候正好相反,我觉的将来我工作的岗位很可能是计算机方面的,而不是日语方面的。
感觉学计算机比学日语难的,但是对计算机比对日语有兴趣。寒假(寒假效率很高,一般早晨9点起来 中午睡一个小时 晚上俩点睡觉 也玩过,加起来玩了10天包括过年的那几天)看了几本书,没有全看完,但是哪一本书都可以和新编日语4册加起来对抗一番。
Windows核心编程 16开 1000多页
Windows程序设计 上下册 32开 1300多页
Windows内核情景分析--基于ReactOS 1400多页
深入解析Windows系统 16开 800多页
我的日语学的不好,英语也学的不怎么样,但是MSDN和WDK还看的挺顺畅的,
粘一段MSDN CreateProcess参数的调用 英语虽然不是很好 但是看MSDN里面的东西看懂大意还是不成问题的。
//
BOOL CreateProcess(
LPCTSTR lpApplicationName, // name of executable module
LPTSTR lpCommandLine, // command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
BOOL bInheritHandles, // handle inheritance option
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCTSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFO lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInformation // process information
);
Parameters
lpApplicationName
[in] Pointer to a null-terminated string that specifies the module to execute. The specified module can be a Windows-based application. It can be some other type of module (for example, MS-DOS or OS/2) if the appropriate subsystem is available on the local computer.
The string can specify the full path and file name of the module to execute or it can specify a partial name. In the case of a partial name, the function uses the current drive and current directory to complete the specification. The function will not use the search path. If the file name does not contain an extension, .exe is assumed. Therefore, if the file name extension is .com, this parameter must include the .com extension.
The lpApplicationName parameter can be NULL. In that case, the module name must be the first white space-delimited token in the lpCommandLine string. If you are using a long file name that contains a space, use quoted strings to indicate where the file name ends and the arguments begin; otherwise, the file name is ambiguous. For example, consider the string "c:\program files\sub dir\program name". This string can be interpreted in a number of ways. The system tries to interpret the possibilities in the following order:
c:\program.exe files\sub dir\program namec:\program files\sub.exe dir\program namec:\program files\sub dir\program.exe namec:\program files\sub dir\program name.exe
//
大学给我的感觉是,老师是好老师,学生不是好学生。
今天是3月10号 7月3号考试,我打算拼四个月,不管一级过不过,把日语放一放,学Windows驱动,我感觉这样我的就业几率大于光学日语的几率,而且还是在我的兴趣上就业。
给自己做了一下计划。
汇编方面
16位汇编曾经看了一阵,不用学太多,知道一下中断及其调用就行,还有寻址方式。重头戏是Windows环境下的汇编。这方面的参考书以<<Windows环境下32位汇编语言程序设计>>为主,寒假看过电子版,讲的非常好,罗云彬写的,自己买了本。以后用windbg以动态调试及IDA反汇编不能少了这方面的支持。汇编就硬着头皮上吧,幸亏以前看了一点16位汇编,有一点点帮助,这点比sudami好点。
Windows程序设计
学驱动之前必须要熟知R3下各种常见的API的调用,这方面的书以我买的<<Windows程序设计>>为主,着重看一下进程 线程 文件 内存 网络方面的API调用,MFC一定要学,文档、视类方面的需要的时候再看吧 不要把他们当重点, ATL WTL 只听过名字,调研一下,看需不需要像MFC一样学习,需要的话还是找与底层联系紧密的方面当重点。
驱动方面
这方面以<<Windows内核安全编程>>这本书为重点,这本书面面俱到,但是也有一个缺点讲的不细(对于我这种入门级别的小白)。Windows架构方面,Windows内核情景分析太贵了,打折后还要150元,手里只有他的电子书版本,以潘爱民老师的那本<<Windows内核原理实现>>为准,应该再买一本驱动方面讲的比较细的书来,用来当字典查,由于Windows不开源,驱动方面的书实在是少之又少,以后还要花一段时间专门学习一下HOOK SSDT HOOK SHADOW SSDT Inline Hook 这方面就得多上网查,一定要多多的收藏牛人的博客,那些愿意共享知识的牛人的博客
工具使用
以后要学习IDA windbg 有可能的话软件软件逆向方面的三环调试器ollydbg也要学 知识到达一个层次了工具自然而然也就学会用了,虚拟机方面的vmare早就会用了,这点还比较好。
数据结构
一直不理解数据结构是什么东东,后来在某个地方看到了数据结构被加上了个定语,终于明白数据结构是怎么一回事了,数据结构就是计算机中数据结构。原来压根就是在电脑里面数据存在的方式。数据结构这方面就只知道一个栈,先入后出、后入先出。Windows里面还有链表 还有二叉树的遍历,这方面可以找找A帮忙,学数据结构和学C++一样,结合Windows中具体实现的方式应该不难。
字数统计了一下,写了不少。
写了这么多就是想和老师说,想不来上课去学写驱动,平常如果布置作业的话我会问一下同学,也会交作业的。也许自己有点任性,请老师原谅。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!