超详细代码过程分析 不慌不忙
- 格式:doc
- 大小:117.00 KB
- 文档页数:8
python 源码详解Python是一种高级编程语言,它的源代码是由一系列的编程指令组成的。
在本文中,我们将详细解析Python源代码的结构和功能,以便更好地理解和使用这门语言。
Python源代码的基本结构由模块、函数和类组成。
模块是Python 程序的基本组织单位,它可以包含变量、函数和类等。
函数是一段可重用的代码块,它接收输入参数并返回结果。
类是一种面向对象编程的概念,它可以封装数据和方法,并通过实例化来创建对象。
在Python源代码中,我们可以使用各种关键字和语法来定义变量、控制流程和实现算法等。
其中,关键字是Python语言预定义的标识符,它们具有特殊的含义和用途。
语法是一组规则,用于组织和描述源代码的结构和行为。
Python源代码的执行过程是从上到下逐行执行的。
在执行过程中,解释器会根据代码的语法规则和执行顺序来逐步解析和执行代码。
如果代码存在语法错误或逻辑错误,解释器会抛出异常并终止程序的执行。
在Python源代码中,我们可以使用各种内置函数和标准库来实现常见的功能和操作。
内置函数是Python语言提供的一组函数,用于执行各种常见的操作,例如数学计算、字符串处理和文件操作等。
标准库是Python语言提供的一组模块,用于实现各种功能和服务,例如网络通信、图形界面和数据库访问等。
除了内置函数和标准库,我们还可以使用第三方库和模块来扩展Python的功能和能力。
第三方库是由第三方开发者编写的,它们提供了各种功能和工具,例如科学计算、机器学习和数据可视化等。
我们可以使用pip工具来安装和管理第三方库。
在Python源代码中,我们还可以使用注释来提供对代码的说明和解释。
注释是以#开头的行,它们不会被解释器执行,只用于给人阅读和理解代码。
注释可以提高代码的可读性和可维护性,有助于他人理解和修改代码。
Python源代码还可以使用异常处理来处理和捕获异常。
异常是在程序执行过程中发生的错误或异常情况,例如除零错误和文件不存在等。
apm代码解析
APM(Application Performance Management)代码解析是指使用APM工具对应用程序代码进行分析和优化的一种方法。
APM工具可以捕获和分析应用程序的性能数据,并提供有关代码性能的详细信息。
通过代码解析,开发人员可以识别代码中的瓶颈和性能问题,并采取措施进行优化。
在APM代码解析中,工具通常会收集以下数据:
1. 请求数据:包括请求的时间、响应时间、请求的参数和头信息等。
2. 内存数据:包括内存使用情况、堆栈跟踪和线程状态等。
3. 数据库数据:包括数据库查询、事务和锁等。
4. 网络数据:包括网络请求、响应和延迟等。
APM工具会根据这些数据生成报告和图表,以帮助开发人员识别代码中的性能问题。
报告和图表通常包括以下内容:
1. 性能指标:包括响应时间、吞吐量、错误率等。
2. 代码性能:包括代码中的热点方法、慢方法、阻塞方法等。
3. 内存使用:包括内存泄漏、内存不足等问题。
4. 数据库查询:包括慢查询、重复查询等问题。
5. 网络请求:包括网络延迟、高延迟请求等问题。
通过分析这些报告和图表,开发人员可以识别代码中的性能问题,并采取措施进行优化。
例如,开发人员可以对慢方法进行优化、减少内存使用、优化数据库查询和减少网络延迟等。
总之,APM代码解析是一种使用APM工具对应用程序代码进行分析和优化的一种方法。
通过代码解析,开发人员可以识别代码中的性能问题,并采取措施进行优化,从而提高应用程序的性能和用户体验。
代码解析器算法
代码解析器算法是一种将代码模板解析成AST(抽象语法树)的方法。
它的基本思想是将代码模板视为一个字符串,然后使用解析器来识别其中的语法结构,并将其转换为AST。
解析器内部通常分为多个子解析器,如HTML解析器、文本解析器和过滤器解析器等。
在解析过程中,解析器会触发各种钩子函数,如开始标签钩子函数、结束标签钩子函数、文本钩子函数和注释钩子函数等。
这些钩子函数用于处理不同的语法结构,并构建相应的AST 节点。
例如,对于以下代码模板:<div id="app"><p>{{num}}</p></div>,解析器会依次触发标签开始钩子函数parseStartTag、文本钩子函数和标签结束钩子函数parseEndTag,从而构建出相应的AST节点。
总的来说,代码解析器算法是一种非常重要的技术,它可以帮助开发人员理解和处理代码模板,提高代码的可读性和可维护性。
代码逻辑过程讲解
代码逻辑过程是指在程序中按照一定的顺序和条件执行的流程。
下面是一个示例代码的逻辑过程讲解:
1. 首先,程序启动并执行入口函数(main函数)。
2. 然后,程序声明并初始化一个变量。
3. 接着,程序执行一个条件判断语句。
如果条件为真,则执行下面的代码块;如果条件为假,则跳过代码块继续执行后续代码。
4. 在代码块中,程序执行一些操作,比如输出一些信息到输出流中。
5. 代码块执行完毕后,程序继续执行后续的代码。
6. 程序可能会包含循环语句,比如for循环或while循环。
如
果有循环语句,程序会反复执行循环内的代码块,直到循环条件不满足为止。
7. 当程序执行完所有的代码后,程序结束。
以上是一个简单的示例代码的逻辑过程讲解。
实际代码的逻辑过程可能更加复杂,包含更多的条件判断、循环和函数调用等结构。
c语言程序设计步骤图详解介绍常见步骤图符号及步骤图例子。
本章例1 - 1算法步骤图如图1 - 2所表示。
本章例1 - 2算法步骤图如图1 - 3所表示。
在步骤图中, 判定框左边步骤线表示判定条件为真时步骤, 右边步骤线表示条件为假时步骤, 有时就在其左、右步骤线上方分别标注“真”、“假”或“T”、“F”或“Y”、“N”注“真”、“假”或“T”、“F”或“Y”、“N”另外还要求, 步骤线是从下往上或从右向左时, 必需带箭头, 除此以外, 都不画箭头, 步骤线走向总是从上向下或从左向右。
2. 算法结构化描述早期非结构化语言中都有go to语句, 它许可程序从一个地方直接跳转到另一个地方去。
实施这么做好处是程序设计十分方便灵活, 降低了人工复杂度, 但其缺点也是十分突出, 一大堆跳转语句使得程序步骤十分复杂紊乱, 难以看懂也难以验证程序正确性, 假如有错, 排起错来更是十分困难。
这种转来转去步骤图所表示混乱与复杂, 正是软件危机中程序人员处境一个生动写照。
而结构化程序设计, 就是要把这团乱麻理清。
经过研究, 大家发觉, 任何复杂算法, 都能够由次序结构、选择(分支)结构和循环结构这三种基础结构组成, 所以, 我们结构一个算法时候, 也仅以这三种基础结构作为“建筑单元”,遵守三种基础结构规范, 基础结构之间能够并列、能够相互包含, 但不许可交叉, 不许可从一个结构直接转到另一个结构内部去。
正因为整个算法都是由三种基础结构组成, 就像用模块构建一样, 所以结构清楚, 易于正确性验证, 易于纠错, 这种方法, 就是结构化方法。
遵照这种方法程序设计, 就是结构化程序设计。
对应地, 只要要求好三种基础结构步骤图画法, 就能够画出任何算法步骤图。
(1) 次序结构次序结构是简单线性结构, 各框按次序实施。
其步骤图基础形态如图1 - 4所表示, 语句实施次序为: A→B→C。
(2) 选择(分支)结构这种结构是对某个给定条件进行判定, 条件为真或假时分别实施不一样框内容。
hotkey源码解析标题:Hotkey源码解析与个人实践经验分享引言:Hotkey是一种常用的快捷键技术,它可以显著提高操作效率和用户体验。
本文将结合个人实践经验,对Hotkey源码进行解析,并分享一些使用Hotkey的心得体会。
一、Hotkey源码解析Hotkey的实现原理是通过注册系统级的钩子函数,来捕获用户按下或释放键盘按键的事件,并触发相应的操作。
以下是Hotkey源码的基本结构:1. 初始化Hotkey的初始化是通过注册一个钩子函数来实现的。
这个钩子函数会被系统调用,以便在用户按下或释放键盘按键时进行相应的处理。
2. 捕获按键事件当钩子函数被调用时,它会接收到一个事件参数,包括按键类型、按键码等信息。
通过解析这些信息,可以判断用户按下了哪个键。
3. 触发操作根据用户按下的键,可以执行相应的操作。
例如,可以打开一个应用程序、切换窗口、执行特定的命令等。
4. 键盘状态管理Hotkey还需要管理键盘的状态,以便正确地响应用户的按键操作。
例如,可以判断某个键是否已经被按下,以避免重复触发操作。
二、个人实践经验分享在使用Hotkey的过程中,我积累了一些实践经验,现在分享给大家:1. 合理设计快捷键快捷键应该尽量简洁易记,避免使用过于复杂或冲突的组合。
同时,要考虑到用户的习惯和操作习惯,以提高用户的使用体验。
2. 增加操作的灵活性除了单一的快捷键触发操作,还可以考虑支持组合键、连击键等方式,以增加操作的灵活性和多样性。
3. 提供个性化设置为了满足不同用户的需求,可以提供个性化的快捷键设置功能,让用户根据自己的喜好和习惯进行设置。
4. 键盘状态处理在处理快捷键时,要考虑到键盘的状态,避免重复触发操作或发生意外的操作。
可以通过记录键盘按下和释放的状态来实现。
5. 错误处理和异常情况处理在实现Hotkey时,要考虑到各种错误和异常情况,例如注册钩子失败、快捷键冲突等,要及时给出提示和处理。
结论:通过对Hotkey源码的解析和个人实践经验的分享,我们可以更好地理解Hotkey的工作原理和使用方法。
常见的代码问题与解决方法代码问题是编程过程中经常遇到的挑战,解决这些问题需要耐心和技巧。
在下面的文字中,我将会讨论一些常见的代码问题,并提供解决方法。
1.语法错误:语法错误是编程过程中最常见的问题之一。
它们是由于程序员在编写代码时违反了编程语言的语法规则造成的。
解决这个问题的方法是仔细检查代码,特别是括号、分号和引号的闭合情况,以确保它们成对出现。
2.逻辑错误:逻辑错误是指代码的执行结果不符合预期。
这种问题通常是由于编程思维的错误或算法的错误造成的。
解决这个问题的方法是仔细检查代码的逻辑,尝试通过调试和打印变量来理解程序的执行流程。
3.数组越界:在访问数组或集合时,如果超出了索引范围,就会发生数组越界错误。
为了解决这个问题,需要检查数组和集合的索引范围,并确保它们在有效的范围内。
4.无限循环:无限循环是指循环条件不满足,导致循环永远不会停止。
要解决这个问题,可以检查循环的条件是否正确,并确保循环在正确的时机退出。
5.内存泄漏:内存泄漏是指程序在分配内存后没有正确释放,导致内存占用增加。
解决这个问题的方法是在使用完动态分配的内存后,使用“delete”或“free”来释放它们。
6.资源竞争:当多个线程同时访问共享资源时,可能会发生资源竞争问题。
为了解决这个问题,可以使用同步机制,如互斥锁或信号量来限制对资源的访问。
7.错误处理:在处理输入错误或不可靠的数据时,可以使用异常处理机制来捕获和处理异常。
这可以使程序更加鲁棒,能够处理意外的情况。
8.程序崩溃:当程序发生错误而崩溃时,可以使用调试工具来找到代码中的错误位置,并修复它们。
调试工具允许开发者逐行执行代码,并查看变量的值,从而更容易地找到问题。
9.性能问题:当程序的性能不满足要求时,可以使用性能分析工具来识别瓶颈,并对代码进行优化。
优化的方法可能包括改进算法、减少不必要的计算或使用更高效的数据结构等。
10.编码规范问题:编码规范是一组约定,用于指导代码的书写风格和格式。
五个简单的步骤编写高质量的代码在编写高质量的代码时,遵循正确的编码规范和最佳实践是至关重要的。
高质量的代码不仅易于维护和扩展,而且可以提高程序的性能和可靠性。
在本文中,我们将分享五个简单的步骤,帮助您编写高质量的代码。
第一步:规划和设计在编写代码之前,规划和设计是非常重要的步骤。
在这个阶段,您需要仔细思考代码的目的和实现细节。
此步骤包括以下内容:1.明确需求:明确代码所要解决的问题,并了解用户的需求。
2.分析问题:定义问题的范围和限制,并在代码实现之前做好充分的分析和设计。
3.选择最佳解决方案:基于需求和问题分析,选择最佳的解决方案。
在做出决策之前,您需要考虑代码运行时间、复杂度和可扩展性等因素。
第二步:遵循编码规范编写高质量的代码,需要遵循一些编码规范。
编码规范是代码编写约定,它可以提高代码的可读性和可维护性,同时也有助于避免一些常见的编程错误。
编码规范应该包括以下内容:1.命名规范:命名规范可以使代码易于阅读和理解。
应该采用一致的命名规范,例如变量名、函数名和类名等。
2.缩进和格式:代码应该使用一致的缩进和格式,这样可以使代码易于阅读和维护。
同时,避免使用过多的空格或换行符。
3.注释:注释是代码中的重要部分,它可以提供解释和帮助读者理解代码的运作方式。
应该避免使用不必要的注释,并保证注释的准确性和一致性。
4.错误处理:错误处理是代码中的必要部分。
应该编写代码来处理错误,并提供有用的错误消息。
第三步:使用适当的数据类型使用适当的数据类型,可以提高代码的性能和可读性。
在选择数据类型时,您应该根据数据的使用情况和程度选择适当的类型,例如整型、浮点型、字符串和列表等。
1.整型:整型是用于表示整数的数据类型。
在使用整型时,您应该考虑数值的大小和范围。
2.浮点型:浮点型是用于表示浮点数的数据类型。
在使用浮点型时,您应该考虑数值的精度和效率。
3.字符串:字符串是用于表示文本的数据类型。
在使用字符串时,您应该考虑字符集和编码方式。
python 源码详解Python 是一种高级编程语言,它的源码是由一系列的代码语句组成的。
这篇文章将详细解析 Python 源码,并根据要求,不输出任何HTTP 地址、公式或图片链接。
文章将采用规范整洁的格式,使用恰当的段落和标题,以使文章结构清晰,易于阅读。
Python 源码是由一系列的代码语句组成的,这些语句被解释器逐行执行,从而实现了程序的功能。
Python 的源码可以包含变量定义、函数定义、条件语句、循环语句等等。
下面我们将从几个方面对Python 源码进行详细解析。
我们来看一段简单的 Python 源码:```pythondef greet(name):print("Hello, " + name + "!")greet("World")```这段代码定义了一个名为`greet` 的函数,它接受一个参数`name`,并打印出一个问候语。
然后,我们调用这个函数,并传入参数`"World"`。
执行这段代码后,控制台将输出`Hello, World!`。
在这段代码中,我们可以看到 `def` 关键字用于定义函数,后面跟着函数名和参数列表。
在函数体内部,我们使用 `print` 函数打印出问候语。
最后,我们调用函数 `greet`,并传入参数 `"World"`。
除了函数定义和函数调用,Python 的源码还可以包含变量的定义和使用。
下面是一个例子:```pythonname = "Alice"print("My name is " + name)```这段代码定义了一个名为`name` 的变量,它的值是字符串`"Alice"`。
然后,我们使用 `print` 函数打印出一句话,其中包含了变量 `name` 的值。
执行这段代码后,控制台将输出 `My name is Alice`。
先介绍一下不慌不忙:大家都有过忙手忙脚最小化窗口(或关闭窗口)的经历吧!原因很简单——不想让突如其来的老板、老妈、老婆看到我们电脑屏幕上正在显示的游戏、日记、MM:-) 等属于个人隐私的东东。
本软件就能为你解决以上的烦恼,当你鼠标左、右键同时按下时,软件就能迅速隐藏正在显示的窗口,免去人工瞄准并按下每个窗口右上方的那个小得可怜的的最小化按扭之苦了。
当危险解除再鼠标左、右键同时按下能使隐藏的窗口恢复。
此外程序还有关闭声音,保留某些窗口,自定义快捷键,隐藏桌面,隐藏任务栏,关闭程序等辅助功能。
软件操作容易,界面简洁,不需要过多的时间摸索就能熟练使用。
开始破解程序没有加壳,OD载入后用F12调用堆栈法或下API断点都可到达关键位置开始分析过程004029E0 . 6A FF push -1 ; 这段代码的开头004029E2 . 68 087F4000 push Unhurrie.00407F08 ; SE 处理程序安装004029E7 . 64:A1 0000000> mov eax,dword ptr fs:[0]004029ED . 50 push eax004029EE . 64:8925 00000> mov dword ptr fs:[0],esp004029F5 . 83EC 54 sub esp,54004029F8 . 53 push ebx004029F9 . 56 push esi004029FA . BB 01000000 mov ebx,1004029FF . 57 push edi00402A00 . 8BF1 mov esi,ecx00402A02 . 53 push ebx00402A03 . E8 E04B0000 call <jmp.&MFC42.#CWnd::UpdateData_6>; 取部分用户名,不知是干什么的00402A08 . 8D4C24 0C lea ecx,dword ptr ss:[esp+C]00402A0C . E8 A14B0000 call <jmp.&MFC42.#CString::CString_5>00402A11 . 8D4C24 20 lea ecx,dword ptr ss:[esp+20]00402A15 . C74424 68 000> mov dword ptr ss:[esp+68],000402A1D . E8 4E4B0000 call <jmp.&MFC42.#CWnd::CWnd_567>00402A22 . C74424 20 F89> mov dword ptr ss:[esp+20],Unhurrie.0>00402A2A . 8D7E 64 lea edi,dword ptr ds:[esi+64]00402A2D . 68 48C64000 push Unhurrie.0040C64800402A32 . 8BCF mov ecx,edi00402A34 . 885C24 6C mov byte ptr ss:[esp+6C],bl00402A38 . E8 6F4B0000 call <jmp.&MFC42.#CString::operator=>; 取完整用户名00402A3D . 8B8E 14010000 mov ecx,dword ptr ds:[esi+114]00402A43 . 8D86 14010000 lea eax,dword ptr ds:[esi+114]00402A49 . 8B51 F8 mov edx,dword ptr ds:[ecx-8]00402A4C . 85D2 test edx,edx00402A4E . 7E 0A jle short Unhurrie.00402A5A ; 判断用户名是否填写,没有填写就跳向失败00402A50 . 50 push eax00402A51 . 8BCF mov ecx,edi00402A53 . E8 9C4B0000 call <jmp.&MFC42.#CString::operator=>; 取填写的注册码00402A58 . EB 0C jmp short Unhurrie.00402A6600402A5A > 68 B8C24000 push Unhurrie.0040C2B800402A5F . 8BCF mov ecx,edi00402A61 . E8 464B0000 call <jmp.&MFC42.#CString::operator=>00402A66 > 8B96 10010000 mov edx,dword ptr ds:[esi+110]00402A6C . 837A F8 17 cmp dword ptr ds:[edx-8],1700402A70 0F85 83010000 jnz Unhurrie.00402BF9 ; 判断注册码是否为23位,不是23位就跳向失败00402A76 . 8D4424 10 lea eax,dword ptr ss:[esp+10]00402A7A . 57 push edi00402A7B . 50 push eax00402A7C . 8BCE mov ecx,esi00402A7E . E8 1D020000 call Unhurrie.00402CA0 ; 算法部分,F7跟入可以分析算法00402A83 . 50 push eax00402A84 . 8D4C24 10 lea ecx,dword ptr ss:[esp+10]00402A88 . C64424 6C 02 mov byte ptr ss:[esp+6C],200402A8D . E8 624B0000 call <jmp.&MFC42.#CString::operator=>00402A92 . 8D4C24 10 lea ecx,dword ptr ss:[esp+10]00402A96 . 885C24 68 mov byte ptr ss:[esp+68],bl00402A9A . E8 014B0000 call <jmp.&MFC42.#CString::~CString_>00402A9F . 8B4C24 0C mov ecx,dword ptr ss:[esp+C]00402AA3 . 8B86 10010000 mov eax,dword ptr ds:[esi+110]00402AA9 . 51 push ecx ; /堆栈S2=真注册码00402AAA . 50 push eax ; |堆栈S1=假注册码00402AAB . FF15 24934000 call dword ptr ds:[<&MSVCRT._mbscmp>>; \将真的注册码与假的比较00402AB1 . 83C4 08 add esp,800402AB4 . 85C0 test eax,eax00402AB6 0F85 9E010000 jnz Unhurrie.00402C5A ; 判断注册码是否正确,不对就跳00402ABC . 8D5424 10 lea edx,dword ptr ss:[esp+10] ; 下面开始把注册信息写入注册表00402AC0 . 52 push edx ; /pHandle00402AC1 . 68 06000200 push 20006 ; |Access = KEY_WRITE00402AC6 . 50 push eax ; |Reserved00402AC7 . 68 8CC24000 push Unhurrie.0040C28C ; |Subkey = "Software\Microsoft\Windows\CurrentVersion"00402ACC . 68 02000080 push 80000002 ; |hKey = HKEY_LOCAL_MACHINE00402AD1 . FF15 04904000 call dword ptr ds:[<&ADVAPI32.RegOpe>; \RegOpenKeyExA00402AD7 . 85C0 test eax,eax00402AD9 . 74 15 je short Unhurrie.00402AF0 ; 判断打开注册表指定位置是否成功00402ADB . 6A 00 push 000402ADD . 6A 00 push 000402ADF . 68 78C24000 push Unhurrie.0040C278 ; ASCII "can't open regedit!"00402AE4 . 8BCE mov ecx,esi00402AE6 . E8 EB4A0000 call <jmp.&MFC42.#CWnd::MessageBoxA_>; 提示写入注册信息失败00402AEB . E9 73010000 jmp Unhurrie.00402C6300402AF0 > 51 push ecx00402AF1 . 8BCC mov ecx,esp00402AF3 . 896424 18 mov dword ptr ss:[esp+18],esp00402AF7 . 57 push edi00402AF8 . E8 A94A0000 call <jmp.&MFC42.#CString::CString_5>00402AFD . 8BCE mov ecx,esi00402AFF . E8 5CFEFFFF call Unhurrie.0040296000402B04 . 8B0F mov ecx,dword ptr ds:[edi]00402B06 . 8B5424 10 mov edx,dword ptr ss:[esp+10]00402B0A . 8B3D 00904000 mov edi,dword ptr ds:[<&ADVAPI32.Reg>; ADVAPI32.RegSetValueExA00402B10 . 8B49 F8 mov ecx,dword ptr ds:[ecx-8]00402B14 . 51 push ecx ; /BufSize00402B15 . 50 push eax ; |Buffer00402B16 . 53 push ebx ; |ValueType 00402B17 . 6A 00 push 0 ; |Reserved = 0 00402B19 . 68 64C24000 push Unhurrie.0040C264 ; |ValueName = "RegisteredBubmTzm"00402B1E . 52 push edx ; |hKey00402B1F . FFD7 call edi ; \RegSetValueExA 00402B21 . 85C0 test eax,eax00402B23 . 74 15 je short Unhurrie.00402B3A ; 判断是否可以设置键值名00402B25 . 6A 00 push 000402B27 . 6A 00 push 000402B29 . 68 4CC24000 push Unhurrie.0040C24C ; ASCII "can't change regedit!"00402B2E . 8BCE mov ecx,esi00402B30 . E8 A14A0000 call <jmp.&MFC42.#CWnd::MessageBoxA_>; 提示写入注册信息失败00402B35 . E9 29010000 jmp Unhurrie.00402C6300402B3A > 51 push ecx00402B3B . 8D4424 10 lea eax,dword ptr ss:[esp+10]00402B3F . 8BCC mov ecx,esp00402B41 . 896424 18 mov dword ptr ss:[esp+18],esp00402B45 . 50 push eax00402B46 . E8 5B4A0000 call <jmp.&MFC42.#CString::CString_5> 00402B4B . 8BCE mov ecx,esi00402B4D . E8 0EFEFFFF call Unhurrie.0040296000402B52 . 8B8E 10010000 mov ecx,dword ptr ds:[esi+110]00402B58 . 8B5424 10 mov edx,dword ptr ss:[esp+10]00402B5C . 8B49 F8 mov ecx,dword ptr ds:[ecx-8]00402B5F . 41 inc ecx00402B60 . 51 push ecx00402B61 . 50 push eax00402B62 . 53 push ebx00402B63 . 6A 00 push 000402B65 . 68 38C24000 push Unhurrie.0040C238 ; ASCII "RegisteredBubmZcm"00402B6A . 52 push edx00402B6B . FFD7 call edi ; 准备写入注册信息00402B6D . 85C0 test eax,eax00402B6F . 6A 00 push 000402B71 . 74 13 je short Unhurrie.00402B86 ; 判断是否写入注册信息成功00402B75 . 68 4CC24000 push Unhurrie.0040C24C ; ASCII "can't change regedit!"00402B7A . 8BCE mov ecx,esi00402B7C . E8 554A0000 call <jmp.&MFC42.#CWnd::MessageBoxA_>; 提示写入注册信息失败00402B81 . E9 DD000000 jmp Unhurrie.00402C6300402B86 > 68 90C14000 push Unhurrie.0040C19000402B8B . 51 push ecx00402B8C . 8BCC mov ecx,esp00402B8E . 896424 24 mov dword ptr ss:[esp+24],esp00402B92 . 68 2CC24000 push Unhurrie.0040C22C ; ASCII "SOURCEINFO1"00402B97 . E8 404A0000 call <jmp.&MFC42.#CString::CString_5>00402B9C . 51 push ecx00402B9D . C64424 78 03 mov byte ptr ss:[esp+78],300402BA2 . 8BCC mov ecx,esp00402BA4 . 896424 2C mov dword ptr ss:[esp+2C],esp00402BA8 . 68 70C14000 push Unhurrie.0040C170 ; ASCII "SOURCE_DIALOG_CN"00402BAD . E8 2A4A0000 call <jmp.&MFC42.#CString::CString_5>00402BB2 . 8D4424 24 lea eax,dword ptr ss:[esp+24]00402BB6 . 8D4C24 30 lea ecx,dword ptr ss:[esp+30]00402BBA . 50 push eax00402BBB . 885C24 7C mov byte ptr ss:[esp+7C],bl00402BBF . E8 CCF1FFFF call Unhurrie.00401D9000402BC4 . 8BC8 mov ecx,eax00402BC6 . C64424 70 04 mov byte ptr ss:[esp+70],400402BCB . E8 70F1FFFF call Unhurrie.00401D4000402BD0 . 50 push eax00402BD1 . 8BCE mov ecx,esi00402BD3 . E8 FE490000 call <jmp.&MFC42.#CWnd::MessageBoxA_>; 提示注册成功00402BD8 . 8D4C24 14 lea ecx,dword ptr ss:[esp+14]00402BDC . 885C24 68 mov byte ptr ss:[esp+68],bl00402BE0 . E8 BB490000 call <jmp.&MFC42.#CString::~CString_>00402BE5 . 8B4C24 10 mov ecx,dword ptr ss:[esp+10]00402BE9 . 51 push ecx ; /hKey00402BEA . FF15 0C904000 call dword ptr ds:[<&ADVAPI32.RegClo>; \RegCloseKey00402BF0 . 8BCE mov ecx,esi ; 到此注册信息写入过程结束00402BF2 . E8 D3490000 call <jmp.&MFC42.#CDialog::OnOK_4853> 00402BF7 . EB 61 jmp short Unhurrie.00402C5A ; 这个跳转跳过失败提示00402BF9 > 6A 00 push 0 ; 下边开始准备提示注册失败00402BFB . 68 90C14000 push Unhurrie.0040C19000402C00 . 51 push ecx00402C01 . 8BCC mov ecx,esp00402C03 . 896424 28 mov dword ptr ss:[esp+28],esp00402C07 . 68 1CC24000 push Unhurrie.0040C21C ; ASCII "SOURCEINFO17"00402C0C . E8 CB490000 call <jmp.&MFC42.#CString::CString_5>00402C11 . 51 push ecx00402C12 . C64424 78 05 mov byte ptr ss:[esp+78],500402C17 . 8BCC mov ecx,esp00402C19 . 896424 28 mov dword ptr ss:[esp+28],esp00402C1D . 68 70C14000 push Unhurrie.0040C170 ; ASCII "SOURCE_DIALOG_CN"00402C22 . E8 B5490000 call <jmp.&MFC42.#CString::CString_5> 00402C27 . 8D5424 24 lea edx,dword ptr ss:[esp+24]00402C2B . 8D4C24 30 lea ecx,dword ptr ss:[esp+30]00402C2F . 52 push edx00402C30 . 885C24 7C mov byte ptr ss:[esp+7C],bl00402C34 . E8 57F1FFFF call Unhurrie.00401D9000402C39 . 8BC8 mov ecx,eax00402C3B . C64424 70 06 mov byte ptr ss:[esp+70],600402C40 . E8 FBF0FFFF call Unhurrie.00401D4000402C45 . 50 push eax00402C46 . 8BCE mov ecx,esi00402C48 . E8 89490000 call <jmp.&MFC42.#CWnd::MessageBoxA_>; 出现错误提示00402C4D . 8D4C24 14 lea ecx,dword ptr ss:[esp+14]00402C51 . 885C24 68 mov byte ptr ss:[esp+68],bl00402C55 . E8 46490000 call <jmp.&MFC42.#CString::~CString_> 00402C5A > 6A 00 push 000402C5C . 8BCE mov ecx,esi00402C5E . E8 85490000 call <jmp.&MFC42.#CWnd::UpdateData_6> 00402C63 > 8D4C24 20 lea ecx,dword ptr ss:[esp+20]00402C67 . C64424 68 00 mov byte ptr ss:[esp+68],000402C6C . E8 5F490000 call <jmp.&MFC42.#CButton::~CButton_> 00402C71 . 8D4C24 0C lea ecx,dword ptr ss:[esp+C]00402C75 . C74424 68 FFF > mov dword ptr ss:[esp+68],-100402C7D . E8 1E490000 call <jmp.&MFC42.#CString::~CString_> 00402C82 . 8B4C24 60 mov ecx,dword ptr ss:[esp+60]00402C86 . 5F pop edi00402C87 . 5E pop esi00402C88 . 64:890D 00000> mov dword ptr fs:[0],ecx00402C8F . 5B pop ebx00402C90 . 83C4 60 add esp,6000402C93 . C3 retn ; 代码结束代码有点乱,大家将就吧,程序的目录下也有代码分析,那里的代码比较清楚一点另外说一下,注册信息保存在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 的RegisteredBubmTzm 和RegisteredBubmZcm这两个键值下根据我的调试发现,只要在注册时输入任意23位注册码,并修改00402AB6的跳转,软件在写入注册信息时就写入正确的注册码,而不是用户输入的23位注册码,这个也算是这个软件的一个BUG吧。