能力值:
( LV2,RANK:10 )
|
-
-
26 楼
貌似很给力,但谁是刘涛涛?
|
能力值:
( LV4,RANK:50 )
|
-
-
27 楼
C与C++之别和ASM与C之别不一样,汇编能干的事,C未必能干,C++是C的扩展和提高,它们同属于“中级”语言,C能干的是C++都能干,而C++的某些特性用C来实现就有点麻烦(其实也能办到)
其实我对C的最大不满就是C的变量必须在block的开始定义,我喜欢C++的这种自由定义的做法。
对涛涛大神用C++替代C的建议深表赞同!
|
能力值:
( LV2,RANK:10 )
|
-
-
28 楼
为了做画圈的人,加油吧~~
语言只是工具~
又把士兵突击看完了一遍,想学里面的一句话~~~
不抛弃,不放弃!
|
能力值:
( LV4,RANK:50 )
|
-
-
29 楼
仔细看了您的帖子,对我帮助很大,谢谢。^_^
|
能力值:
( LV2,RANK:10 )
|
-
-
30 楼
学习编程就是一种抉择
支持下楼主
|
能力值:
( LV2,RANK:10 )
|
-
-
31 楼
膜拜一下,虽然看不懂!
|
能力值:
( LV2,RANK:10 )
|
-
-
32 楼
看了这篇文章,受益良多
|
能力值:
( LV3,RANK:30 )
|
-
-
33 楼
我觉得,首先呢,不管是哪种语言,应该专心的学习一种,你直觉上是感兴趣的。
在我理解,各种语言之间总有着千丝万缕的联系。
所以当你专心的学好一门语言之后,再去进行下一门的语言学习应该会比第一门更加顺利。
当然,如果你的脑袋是"双核"的话,,你也可以考虑,一起学两门三门了,混淆。
楼主,说的也不如道理,但是我们每个人的思维方式是不同的,
嗯,对于初级阶段的朋友们来说,我认为我的观点还是可取的。
|
能力值:
( LV2,RANK:10 )
|
-
-
34 楼
你考虑的是什么样的细节,也决定了你的层次。如果你考虑的是一行行的代码,那你是程序员。如果你考虑的是一个个模块,不同的模块之间如何联系,不同的模块交给不同的人做,那你是项目主管。如果你要考虑的是,公司要不要做这个项目,或一个项目完成哪些功能,那你是公司领导。
经典。。。唉,额还在考虑选择什么语言,真是连个程序员都不剩啊。
回家卖葱。。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
35 楼
给力好文...必须顶起来
|
能力值:
( LV2,RANK:10 )
|
-
-
36 楼
还是哥哥厉害啊,自己要进步学习啦
|
能力值:
( LV2,RANK:10 )
|
-
-
37 楼
好文章,正好解决了我最近一直纠结的一个问题,
力顶!!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
38 楼
传说中的神牛,转帖分享,以保留此贴连接地址
|
能力值:
( LV3,RANK:20 )
|
-
-
39 楼
用高效率写出优秀程序
|
能力值:
( LV9,RANK:250 )
|
-
-
40 楼
经典! 刘老师说的非常在理 强大的是人的逻辑和能力 工具只是帮我们完成某项任务的途径 就像从保定去北京飞机可能不是最佳选择一样 看完了顶起来 ~~
|
能力值:
( LV2,RANK:10 )
|
-
-
41 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
42 楼
我曾经梦想天开 什么都不会去看C++...不到几分钟 我睡着了
|
能力值:
( LV12,RANK:385 )
|
-
-
43 楼
比如我要骑马。我希望一拍马屁股就能走。不需要我考虑它先迈左脚还是右脚,不需要我分析怎么样保持不倒。
好像在保护模式的教程中,听说有个cpu的缓冲机制:段描述符高速缓冲寄存器,具体的描述,摘抄如下:
段描述符高速缓冲寄存器之内保存的描述符信息将一直保存到重新把选择子装载到段寄存器时再更新。程序员尽管不可见段描述符高速缓冲寄存器,但必须注意到它的存在和它的上述更新时机。例如,在改变了描述符表中的某个当前段的描述符后,也要更新对应的段描述符高速缓冲寄存器的内容,即使段选择子未作改变,这可通过重新装载段寄存器实现。
又听说有个国外的黑客,攻破了这个机制,所以结果呢?操作系统是控制不了它了。
本人感觉,马上有马垫与马蹬的是Masm程序员,
马后拉一个驾车,驾车里面坐的是c++程序员。
还有的人骑在马的侧面,电影与电视里面看过没有?在马的侧面射箭的。nasn,fasm等是也!
还有骑在马的脖子上的,掌握了骑马的精髓的是:tasm。
更有甚者,在马的下面,马腹下,那就是:rootkiter.
c/c++是正人君子,只能在政府的大道上行驶,有好多限制,当然战场上也有马车。
asm是英雄豪杰,驰骋天下,纵横无人之地。
说明,语言我首推:c++,但我不是研究语言的人,我是用语言研究操作系统与机器的人,所以我选择asm.
有一片文章说的好:我们说是程序员,我们更应该做一个研究员。no copyer!
错误与不足之处,敬请指导!
|
能力值:
( LV12,RANK:385 )
|
-
-
44 楼
记住,写驱动一定要用C++!
;一个汇编版的NDIS驱动程序模板(by mgf @2007.02.23)
; 写驱动程序已经很久了,但我一直用汇编来写驱动程序,原因是我不喜欢DDK,因为DDK和汇编一样,不是象VC,C#那样的“可视化”的开发工具,
;DDK和汇编一样看不见结构或对象的成员,也看不到各种函数的原型,这些东西和各种常量定义还必须去查看相关的包含文件,不仅如此,DDK还会
;“自作聪明”地把很多垃圾代码加到我的驱动里,虽然没有影响驱动程序的功能,但是还是不爽,不如直接用汇编,生成的驱动程序是什么样的自己
;心里有数。其实这也怪不得MS,它不想大家了解它的操作系统核心技术,但是又不得不开放一些技术细节给大家写驱动,所以只有提高门槛,搞出这
;么一个变态的DDK来吓走很多人,它的目的也就达到了,就是让尽可能少的人了解它的核心技术。能够跨过DDK这道槛的,必定不是一般的高手。呵呵!
; 很多书都建议写驱动最好不用汇编,因为写出来的程序不可移植,但是我不这么认为,因为现在90%的人写出的驱动都是在PC上运行的,没有必要
;为了这10%而放弃这么好的汇编语言。而且计算机都是相通的,如果你会写PC下的驱动了,再写MAC下的驱动不就容易多了吗?
; 这是一个标准的legacy驱动程序,虽然编译时用WDM的方法编译,它有Unload,Read,Write例程,而且还用NDIS HOOK来部分实现了防火墙的功能。
;NDIS HOOK技术被广泛应用于瑞星、江民、天网等众多流行的防火墙里,它的原理是使用NdisRegisterProtocol()注册假协议来获取系统的协议链地址,
;再搜索这个单向协议链,找到TCPIP协议的NDIS_OPEN_BLOCK(NDIS_BINDING_HANDLE)结构,里面就有TCPIP协议的各种派发函数地址,比如SEND在结构
;偏移30H的地方,RECV在结构偏移40H的地方,还有其他很多重要的函数地址都在这个表里。把表里的地址替换成我们的函数地址,就可以拦截操作系统
;收发的所有数据包了。本驱动只是实现了嗅探数据包的功能,还没有实现拦截恶意数据包的功能,如果想实现这个功能,在_Write函数、_mySend函数、
;_myRecv函数里加些代码,使它们配合完成拦截数据包的功能。本驱动如果IoAttachDevice其他驱动,可以改成过滤器;做些修改,还可以实现更多功能,
;可以用来过滤缓冲区溢出攻击包,也可以用来定制自己的SQL INJECTION防护网。
; 本驱动嗅探数据包的流程是这样的:当系统收发数据包时,被_mySend或_myRecv拦截,这两个函数就用NdisSetEvent()置位一个RING3事件(这个事
;件在DriverEntry里建立,在RING3里打开),这样在RING3应用层的WaitForSingleObject()因为事件被置位而返回,于是RING3代码用ReadFile()读取数
;据包的内容,判断是放行还是拦截,再用WriteFile来通知驱动做相应的操作。当然为了提高效率,不是每个数据包都提示RING3应用程序该不该放行,
;有些可以直接在RING0驱动里判断的就不必传到RING3去判断了。处于RING3的代码大概是这样的:
……
在WINDOWS 2000/XP/2003里进入RING0是很多人的梦想,但实现这个梦想并不容易,
因为基于NT内核的 WINDOWS 2000/XP/2003对自己保护得非常好,这与WINDOWS 9X
有很大不同,WINDOWS 9X的GDT,IDT,LDT等重要的系统表格是可以被RING3的代码
轻易修改的,因此在WINDOWS 9X里任何程序都可以在GDT,IDT,LDT里构造自己的
调用门/中断门/陷阱门而进入RING0。在WINDOWS 2000/XP/2003里似乎只有写驱动
才能进入RING0了,当然还可以利用系统漏洞进入RING0,本人就发现了2个漏洞可
进入RING0,但本文只讨论写驱动的方式。
现在介绍用汇编语言写普通WINDOWS应用程序的书也不少,用汇编语言写WINDOWS
程序的程序员也越来越多,但遗憾的是这些书介绍的程序都是运行在RING3上的,
我等技术追求者怎能受制于RING3而无所作为?为了写出令人惊叹的程序(比如病毒,
反病毒,防火墙等等),就必须要进入RING0。但是有关用汇编语言写WDM驱动程序
的书和例子非常少,我找到的绝大多数都是用C写的,而且编译也很麻烦,对于汇编
语言这种最适合写系统程序的语言来说是很遗憾的。为此我特意用我所知道的知识
写出本文,意在抛砖引玉,共同进步。
好了,先来看看下面的例子:
.586p
.model flat,stdcall
option casemap:none
.code
start:
nop
nop
nop
nop
pushfd
pushad
push edx
push dx
sgdt fword ptr [esp]
pop cx
pop edx
mov eax,edx
mov ecx,3e0h
.if dword ptr [edx+ecx+2]!=0ec0003e8h
mov byte ptr [edx],0c3h
mov word ptr [edx+ecx],ax
shr eax,16
mov word ptr [edx+ecx+6],ax
mov dword ptr [edx+ecx+2],0ec0003e8h
mov dword ptr [edx+ecx+8],0000ffffh
mov dword ptr [edx+ecx+12],00cf9a00h
.endif
popad
popfd
xor eax,eax
ret 8
end start
把以上的汇编代码保存到文件mywdm.asm,然后用MASM 6.14按照下面的方法编译:
ml /c /coff /Cp mywdm.asm
link /subsystem:windows /driver:wdm /release /out:mywdm.sys mywdm.obj
就会在当前目录下生成一个mywdm.sys文件,这是一个没有导入导出和资源的纯代码
驱动程序,非常短小精悍。如果导入了ntoskrnl.exe和hal.dll里的函数,或者导出
给别人调用的函数,它将是一个功能全面的WDM驱动。
mywdm.sys的功能是在GDT中创建一个3级调用门和一个0级32位代码段描述符,3级调用
门的选择子是3E3,0级32位代码段的选择子是3E8。
好了,现在执行mywdm.sys,但驱动程序是不能直接执行的,所以要构造它的执行环境。
先在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services中建立一个mywdm
子键,然后建立3个DWORD型的键值:
ErrorControl=0
Start=3 (如果Start=1,mywdm.sys会随电脑启动而自动装入)
Type=1
再把mywdm.sys复制到system32\drivers目录里,然后重新启动(好象不重新启动也可以,
对这个我不太清楚),运行net start mywdm,结果屏幕上显示:
“发生系统错误 1058。
无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动。”
如果你轻信微软的这句话的话,你就到此为止了!别被微软欺骗,因为我们的代码已经
执行过了,3级调用门和0级32位代码段描述符已经被建立在GDT中,而错误提示是在我们
的代码执行后弹出来的,此时不管是成功提示还是错误提示对我们来说都已太晚了。不信,
你可以用SOFT ICE看一看GDT就知道我所言不虚!如果Start=1,系统不会提示错误而运行
mywdm.sys。
好了,既然GDT中已经有了我们的调用门,那么意味着我们写的应用程序可以自由地在
RING3和RING0之间切换,但如何使用这个调用门还是有讲究的,它的使用方法是:
...
call 3e3:00000000 ;机器码 9A 00 00 00 00 E3 03
;此时已经进入RING0,CS=3E8,跟着要切换堆栈
mov eax,esp
mov esp,[esp+4]
push eax
;这里加入你要在RING0里执行的代码
;准备返回RING3
pop esp
push offset ring3
retf
ring3:
;此时回到RING3
...
为什么要切换堆栈?为什么要建立我们自己的0级32位代码段?直接使用操作系统的0级32位
代码段(选择子=8)不可以吗?在这里我要说明一下:WINDOWS 2000/XP/2003对自己保护得
非常好,就算普通应用程序能进入RING0,但还是在用户区(代码和数据的地址都小于80000000H),
所以WINDOWS 2000/XP/2003会认为是非法进入RING0的,就有可能产生页故障,表现是调用子程序
或访问内存时就会触发页故障,解决的方法是切换堆栈;不用操作系统的0级32位代码段(选择子
为8),用我们建立的0级32位代码段(选择子=3E8)。
本文例子生成的mywdm.sys大小是1536字节,如果你对PE文件很了解,可以手工给mywdm.sys减肥,
但要注意的是减肥后要把正确的CHECKSUM值填入PE头的CHECKSUM字段中,否则操作系统是不会装入
mywdm.sys执行的。我就把mywdm.sys减肥到只有368字节(只有DOS头,PE头+节表,60H字节的重定
位表和代码,应该是世界上最小的驱动程序了)。完全可以把这个只有368字节的驱动程序包含在
自己的程序中,在需要是把它还原到SYSTEM32\DRIVERS目录里。
计算CHECKSUM的方法是:把PE文件的所有字用ADC相加,然后得到的结果再和文件大小ADC相加,
这个结果就是CHECKSUM值。网上也可以找到计算CHECKSUM的工具。
请问:驱动加密,唯我扭曲变形的那个驱动多少kb?
听说asm的可以移植性性差!但我编写的程序还没有出现过这种情况.
请赐教!
|
能力值:
( LV12,RANK:385 )
|
-
-
45 楼
让我们每个人都努力拼搏,争取上位,做那个画圈的人。
划圈的那个人只有一个,(也许在编程行业中,我说错了)
但唐宋八大家,我们可以把他改写为唐宋九大家,历史上不缺你一个,也不多你一个人。
当然,kanxue,liutaotao,这等人物已经名垂青史了。
我的目标就是:97世界编程大赛第一名的那个程序。
我要写一段代码:100行左右,最多1000行,绝对不能超多10000行。
|
能力值:
( LV2,RANK:10 )
|
-
-
46 楼
对写程序来说,语言要选合适的,工具要选顺手的,目标是要解决问题,解决问题的方式有多种,就个人来说,不一定要写程序。
对于程序员的发展来说,在中国官本位至上的今天,还是早点改行,这样才有可能在高层次去画圈,在程序里面画得层次再高,也是程序猿。这也就是说在中国,很多公司所谓的双通道是假的,其实只有一条通道,大家都在往那挤,你不挤,自然会吃亏。
理想状态下,不同的岗位很难相互替代,一个多年不写代码的项目经理会丧失实现能力,一个不考虑细节的战略家如果没有实干家的支持只能河东狮吼,技术人员也好,项目主管也好,公司领导也好,在理想的条件下,每个岗位都需要专门的技术,并且不可相互替代,每种岗位,做到高深处,都是一门艺术,在所有岗位上的顶尖人才都应该有同样的社会地位以及经济地位,这样人类社会才能不变成一个权谋社会。本来应该不是思考的层次越高就越NB的,那么我要处理宇宙关系的话,就应该是最NB的了。
遗憾的是,在中国(其他地方的情况不了解),官本位的思想根深蒂固,社会的发展通道只有一条,而这套东西又自然而然地渗入到软件行业里。所以,如果你还在为学习什么语言而犹豫不绝的话,换个思路,看自己在这个社会里面更适合干什么,按照社会的运行规则,去干点更有前途的事业吧,不要被一些看似高深的理论忽悠。
|
能力值:
( LV2,RANK:10 )
|
-
-
47 楼
感谢涛哥的指点,只不过那个画圈的人,却不是人人能做的...
|
能力值:
( LV2,RANK:10 )
|
-
-
48 楼
获益良多....
收藏!!
但有个问题,真的是“涛哥”??
|
|
|