首页
社区
课程
招聘
[旧帖] [原创]新手学习计划 0.00雪花
发表于: 2012-3-21 19:54 4079

[旧帖] [原创]新手学习计划 0.00雪花

2012-3-21 19:54
4079
无意在sudami大神的Blog看到对初学者的一些建议。想想自己也才初学,如果就跑去驱动尝试理解Windows这套精密的仪器,应该是一件吃力不讨好的事情,我这样的拙劣的水平还是定一个低一点的起点,从最基础的部分开始学习吧。

sudami对初学者的一点建议
1. 若对Windows底层开发没有兴趣,不建议继续深究, 若有些兴趣可以继续。

2. 先广泛打基础,比如C/ASM/C++/MFC,再学习Windows核心编程,对R3上的一些开发有所熟悉,再系统的学习《操作系统》等书籍,理解整个系统的原理,构架,实现。

3. 有了以上基础,可以开始阅读一些驱动入门书籍,如《Windows内核情景分析》, 多上google搜索资料,下一份WRK/ReactOS,没事翻一翻,搭好驱动编译环境后,可以尝试写些小驱动,在蓝屏中摸索总结,从而积累初级的经验。

4. 等成了驱动开发初级工后,可开始学习Windbg,IDA的使用,多看源码多F1看帮助文档。

5. 等熟练以上工具后,开始Windbg动态调试,IDA静态逆向其他驱动(包括微软自己的)。 在这一过程中,你又会接触到脚本语言,汇编知识点,Intel手册,加密解密,Vmware等一堆的东西,同样你需要熟悉它们。

6. 等你熟悉以上东西后,可以给自己提些需求,并实现该需求,比如写个小型ARK,在这个过程中,你可以切实感受到开发一个程序是一个系统的东西,你又需要回到R3写界面,重温MFC,WTL等设计与使用。当然又要写驱动程序,保证兼容性等问题,这个过程是漫长的,期间你会发现写一小部分功能,你可以扩展收获很多知识点。

7. 等你熟悉以上东西后,已经可以自己独立解决问题了,基本不需要到网上求助。
遇到问题,会利用WRK / Windbg / IDA / Google 等方式自行搞定,如网上有现成的解决方法,借用之,取其精华,唾其糟粕。 若网上没有现成的,则需要你IDA 系统文件,Load pdb;Windbg动态调试内核等手段自行挖掘,若网上只有类似的程序,你可以逆向其关键部分参考之,而后变成自己的东西。

8 .等你经历了以上7个阶段,你可以开始系统的了解Windows的构架,站在产品的角度思考问题,分析问题,解决问题,对自己多提需求,进而再去实现之,这阶段是积累经验的阶段。

9. 基本能够胜任大多数公司的项目需求了。


想来能在看雪注册帐号,都是有兴趣的童鞋吧,就是缺少一颗坚持的心,希望自己能够坚持把这条路走下去。

在看雪不乏我这样的学习贴、计划贴、目标贴,不过我想我要坚持下去,争取2012结束时,能完成sudami大神建议中的第二条,“先广泛打基础,比如C/ASM/C++/MFC,再学习Windows核心编程,对R3上的一些开发有所熟悉,再系统的学习《操作系统》等书籍,理解整个系统的原理,构架,实现”,并有一篇自己的精华帖。

分解一下大神提出的学习计划,大概是两部分

基础学习:C语言,汇编语言,C++基础部分(不涉及C++中的高级技巧,STL,泛型等,只能够看懂C++封装的类就好)。
操作系统:Windows API,部分Windows系统特性,核心编程。

目标:能熟练掌握并应用C语言,对OD下的汇编指令能够阅读,使用C++的封装特性;熟悉常用的Windows API(函数,结构),熟悉Windows系统特性,能看懂大牛的文章。

此帖的内容主要是把sudami大神的学习心得从他Blog留言板拷贝来此跟大家共享。每天都要在工地搬砖,能用来学习的时间也不是很多,而且基础知识都是重复性的内容,我会尽量发在自己的帖子里,不占用论坛版面,也希望新手区的朋多多多帮助。

