零基础想要学习电脑的学编程需要什么基础,能写木马程序等。

有一家饭店的大厨,烧得一手好菜,经过口碑相传,客人从五湖四海闻名而来。然而这对饭店的老板来说,并不单纯是一个好消息。因为客人不是奔着饭店,而是奔着大厨的手艺来的。老板必须想办法留住这位大厨,否则他一旦被别人挖走,饭店的生意就会一落千丈了。然而即便老板不惜血本保证了大厨的忠诚度,风险也依然存在:

大厨休息或请假的时候,菜品的口味就无法让顾客满意;

大厨只有一个,如果想在多个地方开分店,那口味也就不能保证了;

大厨再厉害,同时也只能炒一个菜,而顾客越来越多,输出总是供不应求;

大厨年纪大了总是要退休的,如果收徒的话,怎么继续保证徒弟的忠诚度呢?

有一天,老板突然悟到,决定菜品口味的是大厨烧菜的过程,而不是大厨本人。如果大厨愿意把自己每个菜的菜谱都写出来,那不就可以请别的厨师来操作了吗?虽然别人按照菜谱烧出来可能达不到原味的100分,但90分总是能达到的,而这样的差距是一般的食客无法分辨的。这样只要菜谱在,饭店菜品的质量就能得到保证,扩张店面、开分店什么的就都不成问题了。

于是老板和大厨谈了一个晚上,说服了他把菜谱写出来,然后用菜谱技术入股分成。于是大厨一边炒菜一边讲解,让助手把菜谱记下来,交给了老板。老板于是请别的厨师拿着菜谱如发炮制,大厨验收并指导修改菜谱,如此这般数次之后,菜谱就定稿了。

几年后,饭店生意越来越好,开了无数家分店,老板赚了很多钱,大厨也得到丰厚的分成,不用再天天靠手艺吃饭了。后来有一位厨师把菜谱偷传了出去,于是这道菜就红遍了大江南北……

故事讲完了,你有什么收获吗?

在洗衣机出现之前,人们只能用手来洗衣服,需要经过浸泡、揉搓、漂洗、拧干的一系列流程。而全自动洗衣机的发明使洗衣服的工作人人都可以轻松完成,从而可以将原本用来洗衣服的时间解放出来去做其他事情。随着洗衣机的不断迭代升级,洗衣服的整个流程最终会被人们遗忘,只有设计洗衣机的工程师们了解流程,因为他们负责对其进行优化和改进。

大厨炒菜的过程,和洗衣服的工序,都是流程。什么是流程呢?流程就是为了实现一个需求而设计的形式逻辑。而程序就是* 记录并承载流程的媒介*。记载炒菜流程的菜谱,和洗衣机主控芯片里记录了洗衣工序的软件,都是程序。不同的是,菜谱由人来执行,而洗衣工序由机器来执行。

我们可以再举几个例子:

  • 打太极拳的套路流程,而记录这些套路的拳谱程序
  • 用钢琴弹奏曲子的指法流程,而记录这些指法的钢琴谱程序
  • 老师备课时设计的教学过程流程,而记录这些过程的教案程序

将炒菜的过程写成菜谱,就是在编写程序,也就是编程。如果你曾经记录过类似流程的东西,没准可能是作息时间表(记录了每天必做事件的顺序列表)或者交通路线图(记录了去某地的行程),那么其实你已经在编程了。

所以,编程真的没有那么神秘,对吧?

通过编程,我们更加透彻地理解并阐述了事物的本质,让曾经专属于某个人、某个团体、某个地方甚至某个时刻的东西,得以独立的存在和发展。虽然程序的执行效果未必能让其设计者满意,但它已经可以脱离设计者而存在,可以被其他人执行、验证和改进。从这个角度来讲,说编程是在创造生命也不为过。

编程可以说是一种标准化的写作。标准化保证了服务和产品的质量,也使大规模复制和扩张成为可能。KFC正是依赖其详尽到炸薯条的油温秒数的食品加工手册,才将分店开满世界各地的。陶华碧如果不能将她的豆瓣酱配方和制作过程清楚地描述出来,交由标准化生产线去制造的话,那么今天“老干妈”最多只是一个小乡村里的作坊级产品,不可能走上我们的餐桌。

我们每天的生活,都在和各种技术产品和服务打交道,比如导航、搜索引擎、聊天软件……你可曾想过,这些产品和服务背后的原理是什么?相信除了程序员群体之外,绝大多数人不会去想这些问题,因为:

这跟我没有关系啊!我又不去干这行……

应该只有专业人士才能搞懂吧,我可不行!

能用就行了,想那么多干啥,多累呀!

他们这么想并没有错,因为**编程的本质就是:设计一个逻辑流程来实现指定的需求,使调用者无需了解实现细节即可达到目的。 **

