第九章:无相关字符串
大一c语言章节知识点

大一c语言章节知识点第一章:基本概念和数据类型C语言的历史背景C语言的特点和优势关键字和标识符数据类型及其表示范围变量的定义和声明常量的定义和分类运算符的分类和优先级第二章:运算符和表达式算术运算符和表达式逻辑运算符和表达式位运算符和表达式赋值运算符和表达式关系运算符和表达式条件运算符和表达式运算符的优先级和结合性第三章:控制语句顺序结构选择结构(if语句、switch语句)循环结构(for循环、while循环、do-while循环)循环控制语句(break、continue、goto)嵌套控制语句第四章:数组和字符串数组的定义和初始化数组的访问和操作多维数组字符数组和字符串的处理字符串的输入和输出第五章:函数和递归函数的调用和返回函数的参数传递(值传递、地址传递)递归函数的原理与应用递归和迭代的比较第六章:指针指针的定义和声明指针与数组的关系指针的运算(指针的加减、指针的比较)指针与字符串的处理函数指针和指针数组第七章:结构体和共用体结构体的定义和初始化结构体中成员的访问和操作结构体的嵌套和对齐枚举类型的定义和应用第八章:文件操作文件的打开和关闭文件的读写操作(字符型文件、二进制文件)文件指针的位置控制文件的随机访问和更新第九章:动态内存管理内存分配与释放的概念malloc函数和free函数的使用calloc函数和realloc函数的使用动态分配二维数组的操作第十章:预处理指令宏定义的使用条件编译指令的应用文件包含指令的作用错误指示和行控制指令无论是在学习C语言的过程中,还是在实际应用中,以上这些章节知识点都是非常重要的。
掌握这些知识点,将帮助你深入了解C语言的基本原理和常用功能,为编写高效、健壮的程序奠定扎实基础。
在学习过程中,请务必理解并实践每个章节的知识点,并结合实际案例进行练习和应用,以加深对C语言的理解和应用能力。
祝你在学习C语言的道路上取得优异的成绩!。
第九章(5)_类的定义与使用_其他成员

定义属性
• 属性的定义示例:
class Person { private int _age; public int Age { get { return _age; } set { if (value >= 0 && value <= 200) { _age = value; } } } }
• 在这里,value代表进行写入操作时所写 入的值。
定义属性
• 使用读取器与写入器:
class Person { public string Name; public string Sex; 私有成员 private int _age; public int GetAge() { return _age; } public void SetAge(int age) { if (age >= 0 && age <= 200) { this._age = age; } } } class Program { static void Main() { Person someBody = new Person(); someBody.SetAge(10); someBody.SetAge(-10); Console.WriteLine(“Age: {0}”, someBody.GetAge()); } }
静态类
• static静态类,只能包含静态成员。 • 静态类不能定义构造函数,因此也不能 用于初始化对象。
问题?
• 字符串的连接,通过“+”运算符实现, 直观方便,是什么原理实现的? • 我们有些类如果能够这样就更方便了:
– 考虑Point坐标(x,y),存在+,-,==这样的 运算要求。 – 我们可以在Point类中通过定义Add()、 subtract()、Equal()方法实现,但是不够直 观。
《汉语功能句法分析》评介