2012/3/21  revfish

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (45)
雪    币: 415
活跃值: (34)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
一年时间太短了,你又在工作,一天四个小时学习研究时间不够的,数据结构,算法也是需要懂点的,操作系统初看两遍就行了,碰到问题回过头的时候知道在哪里查哪方面的东西加油吧。
2012-3-21 20:30
0
雪    币: 48
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢楼上的鼓励,就是你所说的,时间估计不够用,所以暂时没有办法学习数据结构了,先把这些基础知识都掌握了,后面会抽时间看的。
2012-3-21 20:42
0
雪    币: 506
活跃值: (65)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不管怎么还得学呀.楼主加油,天天想着学,一定会学好的
2012-3-21 22:00
0
雪    币: 123
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢分享!!!!!!!!!
2012-3-22 11:26
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
为楼主的精神所感动!
2012-3-22 11:30
0
雪    币: 56
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
来吸收一点经验,正学习中
2012-3-22 12:01
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习学习,谢谢分享
2012-3-22 12:16
0
雪    币: 2503
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢楼主的分享!!!!!!!
2012-3-22 13:18
0
雪    币: 169
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
一起学习,共同进步
2012-3-22 22:19
0
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
11
谢谢楼主的分享!
2012-3-22 22:22
0
雪    币: 183
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
此文很适合给正在入门的新人做一个导航!指点迷津
2012-3-22 22:30
0
雪    币: 67
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
没有实践看在多书也是瞎掰!!!!看了就忘!理论看了就忘,学习技巧就像看别人解题一样,永远都是门外汉;
不断地动手写代码,不断地实践吧,还得经常写学习笔记,学习心得

借楼主的帖子发泄一下心中的郁闷,共勉!!!
2012-3-22 22:37
0
雪    币: 48
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不管是捧是杀都谢谢大家的回复,既然决定要走,起码要坚持一年,一起共勉吧。
随便在当当买了本纯粹讲解C语言的《C Primer Plus》,每天用一些时间来阅读,笔记就学习泉哥riusksk做成一条条Tips吧。

第一章.概览
1.C是为编程人员开发的语言。
愚见以为操作系统和编译器是很强大的两样东西,而C语言可以开发这两样东西。

2.C语言的设计特性自然地采用自顶向下的规划、结构化的编程,以及模块化的设计,使得编写出的程序更可靠、更易懂。
面向对象编程是一种哲学思想,将计算机代码抽象成为一个物件,具有自己的属性,也能够通过一些方法控制自己,对外留出一些接口,至于一些不想让别人知道的实现细节可以在内部实现。但是究其底层,语法特性是编译器在约束,到达汇编一层依然跳脱不了内存,寄存器。依然是一个个函数通过指针来操作内存中的数据块。所以C语言学习一下还是没有坏处的。

3.C语言程序结构紧凑运行速度快,表现出汇编语言才具有的精细控制能力。
编译型语言直接有编译器一次性制作成标准的可执行文件,能够在对应的平台直接执行。不需要解释器的逻辑去分析、转换、执行。尤其在开启优化选项后,阅读其反汇编代码会发现每一句都是有用的,而源程序中没有被利用到的地方,可能在反汇编代码中都找不到踪影。

4.编译器是将高级语言程序解释成计算机所需的详细机器语言指令集的程序。

5.使用C语言的7个步骤:
定义程序目标----设计程序----编写代码----编译链接----运行程序----调试和测试程序----维护和修改程序
其实每个步骤都存在一个小循环,一点点的优化整个步骤,就这个过程不敢有心得,毕竟还是一个初学的人。

6.将源文件转换成为可执行文件,需要经过编译和链接。编译器将源代码转换为中间代码,链接器将中间代码与其他代码相结合来生成可执行文件。

这个是从另一本书上截得图,GCC的编译过程,跟Windows差不多,能够帮助理解。