由于程序和编程的广义概念太过笼统,为不导致概念混淆,下文中提到的“程序”和“编程”,特指使用计算机编程语言编写,由机器来运行的程序。

假设你已经在某岗位工作了一段时间,根据经验总结出来每天下班前有下面三件事需要做:

A、在公司内网系统查询某业务当天的数据(约10分钟)

B、整理成日报表并存档(约15分钟)

C、把几个核心数据用电子邮件发送给领导(约5分钟)

你可以在认真梳理过之后,将这个流程写下来,贴在办公桌前,或者记在脑子里。这自然比那些不知道流程的人要强得多,你可以确保每个步骤都不被遗漏地执行到(然而这并不能完全保证)。虽然你已经花了时间认真思考过,但每天这样枯燥乏味的流程都需要自己执行一遍……等等,这活我不可以找个秘书来干吗?

当然可以,雇佣他人是一种用金钱换时间的解决方案。但是这同时又引入了许多新的问题:

你需要把要做的事解释给秘书听,并确保他能听懂(沟通成本)

秘书下班或休假时,这些事你还得自己做(有时间限制)

你要为秘书犯的错误承担责任(质量得不到保证)

每次秘书犯了错误,你都需要进行教育(培训成本)

秘书会直接接触业务数据和信息,难保有泄密的可能(安全隐患)

换一个秘书,以上的事情都得再来一遍……

这不是把事情搞复杂了吗?人的成本太高,提供的服务又不可靠。而如果你会编程的话,也许你可以:

编一个小程序来完成查数据、做报表、发邮件的流程,再配置一个定时任务每天自动执行;

谨慎一点的话,可以让程序先发到自己的邮箱,检查没有问题后再转发给领导;

必要的话,还可以让程序在运行出现意外时给你的邮箱或手机发报警通知;

如果你愿意,甚至可以给内网办公系统直接加上邮件报表这个功能……

假设你原本手工做完ABC流程需要30分钟,那么你的程序每执行一次,就为你节省了30分钟的时间。假如你写程序用了三个小时,那么一周就能收回成本,以后全部都是净赚的。如果程序运行的时间足够长,那么单次运行的均摊成本将趋近于零。可以看出,编程是一种用时间换时间的解决方案。

当然,你需要将要做的流程写成机器能读懂的程序;如果需求发生变化,你需要对应地修改程序;如果运行时出了BUG,你需要调试修复……但更重要的是:程序不拿工资,不可能辞职,不需要休息,不会闹情绪,不可能犯错,只要你的流程正确,依赖的资源不出问题,它就可以724小时一直运转下去。*

每当我们写程序实现了一个需求,就好比造出了一把锤子。今后你遇到类似的问题,都可以拿这个锤子来解决。当然有时会遇到锤子不称手的情况,需要持续地升级和优化。但在大多数情况下,这个锤子都是可以直接拿来用的。也就是说:完全相同的问题,你只需要解决一次就好,不会浪费时间在重复的工作上。

通过编程,你可以将那些枯燥无味的重复性工作中的部分甚至全部,交由机器来接管,这样就可以将你的时间和注意力从具体的事务中解放出来,去做更有价值的事情。比如研究和优化工作流程,或者陪伴家人,又或者去读一本书……

喜欢网游的朋友可能都知道外挂这东西,这是指和游戏一起运行、为了提升游戏体验的小程序。外挂一般分为两类:一是在游戏系统框架内简化玩家操作的辅助性外挂,提供如自动拾取、自动打怪、改键之类的功能;二是利用游戏漏洞营造不平等的作弊性外挂,提供如开图、加速、无敌之类的功能。

随着游戏行业的迅猛发展,现今很多网游都已经配备了原本由辅助性外挂提供的功能,辅助性外挂正在逐渐消亡,只剩下作弊性外挂和衍生的一系列黑色产业链,你懂得。

当我们说某个人“开挂”时,其实是在说他的表现(数量、速度、精确度……)明显超出正常的范畴。当原始土著人碰到使用着各种科技产品的现代人时,大概就是一种“**,这哥们开挂了吧?”的感觉。

要知道,身体并不强壮的人类之所以能征服地球,就是因为我们会创造并使用工具来突破生理的局限,做到原本不可能做到的事情。在即将到来的全信息时代,编程将是创造工具,甚至使用工具的主要方法。我们天天都在使用的软件和APP,不管是文字处理,K歌软件还是搜索引擎,都已经和我们的生活融为一体,成为我们生命的延伸。通过使用这些软件,我们可以不断突破自己经验和能力上的局限,我们随时都在给自己“开挂”。