《汉语功能句法分析》评介作者:刘帅何荷来源:《读书文摘(下半月)》2017年第01期摘要:系统功能语言学是当代影响最大的语言学流派之一,作为适用语言学的系统功能语言学在本土化研究方面得到巨大的发展。
何伟教授是系统功能语言学研究领域的重要代表人物,其新作《汉语功能句法分析》借助系统功能语言学中的加的夫语法分析汉语句式,主要从汉语小句、名词词组、性质词组、数量词组等方面分析汉语句式。
本文将对该著作进行内容的引介和分析,希望起到抛砖引玉的作用,推动汉语句法分析的发展。
关键词:加的夫语法;汉语句法;系统功能语言学1 引言系统功能语言学是当代影响最大的语言学流派之一,自从20世纪70年代末由胡壮麟等学者引入中国以来,我国功能语言学界已经对该理论进行了各方面的探讨,系统功能语言学在中国有了进一步的发展,尤其在本土化研究领域,不少学从系统功能视角对汉语进行研究,但是这些研究主要是对汉语的三大元功能进行描述,但很少涉及词汇-语法层次上的句法理论。
《汉语功能句法分析》一书从系统功能语言学角度对汉语进行句法描写,该书主要的依据思想是语言功能思想,主要理论基础是系统功能语言学内部的加的夫模式,也适当参考了悉尼模式。
何伟教授领衔撰写的《汉语功能句法分析》一书有利于系统功能语言学对汉语的研究,也可以帮助对汉语功能句法分析感兴趣的研究者提供快速入门方法。
本文将就该书做简要评述,简要介绍各章重点,并分析本书特色与不足,在此基础上简要探讨汉语功能句法分析。
2 主要内容第一章首先简要介绍本书使用的理论基础,即系统功能语言学。
主要涉及两个方面的内容:第一,简要介绍本书所用的理论基础,系统功能语言学中的悉尼模式和加的夫模式,并通过对两种模式简要对比,指出其相同点和不同点,然后介绍我们选用其中一种模式作为主要理论基础的原因;二是重点介绍本书主要的理论基础——系统功能语言学的加的夫模式,旨在通过提出并简要介绍加的夫语法的句法范畴和功能句法关系,并提出汉语中主要七种句法单位,分别是小句、名词词组、性质词组、数量词组、介词短语、介词词组和连接词词组。
数据库原理与应用第九章

理平台,这里介绍使用SQL Server管理平台的方法。 在SQL Server 2005管理平台中,展开指定的数据表和数
据库,右击要操作的数据表,从弹出的快捷菜单中选择“修改” 命令,打开修改数据表界面,在要设置唯一性的属性上右击, 从弹出的快捷菜单中选择“索引/键”命令,打开“索引/键”对 话框,单击“添加”按钮后对话框将出现新的索引/键名称,用 户可以修改该索引/键的名称并设置“是唯一的”为“是”,完 成唯一约束的设置。
列的为空性决定表中的行是否可为该列包含空值。空值 (或NULL)不同于零(0)、空白或长度为零的字符串(如 "")。NULL的意思是没有输入,出现NULL通常表示值未知或 未定义。
9.2 约束的定义与操作
9.2.2 操作约束
约束的操作主要包括增加、修改和删除约束,其方法通 常有两种,SQL 语句和SQL管理平台。下面介绍使用SQL管 理平台的方法。
| <table_constraint> } [ ,...n]
9.1 数据表的定义与操作
9.1.3 删除数据表
删除数据表可以采用命令和管理平台两种方式删除表。这 里主要介绍使用管理平台删除数据表。
在SQL Server 2005管理平台中,展开指定的数据库和数据 表,右击要删除的数据表,从弹出的快捷菜单中选择“删除” 命令,将打开“删除对象”窗口,单击“确定”按钮即删除数 据表。单击“关系依赖图”按钮,可显示所有该表依赖的对象 以及依赖该对象的对象,当有对象依赖该表时,想删除该表就 必须先删除依赖该表的其他表,否则该表不能被删除。
在SQL Server 2005管理平台中,展开指定的数据表和 数据库,右击要操作的数据表,从弹出的快捷菜单中选择 “修改”命令,打开修改数据表界面,在要修改约束的属性 上右击,从弹出的快捷菜单中选择合适的约束命令,然后按 照创建各约束的步骤在对创建的约束进行增加、修改或删除 即可。
《C语言程序设计教程》第三版课后习题参考答案

《C语言程序设计教程》第三版课后习题参考答案C语言程序设计教程第三版课后习题参考答案第一章:C语言概述1.1 C语言的特点答案:C语言是一种通用的、面向过程的程序设计语言,具有高效、简洁、灵活等特点。
它提供了丰富的程序设计元素和功能,适用于各种不同的应用领域。
1.2 C语言程序的基本结构答案:C语言程序由预处理指令、函数声明、函数定义、变量声明和语句组成。
其中,预处理指令用来引入头文件或定义宏,函数声明用来声明函数的名称和参数,函数定义用来实现函数的功能,变量声明用来声明变量的类型和名称,语句用来表达具体的计算过程。
1.3 C语言的数据类型答案:C语言提供了多种数据类型,包括基本类型(整型、浮点型、字符型等)和派生类型(数组、指针、结构体等)。
每种数据类型在内存中占据一定的存储空间,并具有特定的取值范围和操作规则。
1.4 C语言的运算符和表达式答案:C语言支持各种运算符和表达式,例如算术运算符(+、-、*、/等)、关系运算符(>、<、==等)、逻辑运算符(&&、||、!等)等。
通过运算符和表达式可以进行各种数值计算和逻辑判断。
第二章:基本数据类型与运算2.1 整型数据类型答案:C语言提供了不同长度的整型数据类型,包括有符号整型(int、long等)和无符号整型(unsigned int、unsigned long等)。
整型数据类型可以表示整数值,并具有不同的取值范围。
2.2 浮点型数据类型答案:C语言提供了浮点型数据类型(float、double等),用来表示带小数部分的实数值。
浮点型数据可以表示较大或较小的数值,并具有一定的精度。
2.3 字符型数据类型答案:C语言提供了字符型数据类型(char),用来表示单个字符。
字符型数据可以用于表示各种字符(包括字母、数字、符号等)。
2.4 布尔型数据类型答案:C语言不直接支持布尔型数据类型,但可以使用整型数据类型来表示布尔值(0表示假、非零表示真)。
数组字符串中的字符无效的原因