7.C的某些方面取决于系统,例如存储数字的空间,后续都是在Windows系统下,使用VC6.0进行学习。

第一章内容不多,但是还是需要认真对待的。笔记中如果哪点您认为有待商榷,可以帮我指出,我会虚心听您的指导的。快一点了,该休息了,明天再干一天,就能休息一下了。论坛的各位朋友晚安,Good luky。

2012/3/23    revfish
2012-3-23 00:50
0
雪    币: 266
活跃值: (204)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
加油啊
2012-3-23 02:06
0
雪    币: 2235
活跃值: (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
路途还很漫长
2012-3-23 08:31
0
雪    币: 267
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
共同学习中 哈哈
2012-3-23 09:38
0
雪    币: 41
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
加油  和楼主一起努力
2012-3-23 11:19
0
雪    币: 71
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
楼主加油!

在看雪论坛翻阅,发现一个比较“严重”的问题,自2008年之后获得高级会员、中级会员的大牛越来越少?而论坛的精华篇几乎全出自2004~2007年间注册的会员之手。而近几年的活动(金山、腾讯、360排名不分先后,真的不分先后)获奖者也几乎出自这期间注册的会员。

建议看雪段老大做一个调查,注册会员的年龄、学历、专业做一个统计?看出成果的会员在那个层次出现,论坛还更加需要在新人入门提供一些指导和带路,上次看到一个闭关者,惩罚自己有期徒刑一年的会员,真有点不是滋味的感觉。现论坛出现了严重的断层?青黄不接!新注册会员加油!!!祝愿看雪论坛越来越好!

我也愿意为看雪论坛做一些力所能及的事情。StartAoA@gmail.com
2012-3-23 13:48
0
雪    币: 138
活跃值: (460)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
说的好!

但是有个情况就是大家伙越来越低调了,不太喜欢分享和讨论了
2012-3-23 17:12
0
雪    币: 48
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
StartAoA说的在理,但是大神们首现要有时间,工作后空闲时间应该是很少的;其次工作中的研究毕竟事关相应的产品,可能会涉及到将同组别人的研究成果泄漏,也算是对同事的一种不尊重;最后,没有最后,觉得更多的时候还是需要自己来一步步的走。恩,作为新手少说话,多学习吧。

第二章.C语言概述
1.主函数int main(void)
由于使用VC来编译学习代码,就不去遵循什么C99标准了,main依然是C语言的默认入口函数。不过使用VC下的一个编译选项#pragma comment(linker,"/entry:EntryFunc"),可以修改入口函数,但是还会产生一些问题,这个以后遇到了再说吧。

2.【疑问】main函数是执行时第一个函数么?
A1PASS当时写逆向三步走时,一开始就提出OD载入程序后,发现根本不是写的相关逻辑。这里自己也验证了一下,main函数调用前都做了什么。

大概就是这个过程,但是VC/VS各版本,包括Debug/Release,开启不同的优化编译选项出来的代码会有若干差异,这里忽略。
下列代码是从crt0.c拷贝来的,能够更好的理解mian函数执行前,都做了什么工作。
//ASCII控制台启动函数
void mainCRTStartup(void)
{
	int mainret;

	_TUCHAR *lpszCommandLine;
	STARTUPINFO StartupInfo;
	
	//获取版本信息
	_osver = GetVersion();
	
	_winminor = (_osver >> 8) & 0x00FF ;
	_winmajor = _osver & 0x00FF ;
	_winver = (_winmajor << 8) + _winminor;
	_osver = (_osver >> 16) & 0x00FFFF ;
	
	//堆空间初始化
	//MT为多线程标志
#ifdef _MT
	if ( !_heap_init(1) )               
#else  
    if ( !_heap_init(0) )              
#endif  
		fast_error_exit(_RT_HEAPINIT);  
		
	//初始化多线程环境
#ifdef _MT
	if( !_mtinit() )
		fast_error_exit(_RT_THREAD);    
#endif
	__try 
	{
		//获取命令行
		_acmdln = (char *)GetCommandLineA();
	
		//获取环境变量信息
		_aenvptr = (char *)__crtGetEnvironmentStringsA();
		
		//获取命令行信息
		_setargv();

		//获取环境变量信息
		_setenvp();

		//初始化全局数据和浮点寄存器
		_cinit(); 

		__initenv = _environ;

		//调用main函数
		mainret = main(__argc, __argv, _environ);
		
		//检查main函数返回值执行析构函数,或者atexit()注册的结束后运行函数
		exit(mainret);
	}

	//异常处理
	__except ( _XcptFilter(GetExceptionCode(), GetExceptionInformation()) )
	{
		_exit( GetExceptionCode() );
	} 		
}


3.C99标准允许把声明放在代码块中的任何位置,但是首次使用变量之前仍然要声明。
#include <windows.h>
#include <stdio.h>

typedef int (WINAPI * AddProc)(int a, int b);

int main()
{
	HMODULE hInterfaceDLL;
	AddProc add;

	hInterfaceDLL = LoadLibrary("InterfaceDLL.dll");
	add = (AddProc)GetProcAddress(hInterfaceDLL, "Add");

	int i = 1;
	int j = 3;
	int s = add(i, j);
	printf("%d\n", s);
	return 0;
}

先不看这段代码的具体含义,编译的时候无法通过编译(前提,VC下建立源文件时将后缀名改成.c,使之为标准C编译),VC提示如下:
error C2143: syntax error : missing ';' before 'type'
error C2143: syntax error : missing ';' before 'type'
error C2143: syntax error : missing ';' before 'type'
error C2065: 's' : undeclared identifier
但是使用CPP后缀就能够成功通过编译,现在想来就是这个原因吧,C99之前的标准需要在一开始声明变量,查询相关错误号,在微软网站上找到一句话
In Microsoft C, compiler errors C2143 and C2144 are defined as follows:
You may receive this error message if your program places executable code before a data declaration, an acceptable practice in Kernighan-and-Ritchie C.
This practice has been outlawed in later versions of the ANSI drafts.

应该是使用了之前的K&R,C的标准,并不是ANSI定制的C99。
相对应改成如下就能够成功通过编译:
int main()
{
	int i = 1;
	int j = 3;
	int s;
	HMODULE hInterfaceDLL;
	AddProc add;

	hInterfaceDLL = LoadLibrary("InterfaceDLL.dll");
	add = (AddProc)GetProcAddress(hInterfaceDLL, "Add");

	s = add(i, j);
	printf("%d\n", s);
	return 0;
}


4.操作系统和库通常使用一个或者两个下划线开始的名字,自己带应用代码中避免出现这种命名。
_CRTIMP void * __cdecl malloc (
        size_t nSize
        )
{
        void *res = _nh_malloc_dbg(nSize, _newmode, _NORMAL_BLOCK, NULL, 0);

        return res;
}

这个是从C运行库中复制的,可以看出,使用了好多"_"为名称(宏名、调用约定名、函数名、结构名...)开始。

5.提高程序可读性的技巧,选择有意义的变量名,使用注释,使用缩进,使用空行分隔概念上的不同部分。
各个公司的代码风格应该是不相同的,但是有了自己的风格,还是更容易阅读代码。比如过evilor兄的《QQ游戏大厅的SX保护》代码读起来就很舒服,所以还是要养成一个良好的代码编写风格。

2012/3/24  revfish
2012-3-24 02:27
0
雪    币: 1516
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
加油好好学习天天向上
2012-3-24 03:07
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
楼主很努力,我的时间比较多更要努力
2012-3-24 08:59
0
雪    币: 48
活跃值: (61)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
建议太好了。
2012-3-24 13:15
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
唉,好久没有来了,时间总是不够用,怎么办呢? 再来又是新手,向你学习!
2012-3-24 13:26
0
游客
登录 | 注册 方可回帖
返回
//