然而大多数人都是在被动地等待别人来满足自己的需求。他们会使用通过朋友推荐、广告宣传等各种渠道推送给自己的软件,然后感慨一下:“哇,居然还可以这样!”他们只会使用已有软件提供的标准功能,而一些个性化的特殊需求就只能因为软件不支持放弃掉了。这就和穿衣服一样,大多数人只会买标准尺寸穿,如果这里紧那里松,这里长那里短,也就只能忍了。

还有少部分人会主动考虑如何去满足自己的特殊需求。他们会想:“如果有XXX功能就好了……”他们会主动去寻找能满足自己需求的软件,研究软件的个性化配置,或者给软件的开发者提功能建议。同样,追求个性的人可能会找裁缝为自己量身订做或者修改衣服,使其尽可能地适合自己。

只有极少数的人有能力自己去实现那些别人不能满足的需求。他们能在原有软件的基础上开发插件,对软件进行二次开发,甚至写出一个全新的软件。同样,追求完美的人可能会亲自设计衣服,并把一件衣服不停地改来改去,直到自己彻底满意为止。

如果说学好英语能为你的世界打开一扇门,让你拥有更多的选择的话;那么学好编程就能让你有机会以“上帝视角”来认识和改造这个世界,并拥有几乎无限的可能性。因为在现实中的一切最终都会被信息化,而你可以通过编程来对信息做任何形式的加工和处理,只要你想得到,就能做得到。

你想体验“开挂”的人生吗?那就赶紧开始学编程吧。

每个人都应该学习编程,因为它将教会你如何思考。——苹果创始人 乔布斯 [1]

思考,是人之所以为人的行为,而编程是一种对人的思考进行再思考的行为。我们不需要把每件事情想清楚,就可以在现实社会中生存。对某些从事机械性操作的职业来说,甚至完全不需要进行思考。然而在编程时,我们只有在想清楚之后,才能把程序写出来。在编写正确、高效、优雅的程序的同时,我们也在塑造自己的大脑,让它能思考得更清楚、运转得更高效。

编程要求我们客观地去思考事物的本质,将注意力放在事物本身,而不是事物与我们的关系上。当古代的妇女在河边洗脏衣服时,她可能在想:“河水好冷啊……这衣服颜色真漂亮……我家孩子为啥这么调皮……”而当我们在为洗衣机设计程序时,只会想:“哦,这有一堆脏衣服需要洗”。其实很多原本困扰你许久的问题,只要跳出“我”的范畴,进行“忘我”的思考,就变得特别简单和容易解决。

编程是将人的想法“实体化”的过程,这要求我们进行更深入、更细致、更全面地思考。为了实现一个需求,你必须对其原理和运转流程了解得十分透彻,否则就无法用编程语言精确地描述出来让机器去执行。在实体化的过程中,想法的结构缺陷和逻辑漏洞会自然凸显出来,你总会发现存在没有考虑到的可能性,以及需要进一步思考的细节。

编程要求我们能够对事物和流程进行各种维度上的拆分,并在不同的抽象层次上进行完整自洽的思考,这使我们有可能去解决那些规模无比庞大的问题。通过在抽象层次上的划分,我们能做到在宏观上考虑整体的同时,也能在微观上考虑每个细节。经过合理拆分后的细粒度需求简单明了,更适合团队协作,其成果还可以在不同场景下进行复用。在一个成熟的软件或互联网公司,上千名工程师一起开发同一款产品是很常见的,而这种协作的规模除了行为艺术以外,几乎是不可想象的。

编程是不断解决问题的过程,也是不断完善解决问题的方法论的过程。一个优秀的程序员总是解决问题的高手。在编程的各个阶段(需求定义、方案设计、编码实现、调试纠错……)中,都将面临无穷无尽的问题。这个问题要不要解决?什么时候解决?其根源是什么?需要考虑哪些方面?如何做取舍?有哪些方案可供选择?选择的原则是什么?……解决问题的方法论展开来讲可以写一本书了,且容我有时间另撰一文来表。

半个世纪以前,美国有70%的人口在农场工作;随着自动化耕种的大面积普及,现在只剩下不到1%。 ——凯文.凯利《必然》

从登陆月球到生产纳米机器人,我们已经通过设计并使用各种机器完成了人类原本不可能亲手做到的各种事情。迄今为止,人类从事的简单重复性的工作(如洗衣、耕种、制造等)已经几乎完全被机器接管,人类的工作方向已经转向对机器的研发和维护。而那些需要复杂知识和精密操作的工作(比如驾驶汽车、外科手术等)也正在被机器逐步接管。

洗衣机解放了家庭主妇们的双手,全自动流水线则解雇了工厂里的大部分工人。只有在一些正享受人口红利的发展中国家(比如中国和印度),由于技术引入成本比人工成本高,目前体力劳动者还有一些生存的空间。但技术的成本会不可阻挡地快速持续下降,而人口红利的窗口期将快速消失,拐点很快就会到来。