数组字符串中的字符无效的原因1.引言1.1 概述在编程中,字符串和数组是经常使用的数据结构。
然而,有时候我们会遇到一些字符无效的情况。
字符无效指的是这些字符无法被正确地识别、处理或者导致错误的结果。
本文将探讨数组字符串中字符无效的原因。
了解这些原因有助于我们更好地理解和处理字符无效的问题,提高我们编程的效率和准确性。
在正文部分,我们将先介绍字符无效的定义和意义。
然后,我们将深入分析出现字符无效的原因,从而帮助我们找到解决这些问题的方法和技巧。
最后,我们将在结论部分总结所讨论的内容,并得出一些关于字符无效原因的启示,为我们今后的编程工作提供指导和帮助。
通过本文的阅读,我们将更好地了解数组字符串中字符无效的原因,增强解决问题的能力,提高开发效率。
1.2文章结构1.2 文章结构本文将按照以下结构进行展开讨论:第一部分,引言,将对本文的主题进行概述,并介绍文章的结构和目的。
第二部分,正文,将重点讨论字符无效的定义和意义。
首先,我们将阐述什么是字符无效以及在数组字符串中的含义。
接下来,我们将详细探讨导致字符无效的原因,包括但不限于输入错误、编程错误和数据损坏等因素。
第三部分,结论,将对全文进行总结,并提出对字符无效的原因的启示。
我们将强调对于字符无效的原因的深刻理解对于解决相关技术问题和提高代码质量的重要性。
通过以上结构,本文将全面分析字符无效的原因,以期为读者提供有关此主题的深入了解和思考,并帮助读者在实践中更好地处理和避免字符无效的问题。
1.3 目的本文的目的是探讨数组字符串中字符无效的原因。
通过分析和总结,我们希望能够深入了解导致字符无效的各种因素,并为读者提供有关如何处理和解决这些问题的启示。
具体目标如下:1. 分析并解释字符无效的定义和意义:我们将解释什么是字符无效以及为什么对于数组字符串的处理中字符的有效性非常重要。
通过明确了解字符无效的概念,读者可以更好地理解字符无效带来的问题和影响。
2. 探究数组字符串中字符无效的原因:我们将深入研究引起数组字符串中字符无效的各种原因。
PLC21-功能指令(第九章)
2.减法运算指令 对有符号数进行相减操作,包括整数减法、双整数减法、 实数减法。 梯形图表示:
语句表示:整数减法指令“-I IN1,OUT”;双整数减法指 令“ - D IN1,OUT”;实数减法指令“ - R IN1,OUT”。
当信号EN=1时,被减数IN1与减数IN2相减,其结果传送到 OUT中。
四、比较指令 数值比较指令用于比较两个数值; 字符串比较指令用于比较两个字符串的ASCll码字符。
操作数按指定条件进行比较。
条件成立时,触点闭合,所以实际上是一种位指令。 仅说明数值比较指令 . 类型有:字节比较、整数比较、双字整数比较和实数比较。 字节比较是无符号的,其它类型为有符号的。 比较指令的关系符有:等于=、大于>、小于<、不等<>、 大于等于>=、小于等于<= 等6种。 对比较指令可进行LD、 A和O编程。以关系符“=”为例说明。
4. 正弦、余弦、正切指令
梯形图表示:
语句表示:正弦指令“SIN IN,OUT”;余弦指令“COS IN,OUT”;正切指令“TAN IN,OUT”。
当允许信号EN=1时,将一个双字长(32位)的实数弧度 值IN分别取正弦、余弦、正切,各得到32位的实数结果传送 到OUT中。 如果已知输入值为角度,要先将角度值转化为弧度值, 使用“(*R)MUL_R”指令,用角度值乘以π /180。
当信号EN=l时,被乘数IN1与乘数IN2相乘,结果送到OUT 中。在语句表示中,要先将被乘数送到OUT中,然后和IN1中 的数据进行相乘,溢出以及输入非法参数或运算中产生非法值, 都会使特殊标志SM1.1置位。
4.除法运算指令 对有符号数进行相除操作,包括:整数除法、双整数除法、 完全整数除法和实数除法。
3.块传送指令 字节块(BMB)的传送、字块(BMW)的传送和双字块的 传送(BMD)指令传倒数量的数据到一个新的存储区,数据的 起始地址为IN,数据的长度为N个字节、字或双字。 新块的起站地址为OUT。N的范围从l至255。
第九章输入输出处理
9
2. 字节流——OutputStream
write(int b)
将一个整数输出到流中(只输出低位字节,抽象)
write(byte b[])
将字节数组中的数据输出到流中
write(byte b[], int off, int len)
将数组b中从off指定的位置开始,长度为len的数据 输出到流中
本讲内容
1、I/O概述 2、I/O字节流 3、I/O字符流 4、随机访问文件
1
1. I/O概述
大部分程序都需要输入/输出处理,比如从键盘读取数 据、向屏幕中输出数据、从文件中读或者向文件中写 数据、在一个网络连接上进行读写操作等。 在Java中,把这些不同类型的输入、输出抽象为流 (Stream),而其中输入或输出的数据则称为数据流 (Data Stream),用统一的接口来表示,从而使程序 设计简单明了。
ObjectInputStream PipedInputStream SequenceInputStream StringBufferInputStream
OutputStream
ByteArrayOutputStream FileOutputStream FilterOutputStream
FilterInputStream(InputStream in); FilterOutputStream(OutputStream out);
这两个类是抽象类,构造方法也是保护方法。
15
2. 字节流——过滤流:缓冲流
类BufferedInputStream和BufferedOutputStream实现 了带缓冲的过滤流,它提供了缓冲机制,把任意的I/O 流“捆绑”到缓冲流上,可以提高读写效率。 在初始化时,除了要指定所连接的I/O流之外,还可以 指定缓冲区的大小。缺省大小的缓冲区适合于通常的 情形;最优的缓冲区大小常依赖于主机操作系统、可 使用的内存空间以及机器的配置等;一般缓冲区的大 小为内存页或磁盘块等地整数倍,如8912字节或更小。
全国计算机二级考试C语言(最全复习资料)
第一部分 C语言知识复习资料第一章C语言基本知识【考点1】C程序用C语言编写的程序称为C语言源程序,源程序文件的后缀名为“.c”。
源程序经编译后生成后缀名为“.obj”的目标文件,再把目标文件与各种库函数连接起来,生成“.exe”可执行文件。
C语言有三种基本结构:顺序结构、选择结构、循环结构。
【考点2】main函数又称主函数,是C程序的入口。
main后面跟一对小括号和一对花括号,花括号括起来的部分称为main 函数的函数体。
一个C程序从main函数开始执行,到main函数体执行完结束,而不论main函数在整个程序中的位置如何。
每一个程序有且仅有一个main函数,其他函数都是为main函数服务的。
【考点3】存储形式计算机在电脑中保存数据是采用二进制形式,由0或1构成的二进制称为位(bit),八个位构成一个字节(Byte),1个Byte=8个bit。
二进制、八进制、十六进制转化为十进制采用乘法,十进制转化为二进制、八进制、十六进制采用除法。
数据的存放位置就是它的地址。
【考点4】注释是对程序的说明,可出现在程序中任意合适的地方,注释从“/*”开始到最近一个“*/”结束,其间任何内容都不会被计算机执行,注释不可以嵌套。
【考点5】书写格式每条语句的后面必须有一个分号,分号是语句的一部分。
一行内可写多条语句,一个语句可写在多行上。
【考点6】标识符是标识名字的有效字符序列,可以理解为C程序中的单词。
标识符的命名规则是:(1)标识符只能由字母、数字和下划线组成,字母区分大小写。
(2)标识符的第一个字符必须是字母或下划线,不能为数字。
C语言标识符分如下3类(1)关键字。
它们在程序中有固定的含义,不能另作他用。
如int、for、switch等。
(2)预定义标识符。
预先定义并具有特定含义的标识符。
如define、include等。
(3)用户标识符。
用户根据需要定义的标识符,符合命名规则且不与关键字相同。
【考点7】常量与变量常量是指在程序运行过程中,其值不能改变的量。
FORTRAN95第09章-字符串
常用字符函数使用 例9.1 输出一个由英文字母构成的字符串,把字符串中所有小写字母转换 为大写字母并输出。 program ex901 implicit none character*80 strl,str2 integer k,l,i read(*,'(a)')strl str2=strl k=len(str2) l=ichar("a")-ichar(“A") do i=1,k if(str2(i:i)>="a".and.str2(i:i)<=“z")then str2(i:i)=char(ichar(str2(i:i))-l) end if end do write(*,'(4a10)')"strl=",strl,"str2=",str2 end 程序执行示例: ABcdEfG↙则显示: strl= AbcdEfG str2=ABCDEFG
2015-6-11 14
! 判断不是回文的相应字符是空格还是字符的函数 function char_blank(ch) result(ch_result) character(len=4)::ch_result character(len=1),intent(in)::ch if(ch==' ')then ch_result="空格" else ch_result=ch end if end function char_blank 程序执行示例: 输入一个字符串: ASDSA ASDSA是回文串 输入一个字符串: 2fghhgf2 2fghhgf2是回文串 输入一个字符串: DFGA FD DFGA FD不是回文串 字符串左第 3个字符是G 字符串右第 3个字符是空格 2015-6-11
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第九章:无相关字符串
一、简介
此次教程中我将会向我们的武器库中加入一个新的装备。
如果搜索二进制文件时发现没有可用的字符串你怎么办?我将会介绍一个新的R.E.T.A.R.D.规则。
此次教程(下一章也是)我们将研究“TDC”写的一个crackme叫
Crackme6,相关下载里面包含有。
总之,它不是一个硬骨头,不过我将会对其进行一些高级分析,好为将来的教程做准备。
你可以在教程页下载相关文件以及本教程的PDF版本。
那么,咱们开始吧......
Olly载入Crackme6:
现在,我们已经知道操作程序了。
运行程序看看情况:
嗯,看起来挺简单的。
我输入了一个密码1212121212,下面就是返回的情况:
相当直接呀。
试试我们拿手的“字符串搜索”,看看有什么:
搞什么鬼这是!!!这些一点用也没有啊。
我们可以拿这些字符串干
啥!?!?明显,这个crackme将字符串加密了(或者是作者说一种很奇怪的语言:D)。
好,是个好时候介绍
R4ndom’s Essential Truths About Reversing Data#3:
R4ndom关于逆向数据的必备真理#3:
#3.不要依赖二进制文件当前已有的字符串。
不幸的是,在你开始研究真正的二进制文件(比如商业产品)时,它们中的大部分被以某种方式打包以及/或保护。
干扰逆向工程师的一个最明显的方法是加密字符串。
坦率地说,在逆向工程领域当我第一次研究一个感兴趣的新的二进制文件时,如果我搜索字符串并且搜出来了,我能够假定那个二进制文件很可能没有多少挑战。
所以,你不能够依赖于那些东西(如果有当然更好)。
二、模块间的调用
有鉴于此,我向你展示一个新的在没有字符串的情况下的技巧。
大部分的Windows应用程序使用一个标准的API集来完成特定的动作。
例如,如果需要一个简单的消息框的话就调用MessageBoxA,当程序想要退出的时候就调用TerminateProcess。
因为大部分的应用都使用这些相同的API,我们可以用这个获利。
例如,有些API可以用于从对话框的输入框(类似用户名和序列号)获取文本。
有可以被调用用来比较两个字符串的字符串比较函数(输入的密码和程序中存储的密码相同吗?)。
有读写注册表的API(存储和读取你的注册状态)。
Olly提供了一种搜索所有被调用的API的方法。
在反汇编窗口右键,选择“Search for”->“All intermodular calls”:
Olly会弹出Found intermodular calls窗口:
通常我做的第一件事是点一下“Destination”,将列出的函数按字母顺序进行排序(而不是按地址排序):
现在,如果你看第三列的话,你可以看到该crackme调用的所有API:
这是一个小程序,所以调用的函数不是那么多。
大部分的程序都有数百个。
不过通过这个列表,你可以了解到一个二进制文件的很多信息。
你可以发现它用一个对话框作为主窗口。
它载入了一个自定义的位图。
它修改了对话框中的一些颜色。
在更大些的应用中,这个窗口的价值更高,因为它能告诉你这些事情:1)是否有注册表相关API被调用用来存储和获取信息?是不是有API呼叫网站来验证我们确实注册了?3)有没有读写一个可能存有注册码文件的API?当我们研究一个加壳的二进制文件时,这个窗口将更加重要(这个后面讨论)。
尽管如此,有几个特定API逆向工程师总是会留意,因为这几个在保护机制中用的比较多。
包括:
DialogBoxParamA
GetDlgItem
GetDlgItemInt
GetDlgTextA
GetWindowTextA
GetWindowWord
LoadStringA
lstrcmpA
wsprintfA
MessageBeep
MessageBoxA
MessageBoxExA
SendMessageA
SendDlgItemMessageA
ReadFile
WriteFile
CreateFileA
GetPrivateProfileIntA
WritePrivateProfileStringA
GetPrivateProfileStringA
不幸的是,这里没有包括你可能遇到的所有API,不过幸运的是,大部分应用使用下面的其中一个:
GetDlgItemTextA
GetWindowTextA
lstrcmpA
GetPrivateProfileStringA
GetPrivateProfileIntA
RegQueryValueExA
WritePrivateProfileStringA
GetPrivateProfileIntA
如果你专注这8个API的调用,你就可以处理绝大多数的实例。
还有别忘了,“Get help on symbolic name”是可以给你提供帮助的。
现在,在Olly查找出的crackme的调用列表中往下看,在那个简短的列表中有两个API:
GetDlgItem和GetDlgItemTextA
这两个函数是用来获取输入到对话框中文本框的文本。
好吧,在我们的教程中,这只可能说明一件事,获取我们输入的密码。
我们想要做的是,不管什么时候只要Olly遇到两者中的一个就暂停。
方法是,选中你想要关注的API那行,右键然后选择“Set breakpoint on every call to____”,这里的____是API的名称(这里是GetDlgItem):
现在,我们看到Olly已经在该行设置了一个BP:
我们也想在另一个API GetDlgItemTextA那暂停,那么点击选中它,右键然后和前面一样进行操作:
现在,不管什么时候只要Olly遇到了对这两个API的调用,它都会断下来(在调用被执行前)。
咱们来试试看。
重启crackme并运行。
Olly会断在对GetDlgItem的调用处:
现在,因为我们还没有输入任何内容,我们对GetDlgItem取到了什么东西不感兴趣,好咱们继续(F9):
现在输入一个密码,然后点“check”:
Olly会再次断下来,这次是在GetDlgItemTextA:
如果你看看周围,你会注意到我们已经来到正确的位置。
搞笑的是,我们起初搜索字符串的时候,没有一个是这些字符串中的。
三、破解应用
咱们快速浏览下附近的...。
我们注意到有一个跳转(JB)跳过了第一个“ACCESS DENIED”,所以我们关注一下它:
有一个跳转(JNZ)跳过了第二个坏消息,所以我们也将其加入关注名单。
然后我们就会直接穿过到达好消息,所以基本上我们想要确保我们跳过了这两个跳转:
咱们试试,看看咱们是不是对的。
再一次运行程序,我们应该断在GetDlgItemTextA指令处(记住绕过第一个断点):
因为这是一个JB跳转,所以我们需要翻转进位标志位:
这样就会强制跳转。
现在我们将做另一个TEST,停在了401280处的跳转那。
注意,我们的密码已经出现了注释列:
我们想要那个跳转实现,因为它跳过了第二个坏消息,所以我们只需要继续单步直到到达40129F的JNZ指令:
好,这条指令将会跳过我们的好消息,所以我们想要阻止它跳。
你知道该怎么做:
现在运行程序(F9),看看我们已经成功的破解了程序:
四、作业
作为一个挑战,试着给这个crackme打补丁,基于那个我们已经修改的标志位。
在将打过补丁的程序保存后,你应该可以运行它,输入任何密码(少于11个数字)它都会提示“Access Granted”。
记住有几个补丁可以完成这个任务,所以如果一个不起作用,那就找下一个。
加分题:给crackme打补丁,让它接受任意长的密码。