资本是具有意志的,且不为人性所改变。当产出的质量不变,而技术的成本显著低于人工成本时,几乎所有的体力劳动者都会失业。机器不知疲倦,不会抱怨,干得比人又快又好又省钱,人类怎么可能和机器竞争?

与此同时,人工智能正在将逐渐接管人类的简单重复性思考活动(如寻路、翻译等),人类只需要下达命令、制定原则和做出选择即可。人工智能甚至已经进入了那些被人们认为是“人之所以为人”的领域:写作、编曲、绘画……

Google的AlphaGo战胜李世石是一个里程碑式的事件,它证明了人工智能已经可以在人类最擅长的思考领域超越人类。现在最优秀的棋手都在向AI学习下棋,职业棋手和AI进行日常训练成了常态。纯机比纯人强,人机比纯机强,这早已是棋界的共识。

当人工智能在某个思考领域的能力接近或超过人类(这在很多领域已经做到了 )时,而其成本极其低廉(这是早晚的事)时,在资本意志的作用下,这个领域就会将不可逆地被人工智能迅速占领。我们今天已经习惯了使用计算器来取代大脑进行数字计算,在不远的将来,我们也会习惯将原本需要自己思考的许多问题交给由无数程序组成的人工智能来处理。在可以预见的未来,所有构建在经验和技能基础上的非创造性工作岗位都会消失,人类的工作方向会转变成对人工智能的研发和维护。

人工智能全面普及的时代正在以光一样的速度向我们飞奔,可能下一秒就将我们远远地甩在身后,连车尾灯都看不到。届时,几乎所有的工作都将和人工智能密不可分。只有那些理解人工智能,能够很好地和人工智能合作,并帮助改进人工智能的人,才能在那个时代更好地生存下去。

每个人都应该尽早开始学习编程,我的孩子起步太晚了,我觉得应该在教他们ABC和颜色的时候就开始。——美国第44任总统 奥巴马 [2]

在《未来我们该学什么语言?》一文中,我曾畅想过未来可能出现的脑接口技术,以及与之配套的人机共用结构化语言。届时我们的大脑将直接接入互联网和人工智能,可以瞬间将需要的知识和信息下载到大脑中……我们将成为神一样的存在。但前提是你必须具备编程基础,才能享用这一革命性技术带来的成果。

什么,那时候你还没学会编程?可以洗洗睡了。

可是我又不准备当程序员啊,有必要学编程吗?

你可能会开车,还是个老司机,很会享受驾驶的乐趣,但你未必愿意去当一名出租车司机吧?同理,学习编程不一定非要做程序员,但却能使你拥有全新的视角、深入的思维方式和效率优化的思维,这都将成为你重要的软实力。在不久的将来,编程将会变成像英语、驾驶一样人人必备的技能。到那时,你希望自己是一名老司机,还是搭车族呢?

“学这个有用吗?”其实是一个很可怕的想法。由于很多东西现在看起来并没有什么用,大多数人就放弃了学习,而只有少数人会抱着“学学看能有什么用”的念头去尝试。在之后的某一天,真正需要这项技能和知识时,那些选择放弃的人只能感慨“要是当时……就好了!”,而选择学习的人则会惊喜地发现“哇,原来还能用在这里!”……所谓的“惊喜”和“运气”其实就是这样一回事:在不知不觉间,已经提前做好了准备。

那我能不能现在努力赚钱,然后雇一个专业的程序员呢?

不错,你是可以找一个程序员来实现你的想法,但我们之前请秘书时遇到的诸多问题又会接踵而来。更重要的是,如果你不会编程,你可能连个靠谱沾边的想法都提不出来。就好比没有见过汽车的人,只会想着让别人为他造一辆更快的马车。只有在理解了某个事物的原理之后,这个事物的概念才能在你的脑中清晰起来,才能真正融入你的认知结构中。

有了清晰的概念,你才能对其进行思考,判断它能够用来做什么,不能做什么。如果概念不清晰,你甚至都无法讲清楚自己的需求,更难和程序员进行沟通和合作。每一位程序员在面对“给我做一个淘宝”这样的需求时,都会崩溃的。

我的英语很烂,能学会编程吗?

英语不是学习编程的瓶颈,关键在于理解其概念和原理,以及改变思维方式。虽然几乎所有编程语言的关键字都是英语,但常用的关键字也就那么几个,热门语言的相关书籍也都有译版。如果你愿意的话,甚至可以用中文来给程序里的变量、函数和类命名。正如只要你认得start / save / load / quit这几个单词,就能去玩英文游戏;只要会说sorry和how much,就能去国外旅游一样。

我已经工作好多年了,现在开始学还来得及吗?该从什么地方开始?

任何时候开始都不晚,当然越早越好。中国第一款杀毒软件KV300的作者王江民,就是38岁才开始学习编程的。至于应该怎么学,从哪里开始,这将是我今年的主要思考方向,敬请期待我的后续系列文章。也许你可以先试试这些网站:

:通过玩游戏来启蒙,有中文版,适合初学者

:纯英文视频讲解教学,适合学霸和笔记党

:交互式实战,效果最佳,但需有一定基础

曾经何时,想要建立一个网站服务,需要购买动辙数万元的专业服务器,支付昂贵的机房托管和带宽租赁费用,聘请专业的开发人才或团队来研发,再通过广告和运营活动去拉拢用户……门槛如此之高,使绝大多数人望而却步,只有企业才能负担得起。

而现如今,云服务器甚至比家里的宽带都便宜了,各种开源技术唾手可得,各种开放平台提供了免费的用户和渠道,一个APP通过社交网络可能瞬间火遍全国……有了树莓派这样超便宜的卡片电脑,再加上现在各种家电都在向智能化发展,想通过编程在实现自己的一些小创意,真是不要太简单。

我们正身处一个只要愿意思考,就能改变世界的时代。那么你是愿意去改变世界,还是等待被世界改变呢?

}

你是否曾经在用别人开发的工具尝试“入侵”.你是否希望开发出自己的黑器……相信很多人有着这种近似相同的经历。本章将简单介绍黑客编程及工具开发。如果你是初学编程,如果你从来没有接触过黑客软件的开发,如果你急于想了解黑客编程方面的知识……那么就请继续往下阅读。

编程语言和开发环境的选择

初学者刚开始学习编程语言最头疼的问题就是如何选择编程语言及合适的开发环境,下面就来具体介绍一下。

有人认为学编程就是学编程语言,而vc、VB这样的开发环境只是工具,不需要学。这个想法是错误的,因为开发环境提供了很多开发工具,如vc这个集成开发环境就提供了与之对应的PSDK、MFC等。除了语言以外,要开发特定的软件是需要开发包和开发工具支持的。况且,编程语言也是一种工具,用于和计算机进行交流的工具。所以我们既要学习编程语言,也要学习开发工具。

对于选择哪种编程语言或者开发环境其实也没有特定的标准。有这样一句话,“真正的程序员用vc,聪明的程序员用Delphi,用VB的不是程序员”。笔者却并不这么认为,因为在很多编程的书籍上常常这样提醒并告诫学习者,编程的精髓是“算法”,而语言是用来描述算法的。因此,大家也不必因为无法选择而无从下手。

黑客一般都掌握多种编程语言,他们不但掌握着与底层相关的如汇编、C之类的编程语言,而且还掌握很多脚本语言,如Python、Perl、Ruby .......很多黑客在发现ODay以后用Perl或者Python来写POC; MSF使用的是Ruby来进行开发Exploit;有的黑客在反病毒时竟然写个批处理就搞定了……对于黑客来说,一切语言都是服务于自己的思想的,只要能快速实现自己的想法,能完成自己所要完成的功能就行,从不拘泥于任何语言和工具。在网上有很多学习不同编程语言的人们之间经常互相攻击,这其实是一种极端的行为,大家还是理性地对待这些问题比较好。

前面说了这么多,仿佛是在绕圈子,一直没有介绍到底应该选择什么编程语言和开发环境。我们这里选择使用c语言作为黑客编程的学习语言,选择VC6(Visual C++ 6.0的缩写)来作为我们的开发环境。VS 6 h相对于Visual Studi0 2005、VisuaJ Studi0 2008和Visual Studio2010之类的开发环境来说要小巧很多,当前是可以满足我们的开发需求的。选择C语言的原因是由下Windows的API都是用C语言定义的,相对于使用其他编程语言会方便很多。笔者认为在VB下使用API就非常不方便,尤其是涉及指针这个概念的时候。除了VC6以外,还需要下载新版的PSDK,因为VC6中包含的PSDK过于旧,有些新的API我们无法通过包含头文件而直接使用,因此这个也是必须的。

既然选择vC作为开发环境,那么先来了解一下 vc开发环境中今后会用到的一些工具的概念,这些概念都相对比较简单,常见的概念育SDK、Api和MFC。

SDK是Sofiware Develop Kits的缩写,即软件开发工具包。SDK是一个泛指,比如对视频采集卡进行二次开发,那么视频采集卡会提供SDK;再比如对动态令牌进行二次开发,那么动态令牌也会提供SDK。操作系统为了程序员在其平台下开发应用程序也会提供SDK,我们对系统提供的开发包称之为PSDK。PSDK是Platform SDK的意思,也就是平台SDK。对于我们来说,平台就是Windows操作系统。Windows下的PSDK包含了进行Windows软件开发的文档和API函数的输入库、头文件等一些与Windows开发相关的工具。PSDK是一个单独的开发包,不过每个不同版本的vc和其他一些开发环境中也已经包含了它。API是Application Programnung Interface的缩写,即应用程序接口。不同的SDK提供不同的API。PSDK提供的API就是操作系统提供的开发应用程序的接口.比如Windows系统下删除文件的APl函数是DeleteFile();再比如Windows系统下移动文件的API函数是MoveFile(),而其他一些供二次开发的SDK中附带的API,也是为了进行开发应用程序而提供的接口。

MFC是Microso:R Foundation Class的缩写,即微软基础类库。它是微软为了简化程序员的开发工作量所提供的基于c++类的一套面向对象的库,它封装了常见的API函数,使得开发较为方便。

我们在书中会用到API进行开发,也会使用MFC进行开发。不过对于MFC的使用,基本上用在与界面相关的部分,一般是简单地带过,不会进行过多的讨论。我们的重点是放在API函数的使用上。关于MFC的相关内容,还请大家自行参考学习。

SDK和VC6互相是独立的,不需要安装在同一个目录下.根据自己的实际情况安装就可以了。在安装好VC6和新版的SDK后,需要在VC6中进行相应的设置才能使用新版的SDK.否则VC6仍然使用其自带的旧的SDK。SDK和VC6的安装步骤这里就不介绍了(提示:请把VC6安装完整,VC6会提供一些代码,对我们的学习是非常有帮助的).下面介绍新版的SDK如何配置才能在VC6中使用。启动VC6,单击菜单“Tools”->“Options”命令,打开“Options”对话框,如图1-1

切记要把所添加的目录放到列表的最上边,因为在VC编辑代码的时候会搜索这些目录里的文件,如果随便放,编译器会因为找不到相关的API函数定义而报函数未定义的错误。

network。他是微软开发的联机帮助文档,可以帮助我们在使用API的时候进行快速的查阅,以方便我们对API的使用和理解,但是MSDN里面的内容全部都是英文的,如果你英文不是太好的话可以借助搜索引擎来学习API的使用,本书只对所提到的API函数常用的参数进行介绍,其他参数需要大家自行进行学习。

在开发程序的过程中,除了编码以外还需要对程序进行调试,当编写的程序出现问题后就要对程序进行调试,调试不是仅仅使用一个printf()或者MessageBox()进行简单的输出来观察某个函数的返回值,也不是对某个变量,某一时间的具体值的输出,调试是由专业的调试分析工具的,VC6不但提供代码编辑,代码编译、编译连接等功能,还提供了一个非常好用的调试工具,在编写完代码后,如果程序输出的结构是未知的,或者是没有预测到的,都可以通过调试来对代码的逻辑进行分析,以找到问题的所在,掌握调试的技能,对软件的开发有非常大的帮助。掌握好的调试工具,对于调试者的来说,也同样会起到事半功倍的作用,下面通过一个简单的例子了解一下VC6提供的调试功能吧。

下面介绍用VC6写一个控制台板的Helloworld来学习VC6的开发,也许大家日内这个程序很简单,但是请记住,我们的重点是要介绍VC6这个集成开发环境中提供的调试功能。

单击OK按钮,出现如图1-5所示的窗口。

选择AN empty project单选项,单击finish按钮,然后再弹出的对话框中单击OK按钮


单击OK按钮就可以进行代码编辑了。

在代码编辑处录入如下代码:

按F7键进行编译链接,按Ctel+F5组合键进行运行,如图1-7所示。

这就是我们值得纪念的第一个程序,这个程序很简单,有C语言基础的读者应该都是能看懂的,这里我就不进行介绍了,如果看不懂,请先找本关于C语言入门的书本来看一下吧。

用VC6调试第一个程序

现在来学习如何使用VC6对第一个程序进行调试,在代码编辑状态下,按下键盘上的F10键,进入调试状态,如图1-8所示。

常用的调试窗口有两个,一个是Watch窗口,一个是Memory窗口,打开Watch窗口的方法是单击View→Debug windows→watch命令打开,打开Memory窗口的方法是单击View→debugwindows→memory命令打开,watch窗口用来监视我们感兴趣的变量,而当我们有时无法通过变量的值进行判断时候,就需要借助memory窗口的值,比如,指针的值来进行判断。


Call stack窗口是调用栈窗口,该窗口可以很方便的查看调用关系,很容易通过调用栈来找到上层,上上层的调用者,另外,也可以通过调用栈来定位错误,比如,有时程序会崩溃,但是发生崩溃的地方确实在系统提供的代码中,而不再我们编写的代码中,这种错误在通常情况下是我们的程序对于参数的输入有误造成的,我们可以通过调用栈查看是谁调用了该函数,以便进行进一步的分析。

Register窗口对用来观察寄存器的,有时需要观察返回值或者参数。

Disassembiy窗口是用来观察C代码对应的反汇编代码的,有时候在看C的代码无法解决的问题时候,需要查看在底层实现时候分析程序的问题。

以上就是VC6下常用的调试窗口,可根据实际情况使用,并不是每次调试都会用到这些窗口,下面在简单介绍一下常用的调试快捷键,以方便今后进行调试时使用。

VC6调试时候的常用快捷键如下。

F9键:设定端点/取消端点

F10键:单步步过,依次执行每一条代码。

F11键:单步步入,依次执行每一条代码,遇到函数调用时候则进入到被调用的函数中。

在后面的章节中我们会用到这些快捷键来调试程序,让大家在学习的过程中真正的应用起这些调试功能。

专业的应用程序调试工具——OllyDbg

OllyDbg简称OD。是专业的应用程序调试工具,接触过破解,或者做过外挂开发的读者一定对这款工具不陌生,在这里,简单介绍一下这款工具。

让我们先看看他的界面吧。如图1-12所示


OD的大多数情况是在没有源代码的情况下对软件进行调试的,也许没有源代码也就不叫调试了,而叫做动态分析。OD的主界面中有6个主要的窗口。分别是反汇编窗口、寄存器窗口。提示信息窗口、数据窗口(也叫转存窗口)、栈密口和命令提示窗口。

下面逐个允绍一下各个窗口的作用。

(1)反汇编窗口:这是调试鼓动态分析时的主要窗口,我们主要是针对软件的功能实现一进行分析,因此主要需查看的就是反汇编窗口的内容。

(2)寄存器窗口:该窗口的作用是实时地显示寄存器的变化情况。寄存器也可以反映代码的执行情况。例如,我们常常查看返回值的eax的值。

( 3)提示信息窗口:这里往往会显示一些内存地址的值、寄存器的值、调用方的地址等信息。

(4)数据窗口:该窗口主要是用来显示数据的,单击右键可以把数据按照不同的方式进行解析,对于我们分析程序的过程是非常有用的。

(5)栈窗口:该窗口可以用来查看函数调用时参数的值。

(6)命令提示窗口:该窗口是用来输入调试命令的。

OD调试时的常用快捷键如下。

F8键:单步步过,依次执行每一条代码。

F7键:单步步入,依次执行每一条代码,遇到函数调用时则进入到被调用的函数中。

F4键:执行到选中的代码处(前提条件是该条代码在程序的流程中一定会被执行到)。

OD的介绍到此为止,在后面的内容中我们会再次提到OD,到那时会有一定的机会练习使用OD。如果有对OD感兴趣的读者,请另行阅读其他书籍。

下面介绍一些在黑客编程中会用到的API函数.尽量排一点简单易用的函数,用简单的几行代码来完成一定的功能.希望大家能在这里体会到编程乐趣。不至于被大段的代码影响了自己前进的心情。

复制自身程序到Windows目录和系统目录下

一般的病毒木马都有这种类似的功能,完成这个功能其实并不复杂,我们来拆解思考一下实现这段代码的步骤。

复制是一个拷贝的过程。既然是拷贝,就要知道拷贝的原位置和目的位置。也就是整个过程其实分3步,首先要得到自身程序所在的路径,然后获想Windows目录和系统目录,最后分别拷贝自身程序到这两个日录中。这3个步骤要如何完成,下面我们来看看完成这些功能的AII函数。

获得自身程序所在路径的API函数的定义:


该函数有3个参数,分别如下。

(1)Hmodale:该参数在获得自身程序时使用为Nuel。

(2)lpfilename:该参数指定一个字符型的缓冲区,用于保存程序自身所在的路径。

(3)ndize:该参数指定缓冲区的大小


该函数有两个参数,分别如下。

(1)lpbuffer:该参数指定一个字符型的缓冲区,用于保存Windows目录的路径。

(2)usize:该参数指定缓冲区的大小。

获得系统目录的api函数的含义。


该函数有两个参数,分别如下:

(1)lpbuffer:该参数指定一个字符型的缓冲区,用于保存windows目录的路径。

(2)usize:该参数指定缓冲区的大小。

拷贝文件的API函数的定义:


该函数有3个参数,分别如下。

(1)lpexistingfilename:该参数指向一个已经存在的文件的路径,即原文件路径。

(2)lpNewFilrName:该参数指向一个新的文件的位置,即欲拷贝到的文件的目的路径。

(3)bFaillfExists:该参数是一个布尔型参数,如果参数为TRUE,若目的文件已经存在则返回,复制失败,如果参数为FALSE,若目的文件已经存在则强行覆盖原有的文件。

需要使用的API函数已经介绍完了,下面就来真正完成这个复制自身程序到Windows目录和系统目录下的程序,代码如下:


该函数需要包含Windows.h这个头文件,也就是在该段程序的最开始处加一句:

了解一个系统相关信息也是一项比较重要的内容,强大的扫描软件Nmap在对目标主机进行扫描时,也能对目标主机的系统等信息进行识别,真的是根强大。这里简单地获取一些与系统相关的信息,主要获取的内容有操作系统的版本、操作系统的名字及当前登录的用户名称。接下来逐个介绍这些API函数。

(1)获取操作系统版本代码如下:

该函数就一个参数,这个参数是指向一个OSVERSl01NFO结构的指针。看一下OSVERSIONINFO这个结构体。

(2)获取计算机名称代码如下:


该函数有两个参数,介绍如下。

(2)1pNSize:保存缓冲区的长度,该参数是一个输入,输出参数。

(3)获取当前用户名称代码如下:


该函数有两个参数,介绍如下。

(1)lpBuffer:保存当前用户名称的缓冲区。

(2)nSize:保存缓冲区的长度,该参数是一个输入/输出参数。

我们封装一个简单的函数来获取系统的这3个信息,代码如下:


这个程序完成了我们想要的功能,对于编程的部分就介绍到这里。下面介绍Debug和Release方面的内容。

关于获取系统信息的程序,我们编写完成了,也编译连接并运行过了。找到刚才编译的程序,查看一下下它的文件大小,如图1-14所示。

从图l-14中可以看出,该程序竟然有153KB大小。是不是很惊人?我们一共写了不过十几行代码,但是却生成了如此大体积的程序,这是为什么呢?因为代码默认编译连接是Debug版本的,如图1-15所示。

从图I-15中可以看出,我们的代码是由Debug方式编译的。Debug被称为调试版本,在这种方式的编译下,可执行程序中会附带很多和调试相关的数据或代码,而且不做任何的优化,以此为开发人员提供大量的调试信息,从而方便了程序的调试工作。除了Debug方式编译以外,还有一种方式是Release方式编译,单击“Win32 Debug”右边的下拉箭头可以选择“Win32

Release方式被称作发布版本,是为最终用户使用的,这种方式对伐码做了大量的优化工作,不再包含与调试相关的信息,从而使程序的运行效率更高,体积更小,如图1-17所示。

从图1-17可以看出,两个程序的文件大小发生了截然不同的变化。因此,当我们自己写程序调试时,应该使用调试版,以方便我们对程序进行调试。当我们的程序已经调试完毕,那么可以使用发布版来与大家进行交流。

很多时候,我们都需要查看函数的定义,而函数的定义都在SDK的头文件中。虽然从MSDN中也能找到函数的定义,但是还是有略微的不同,而且对于查找自定义函数的函数定义也是很方便的。

回到我们的代码当中,随便选中一个API函数,比如GetComputerName0这个函数。加入要查看该函数的定义应该如何查看呢?我们在GetComputerName0这个函数上单击鼠标右键,在弹出的快捷菜单上选择“GeToDefinitionOfGetComputerName”(到GetComputerName函数的定义处)命令,如图1-18所示。当选择“Go

从图1-20中可以看出,GetcompuerName是一个宏,其对应的函数为Getcompuernamea(),关于Getcompuername()和Getcompuernamea(),包括可以看到的Getcompuernamew(),我们都不在进行介绍了,通过图1-20的函数定义和前面介绍这个函数的定义来比较一下,可以看到,头文件中的定义比MSDN中的定义对于函数的描述更加的详细,比如Winapi标识函数的调用方式。

本书的编程内容主要以C语言为编程语言(本书部分内容会涉及其他语言,但C语言是主要的),以VC6为开发环境,着重介绍了VC6的基本概念及简单的使用,在此基础上带领大家认识了专业的应用程序的调试工具---OD。在最后的内容中介绍了一些简单的API-函数的使用。万丈高楼平地起,希望每一位初学者不要过于着急,在后面的章节中我们会慢慢地深入学习黑客编程的内容。希望在每学完一个知识后,大家多思考多动手,这样才能真正地起到学习的效果。


}

<废话>编程小白终于决定夯实基础,学了一下网络编程。注释有点烂,周末实在太累了,就没整理。。。困晕了。然后python本来是想实现xshell的小功能的,结果只能远程执行一条命令,应该是客户端缓冲区的问题,没调好,哎,是真的菜</废话>

<后记>发现自己博客的质量好烂啊,慢慢改进,希望大佬们能教我一点,然后有什么应该改进的地方,请多指教</后记>

}

我要回帖

更多关于 学编程需要什么基础 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信