破解C语言的序列号
- 格式:doc
- 大小:23.50 KB
- 文档页数:1
一、准备好常用破解工具,1、查壳工具:PEiD 0.952、脱壳调试:OllyICE v1.10(俗称OD,可下载一些OD插件保存在程序文件目录下的plugin文件夹中,启动OD时会自动链接插件)3、Win32反汇编:WinHex14.2(本帖暂用不着)4、修复工具:ImportREC V1.6(本帖暂用不着)5、注册机编写:keymake够了,初学不宜太多。
新手所有的工具在小生工具包里都有(赞下小生同鞋的无私奉献)二、壳的概念:关于壳的介绍文章很多,很多初学者还不知道壳是什么,那么你就暂且这样通俗的去理解:壳就是软件的包装外壳。
三、脱壳:顾名思义,我就不多说了。
四、调试:用OD调试程序的进程,寻找关键(算法)CALL,修改有关汇编语言达到软件注册或破解的目的。
五、有人问:我不懂汇编语言和算法怎么办?我告诉你,没关系,首先你必须从简单的、好欺负的软件入手(初学者千万别找年轻的、经常更新的或高版本的软件),否则,你只会以失败而告终。
六、如果你是第一次学破解,我告诉你一个方法,只要你按如下操作一般都能成功(有的新版本软件除外):1、首先注册软件,查看软件弹出的有关注册失败的信息框的内容。
2、查壳:有壳脱壳,无壳用OD载入。
3、手动脱壳基本方法:从OD载入软件程序后弹出是否分析对话框,点“否”,停在程序壳的入口(含有pushad等类似字符)。
接下来我们的目的是要寻找第一个popad 。
(1)首先按F8,接下来或近处便是CALL,此时的CALL或是离这里很近的CALL必须按F7,否则你就掉入陷井,后面遇到CALL一旦掉入也没关系,你先记下来,重新载入程序(按CTRL+F2),再遇到这个时就用F7进入。
(2)出现往回跳转时,即红色线显示跳转实现,必须在下一行点左鍵,然后按F4步过,灰色为跳转未实现,可不理它照样F8。
(3)其他全部F8,一路下去必定能找到第一个popad,找到后离此不远必定有一个大的跳转,一旦跳转来到有push ebp字样,说明壳己走完到主程序(OEP),在此用OD插件→ollyDump→Dump debu…→Dump脱壳→保存。
rsa加密解密算法c语言程序RSA加密解密算法是一种公钥加密算法,发明于1977年,基于两个大质数的乘积难分解性,能够对短文本进行加解密。
以下是RSA加密解密算法的C语言程序。
一、密钥生成首先定义了一个结构体存储RSA密钥,该结构体包含三个元素:n、e和d。
- n = p * q,其中p和q为大质数;- e为与(p - 1) * (q - 1)互质的自然数,一般选取65537;- d为e模(p - 1) * (q - 1)的逆元素,即满足e * d ≡ 1 (mod (p - 1) * (q - 1)))的自然数。
generateRSAKey函数通过调用randomPrime函数生成两个大质数p和q,再通过Euclidean函数计算(p - 1) * (q - 1)的值phi,最后继续使用extendedEuclidean函数计算d的值,最终将生成的密钥存储在RSAKey结构体中。
```c#include <stdio.h>#include <stdlib.h>#include <time.h>#include <math.h>#define k 1024 // 密钥长度typedef struct {unsigned long long n;unsigned long long e;unsigned long long d;} RSAKey;unsigned long long randomPrime(unsigned long long n);unsigned long long gcd(unsigned long long a, unsigned long long b);unsigned long long Euclidean(unsigned long long a, unsigned long long b);RSAKey generateRSAKey();// 生成一个小于n的随机质数unsigned long long randomPrime(unsigned long long n) {unsigned long long p;do {p = rand() % n;while (!(p & 1)) // 确保p为奇数p = rand() % n;} while (gcd(p, n) != 1); // 确保p和n互质return p;}二、加密和解密下面定义了两个函数:encrypt和decrypt,其中encrypt函数用于将明文转换为密文,decrypt函数用于将密文转换为明文。
序列号密码生成破解方法
关于序列号和密码生成的破解方法,这涉及到了计算机安全和破解技术,我希望强调的是,破解行为是非法的并且严重违反了法律。
在这里,我将从技术角度来说明一些可能被黑客用来破解序列号和密码的方法,但这并不是鼓励或支持任何非法行为。
1. 字典攻击,这是一种常见的破解密码的方法,黑客使用一个包含常见密码、词典中的单词和字符组合的列表,然后尝试每一个可能的组合,直到找到匹配的密码。
2. 暴力破解,黑客使用计算机程序自动尝试所有可能的密码组合,直到找到正确的密码。
这需要大量的计算能力和时间,但对于弱密码来说,仍然是一种有效的攻击方式。
3. 社会工程学,黑客可能会尝试通过欺骗、诱导或其他手段获取密码或序列号,这可能涉及到诈骗、钓鱼等方式。
4. 漏洞利用,黑客可能会利用软件或系统的漏洞来获取密码或序列号,这需要对系统漏洞的深入了解和技术能力。
为了保护个人和机构的信息安全,我们应该采取一些措施来防止密码和序列号被破解,比如使用强密码、定期更改密码、启用多因素认证、及时修补系统漏洞等。
同时,我们也要加强对安全意识的培训,提高对社会工程学攻击的警惕。
最重要的是,我们要遵守法律法规,不要参与任何形式的黑客攻击行为。
软件注册码破解案例教程
一、大致介绍
破解软件注册码是一种技术,它可用于破解软件的注册码,使你可以在未付费情况下使用被激活的软件的所有功能。
通常,破解软件注册码通过修改已有软件的设置、注册信息或文件等实现激活,从而使用未经授权的软件或服务。
二、基本步骤
2.获取破解文件。
破解文件包括一个或多个文件,用于将安装文件和软件的注册号绑定在一起,以便在安装过程中不需要付费就可以激活该软件。
它们可以从网络上免费获取,也可以购买。
3.安装软件。
安装软件时,需要参考安装文件的说明,正确完成安装过程。
4.安装破解文件。
使用破解文件时,需要将它们复制到软件安装目录中,并按照说明进行设置。
5.运行软件,打开软件,用破解文件激活软件,完成激活。
三、工具介绍
1.破解器/加密狗:破解器/加密狗是一类专用于破解软件注册码的设备,可以用于清除软件的注册信息,以达到激活的效果。
cmd5破解思路如果遇到MD5加密文件,而又不知道密码的。
请在数据库中换上这组加密的数据吧16位加密:469e80d32c0559f8 32位加密:7fef 6171469e80d32c0559f88b 377245 40位加密:469e80d32c0559f88b 3772452c0559f88b 377245(不常用)那么密码就是admin888一般网站后台管理员密码都是经过MD5加密的,差不多都是16位和32位的,如果第一次碰到40位的加密,还真反映不过来,其实都是一样的。
7a57a5a 743894a0e4a801fc 343894a0e4a801fc3原文是admin这个实际上还是MD5加密,不过稍微做了些变动:前16位,7a57a5a 743894a0e,是admin的16位MD5密文;后面的24位,注意看,是两个4a801fc3之间夹杂一个43894a0e,而4a801fc3是32位MD5密文的后8位,43894a0e则是16位MD5密文的后8位。
所以,这个密文可以这样看:先用16位MD5加密admin,再在后面添上32位MD5密文的后8位,最后把后16位密文(43894a0e4a801fc3)来个重复,就诞生了40位MD5加密密文了。
知道原理了,以后看见这种后面32位密文实际上是一段16位密文的重复的加密密文,直接把前16位拿出去破解就可以了,后面的统统没用。
这样加密的好处不言而喻:通常人们都认为MD5只有16位和32位两种加密方式,被这样一搞,尽管看上去极像MD5,但因为位数不同所以没法用在线和工具破解,也就认为这是另一种加密方式了,混淆视听的目的就达到了。
附admin的16位、32位密文:7a57a5a 743894a0e 21232f297a57a5a 743894a0e4a801fc3所以遇到40位的加密密文,那么复制其前16位来破解那么就成功了,成功率100%Md5密文破解(解密)可以说是网络攻击中的一个必不可少的环节是黑客工具中的一个重要"辅助工具"md5解密主要用于网络攻击在对网站等进行入侵过程有可能获得治理员或者其他用户的账号和密码值(md5加.Md5密文破解(解密)可以说是网络攻击中的一个必不可少的环节是黑客工具中的一个重要"辅助工具"md5解密主要用于网络攻击在对网站等进行入侵过程有可能获得治理员或者其他用户的账号和密码值(md5加密后的值)获得的密码值有两种情况一种是明文另外一种就是对明文进行了加密如果密码值是加密的这个时候就需要对密码值进行判定如果是采取md5加密则可以通过MD5Crack3等软件进行破解王小云教授的md5密码碰撞破解算法没有公布因此目前Md5解密方式主要采取暴力破解即软件通过算法生成字典然后使用md5函数加密该字典中的值形成密文接着跟需要破解的密文进行比较如果相同则认为破解成功目前网上有很多网站提供md5加密或者加密值查询将加密后的md5值输入到网站中如果网站数据库中存在该md5则该值对应的md5加密前的值就为密码本案例介绍如何使用MD5Crack3以及一些在线的网站来进行破解;MD5Crack3是阿呆写的一款md5密码破解软件其网站地址:目前已经发布了MD5Crack4.0版本也可以到我的blog(去下载(一)在线生成md5密码值1.有关md5加解密知识Md5密文破解(解密)可以说是网络攻击中的一个必不可少的环节是黑客工具中的一个重要"辅助工具"md5解密主要用于网络攻击在对网站等进行入侵过程有可能获得治理员或者其他用户的账号和密码值(md5加密后的值) 获得的密码值有两种情况一种是明文另外一种就是对明文进行了加密如果密码值是加密的这个时候就需要对密码值进行判定如果是采取md5加密则可以通过MD5Crack4等软件进行破解王小云教授的md5密码碰撞破解算法没有公布因此目前Md5解密方式主要采取暴力破解即软件通过算法生成字典然后使用md5函数加密该字典中的值形成密文接着跟需要破解的密文进行比较如果相同则认为破解成功目前网上有很多网站提供md5加密或者加密值查询将加密后的md5值输入到网站中如果网站数据库中存在该md5则该值对应的md5加密前的值就为密码2.通过cmd5网站生成md5密码在浏览器中输入地址""在输入框中输入想要加密的原始密码然后单击"md5加密或解密"按钮即可如图1所示原始密码为"goodman88"加密后的密码值为:MD5(goodman88,32)=d5a8e0b 115259023faa219f5b53ca522 MD5(goodman88,16)=15259023 faa219f5图1 md5加密作为实验数据我们在生成一组生日的md5密码如下:MD5(19801230,32)=2540bb62336a8eb3ebc1e42ee44c8e3dMD5(19801230,16)=336a8eb3ebc1e42e(二)在线破解md5密码值1.通过cmd5网站破解md5密码Md5密文破解(解密)可以说是网络攻击中的一个必不可少的环节是黑客工具中的一个重要"辅助工具"md5解密主要用于网络攻击在对网站等进行入侵过程有可能获得治理员或者其他用户的账号和密码值(md5加.在cmd5网站的输入框中输入刚才加密后的m d5 32值"d5a8e0b 115259023faa219f5b53ca522"然后单击"md5加密或解密"按钮即可如图2所示未能成功破解图2通过cmd5网站未能破解md5密码将第二个生日加密后的md5值"2540bb62336a8eb3ebc1e42ee44c8e3d"放入cmd5网站进行破解很快其结果就出来了如图3所示图3破解简单的数字密码2.在线md5破解网站收费破解高难度的md5密码值一些在线网站提供的md5密码破解只能破解已经收录和一些简单的密码对于稍微复杂一点的密码都不轻易被破解;而且对一些稍微有点难度的md5密码值如果数据库中有在线网站是要求付费的例如用一个复杂一点的md5值进行破解如图4所示提示找到但是要求进行付费图4要求付费才干查看md5密码值(三)使用字典暴力破解md5密码值1.再次生成md5密码值再在cmd5网站生成原密码为"jimmychu246"的md5密码值为:MD5(jimmychu246,32)=437f4fffb6b2e5aaca9fd1712b8ad282MD5(jimmychu246,16)=b6b2e5aaca9fd171直接运行md5crack4运行界面如图5所示图5 md5crack4程序主界面2.在md5crack4中验证md5值将需要破解的md5值(437f4fffb6b2e5aaca9fd1712b8ad282)粘贴到"破解单个密文(Single Cryptograph)"输入框中如图6所示如果该md5值是正确的则会在"破解单个密文"输入框下方显示黑色的"有效(valid)"两个字否则显示"valid"为灰色3.使用字典进行破解在"字符设置(Plaintext Setting)"中抉择"字典(Dictionary)"并在"N0.1"、"N0.2"以及"N0.3"中抉择三个不同的字典抉择完毕后单击"Start"按钮开始md5破解破解结束后会给出相应的提示如图7所示在本案例中使用字典破解成功在Result Md5密文破解(解密)可以说是网络攻击中的一个必不可少的环节是黑客工具中的一个重要"辅助工具"md5解密主要用于网络攻击在对网站等进行入侵过程有可能获得治理员或者其他用户的账号和密码值(md5加.中显示破解的密码为"jimmychu246"图7使用字典进行破解4."使用字符集(Char Muster)"中的数字进行破解将上面生成的数字md5值"336a8eb3ebc1e42e"放入单一md5密码破解输入框中选中"Char Muster"后依次可以抉择"Number"、"lowercase"、"majuscule"、"special char"以及"custom"进行破解在本例中使用数字进行破击因此"最小长度(Min Length)"中设置为"1""最大长度(Max Length)"中设置为"8"然后单击"开始"按钮使用数字进行md5破解尝试破解密码位数从1~9999999之间的所有数字组合如图8所示其密码值破解成功破解结果为"336a8eb3ebc1e42e---[19801230]"图8使用数字进行破解&说明(1)在md5crack4中还可以定义数字、大小字母、非凡字符的组合来进行破解(2)如果计算机配置比较好可以设置更多线程(3)如果自定义进行破解建议先抉择使用数字然后依次是数字、大小字母、非凡字符的组合破解时先易后难否则破解时间太长(4)在md5crack4还可以"使用插件"进行破解(5)在md5crack4中还可以设置软件显示的语言版本一共有中文简体和英语两个版本单击主界面中的设置(Option)即可进行设置如图9所示图9设置md5crack4 5.一次破解多个密码将需要破解的md5密码全部存放到一个txt文件中每一个密码独立一行然后在md5crack4中单击"破解多个密文"抉择刚才编辑的md5密码文件如图10所示抉择一种破解方式在本案例中抉择使用数字字典进行破解最后单击"开始"按钮开始破解图10破解多个md5密码值在md5crack4右下方会显示破解结果单击"日志"可以查看md5值校验等日志信息单击"结果"可以查看破解的结果如图11所示在结果中会将md5值与原始密码进行一一对应图11破解结果M Md5密文破解(解密)可以说是网络攻击中的一个必不可少的环节是黑客工具中的一个重要"辅助工具"md5解密主要用于网络攻击在对网站等进行入侵过程有可能获得治理员或者其他用户的账号和密码值(md5加.d5加解密是网络攻防中必需把握的知识本文介绍了使用md5cracker以及通过网站来对md5值进行破解对md5破解可以先在一些md5破解网站进行破解如果未能破解则可以在本地通过md5cracker进行破解。
C#软件加序列号激活、试用期限道高一尺,魔高一丈。
程序员想尽各种办法给软件加密,用户就想尽各种办法对软件破解。
现在做软件试用限制,那么就讨论下软件的试用限制。
总体来说,限制的方法有这么几种:1.时间限制。
2.次数限制。
以时间限制为例,主要是用户从安装之日起,限制用户使用天数。
n天之后,就无法使用。
这种限制主要是安装的时候,将当前日期写入注册表(或者硬盘上某文件)。
当然,写入的是加密过的乱码字符。
运行软件时,首先读取注册表(或者文件),如找不到注册表(或者文件),则提示软件未注册。
当正常读取后进行解密,得到注册日期,与当前日期进行比较,如果当前日期减去注册日期> n(允许试用天数),那么提示软件试用到期,直接退出软件。
否则提示可试用天数,继续试用软件。
根据以上思路,那么用户可以很容易破解软件。
比如更改系统日期、或者删除注册表,重新安装软件等。
针对用户的破解,对软件限制进行修改。
如果试用软件必须联网,或者需要服务器端(比如聊天软件等客户端软件),当前时间要从去服务器的时间,防止用户更改客户机系统时间。
或者服务器上对客户机进行记录,如记录主板id,安装时间,等等。
以上为客户机可联网的做法,当客户机无法上网,切不存在服务器,或者服务器就在本机时。
以上做法将无法使用。
那么对于单机运行的软件,如果需要数据库,我们可以将注册时间等信息写入数据库。
或者,我们可以采用一明一暗的做法,注册表是明,在硬盘的某角落,存放隐藏文件。
软件需读取两处,对两处进行比较,一致则通过,不一致就退出程序。
当然,安装的时候对该文件不替换。
我想用户是不愿意为了使用你的软件而格式化整个硬盘的。
其实还有做法,就是每次运行软件,先将当前日期与注册表对比,看是否过期。
如未过期,就对注册表进行一次更改,更改为当前日期,那么用户即使更改系统日期,他的试用期限也在逐渐缩小。
为了防止用户重装,还是采用一明一暗的做法。
基本上就这些方法吧.. 贴上测试代码:加密解密类:using System;using System.Data;using System.Configuration;using System.Linq;using System.Xml.Linq;using System.IO;using System.Text;using System.Security.Cryptography;namespace Add_To_Regedit{public class Encryption{public static string EncryPW(string Pass, string Key){return DesEncrypt(Pass, Key);}public static string DisEncryPW(string strPass, string Key){return DesDecrypt(strPass, Key);}//////////////////////////////////////////////////////////////////////// <summary>/// DES加密/// </summary>/// <param name="encryptString"></param>/// <returns></returns>public static string DesEncrypt(string encryptString, string key){byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));byte[] keyIV = keyBytes;byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString); DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); MemoryStream mStream = new MemoryStream();CryptoStream cStream = new CryptoStream(mStream, provider.CreateEncryptor(keyBytes, keyIV), CryptoStreamMode.Write);cStream.Write(inputByteArray, 0, inputByteArray.Length);cStream.FlushFinalBlock();return Convert.ToBase64String(mStream.ToArray());}/// <summary>/// DES解密/// </summary>/// <param name="decryptString"></param>/// <returns></returns>public static string DesDecrypt(string decryptString, string key){byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));byte[] keyIV = keyBytes;byte[] inputByteArray = Convert.FromBase64String(decryptString); DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); MemoryStream mStream = new MemoryStream();CryptoStream cStream = new CryptoStream(mStream,provider.CreateDecryptor(keyBytes, keyIV), CryptoStreamMode.Write);cStream.Write(inputByteArray, 0, inputByteArray.Length);cStream.FlushFinalBlock();return Encoding.UTF8.GetString(mStream.ToArray());}//////////////////////////////////////////////////////}}读写注册表类:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Management;using System.Security.Cryptography;using Microsoft.Win32;namespace Test_Form_Time{class TimeClass{public static int InitRegedit(){/*检查注册表*/string SericalNumber = ReadSetting("", "SerialNumber", "-1"); // 读取注册表,检查是否注册-1为未注册if (SericalNumber == "-1"){return 1;}/* 比较CPUid */string CpuId = GetSoftEndDateAllCpuId(1, SericalNumber); //从注册表读取CPUid string CpuIdThis = GetCpuId(); //获取本机CPUIdif (CpuId != CpuIdThis){return 2;}/* 比较时间*/string NowDate = TimeClass.GetNowDate();string EndDate = TimeClass.GetSoftEndDateAllCpuId(0, SericalNumber);if (Convert.ToInt32(EndDate) - Convert.ToInt32(NowDate) < 0){return 3;}return 0;}/*CPUid*/public static string GetCpuId(){ManagementClass mc = new ManagementClass("Win32_Processor"); ManagementObjectCollection moc = mc.GetInstances();string strCpuID = null;foreach (ManagementObject mo in moc){strCpuID = mo.Properties["ProcessorId"].Value.ToString();break;}return strCpuID;}/*当前时间*/public static string GetNowDate(){string NowDate = DateTime.Now.ToString("yyyyMMdd"); //.Year + DateTime.Now.Month + DateTime.Now.Day).ToString();// DateTime date = Convert.ToDateTime(NowDate, "yyyy/MM/dd");return NowDate;}/* 生成序列号*/public static string CreatSerialNumber(){string SerialNumber = GetCpuId() + "-" + "20110915";return SerialNumber;}/** i=1 得到CUP 的id* i=0 得到上次或者开始时间*/public static string GetSoftEndDateAllCpuId(int i, string SerialNumber){if (i == 1){string cupId = SerialNumber.Substring(0, stIndexOf("-"));// .LastIndexOf("-"));return cupId;}if (i == 0){string dateTime = SerialNumber.Substring(stIndexOf("-") + 1);// dateTime = dateTime.Insert(4, "/").Insert(7, "/");// DateTime date = Convert.ToDateTime(dateTime);return dateTime;}elsereturn string.Empty;}}/*写入注册表*/public static void WriteSetting(string Section, string Key, string Setting) // name = key value=setting Section= path{string text1 = Section;RegistryKey key1 =Registry.CurrentUser.CreateSubKey("Software\\MyTest_ChildPlat\\ChildPlat");// .LocalMachine.CreateSubKey("Software\\mytest");if (key1 == null){return;}try{key1.SetValue(Key, Setting);}catch (Exception exception1){return;}finally{key1.Close();}}/*读取注册表*/public static string ReadSetting(string Section, string Key, string Default){if (Default == null){Default = "-1";}string text2 = Section;RegistryKey key1 =Registry.CurrentUser.OpenSubKey("Software\\MyTest_ChildPlat\\ChildPlat");if (key1 != null){object obj1 = key1.GetValue(Key, Default);key1.Close();if (obj1 != null)if (!(obj1 is string)){return "-1";}string obj2 = obj1.ToString();obj2 = Encryption.DisEncryPW(obj2, "ejiang11");return obj2;}return "-1";}return Default;}}}调用方式如下:int res = TimeClass.InitRegedit();if (res == 0){Application.Run(new Form1());}else if(res == 1){MessageBox.Show("软件尚未注册,请注册软件!");}else if (res == 2){MessageBox.Show("注册机器与本机不一致,请联系管理员!");}else if (res == 3){MessageBox.Show("软件试用已到期!");}else{MessageBox.Show("软件运行出错,请重新启动!");}道高一尺,魔高一丈。
一、准备好常用破解工具,1、查壳工具:PEiD 0.952、脱壳调试:OllyICE v1.10(俗称OD,可下载一些OD插件保存在程序文件目录下的plugin文件夹中,启动OD时会自动链接插件)3、Win32反汇编:WinHex14.2(本帖暂用不着)4、修复工具:ImportREC V1.6(本帖暂用不着)5、注册机编写:keymake够了,初学不宜太多。
新手所有的工具在小生工具包里都有(赞下小生同鞋的无私奉献)二、壳的概念:关于壳的介绍文章很多,很多初学者还不知道壳是什么,那么你就暂且这样通俗的去理解:壳就是软件的包装外壳。
三、脱壳:顾名思义,我就不多说了。
四、调试:用OD调试程序的进程,寻找关键(算法)CALL,修改有关汇编语言达到软件注册或破解的目的。
五、有人问:我不懂汇编语言和算法怎么办?我告诉你,没关系,首先你必须从简单的、好欺负的软件入手(初学者千万别找年轻的、经常更新的或高版本的软件),否则,你只会以失败而告终。
六、如果你是第一次学破解,我告诉你一个方法,只要你按如下操作一般都能成功(有的新版本软件除外):1、首先注册软件,查看软件弹出的有关注册失败的信息框的内容。
2、查壳:有壳脱壳,无壳用OD载入。
3、手动脱壳基本方法:从OD载入软件程序后弹出是否分析对话框,点“否”,停在程序壳的入口(含有pushad等类似字符)。
接下来我们的目的是要寻找第一个popad 。
(1)首先按F8,接下来或近处便是CALL,此时的CALL或是离这里很近的CALL必须按F7,否则你就掉入陷井,后面遇到CALL一旦掉入也没关系,你先记下来,重新载入程序(按CTRL+F2),再遇到这个时就用F7进入。
(2)出现往回跳转时,即红色线显示跳转实现,必须在下一行点左鍵,然后按F4步过,灰色为跳转未实现,可不理它照样F8。
(3)其他全部F8,一路下去必定能找到第一个popad,找到后离此不远必定有一个大的跳转,一旦跳转来到有push ebp字样,说明壳己走完到主程序(OEP),在此用OD插件→ollyDump→Dump debu…→Dump脱壳→保存。
C++获取硬盘序列号#include <windows.h>#include <iostream.h>#include <stdio.h>#pragma argsused#define DFP_GET_VERSION 0x00074080#define DFP_SEND_DRIVE_COMMAND 0x0007c084#define DFP_RECEIVE_DRIVE_DA TA 0x0007c088//#pragma pack(1)typedef struct _GETVERSIONOUTPARAMS {BYTE bVersion; //Binary driver version.BYTE bRevision; //Binary driver revision.BYTE bReserved; //Not used.BYTE bIDEDeviceMap; //Bit map of IDE devices.DWORD fCapabilities; //Bit mask of driver capabilities.DWORD dwReserved[4]; //For future use.} GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOU TPARAMS;typedef struct _IDEREGS {BYTE bFeaturesReg; //Used for specifying SMART "commands".BYTE bSectorCountReg; //IDE sector count registerBYTE bSectorNumberReg; //IDE sector number registerBYTE bCylLowReg; // IDE low order cylinder valueBYTE bCylHighReg; // IDE high order cylinder valueBYTE bDriveHeadReg; // IDE drive/head registerBYTE bCommandReg; // Actual IDE command.BYTE bReserved; // reserved for future use. Must be zero.} IDEREGS, *PIDEREGS, *LPIDEREGS;typedef struct _SENDCMDINPARAMS {DWORD cBufferSize; // Buffer size in bytesIDEREGS irDriveRegs; // Structure with drive register values.BYTE bDriveNumber; // Physical drive number to send// command to (0,1,2,3).BYTE bReserved[3]; // Reserved for future expansion.DWORD dwReserved[4]; // For future use.//BYTE bBuffer[1]; // Input buffer.} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;typedef struct _DRIVERSTA TUS {BYTE bDriverError; // Error code from driver,// or 0 if no error.BYTE bIDEStatus; // Contents of IDE Error register.// Only valid when bDriverError// is SMART_IDE_ERROR.BYTE bReserved[2]; // Reserved for future expansion.DWORD dwReserved[2]; // Reserved for future expansion.} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;typedef struct _SENDCMDOUTPARAMS {DWORD cBufferSize; // Size of bBuffer in bytesDRIVERSTATUS DriverStatus; // Driver status structure.BYTE bBuffer[512]; // Buffer of arbitrary length// in which to store the data read from the drive.} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAM S;typedef struct _IDSECTOR {USHORT wGenConfig;USHORT wNumCyls;USHORT wReserved;USHORT wNumHeads;USHORT wBytesPerTrack;USHORT wBytesPerSector;USHORT wSectorsPerTrack;USHORT wVendorUnique[3];CHAR sSerialNumber[20];USHORT wBufferType;USHORT wBufferSize;USHORT wECCSize;CHAR sFirmwareRev[8];CHAR sModelNumber[40];USHORT wMoreVendorUnique;USHORT wDoubleWordIO;USHORT wCapabilities;USHORT wReserved1;USHORT wPIOTiming;USHORT wDMA Timing;USHORT wBS;USHORT wNumCurrentCyls;USHORT wNumCurrentHeads;USHORT wNumCurrentSectorsPerTrack;ULONG ulCurrentSectorCapacity;USHORT wMultSectorStuff;ULONG ulTotalAddressableSectors;USHORT wSingleWordDMA;USHORT wMultiWordDMA;BYTE bReserved[128];} IDSECTOR, *PIDSECTOR;/*+++Global vars---*/GETVERSIONOUTPARAMS vers;SENDCMDINPARAMS in;SENDCMDOUTPARAMS out;HANDLE h;DWORD i;BYTE j;char HardDiskNO[200];VOID ChangeByteOrder(PCHAR szString, USHORT uscStrSize){USHORT i;CHAR temp;for (i = 0; i < uscStrSize; i+=2){temp = szString[i];szString[i] = szString[i+1];szString[i+1] = temp;}}void DetectIDE(BYTE bIDEDeviceMap){if (bIDEDeviceMap&1){if (bIDEDeviceMap&16){//cout<<"ATAPI device is attached to primary controller, drive 0."<<endl;}else{//cout<<"IDE device is attached to primary controller, drive 0."<<endl;}}if (bIDEDeviceMap&2){if (bIDEDeviceMap&32){//cout<<"ATAPI device is attached to primary controller, drive 1."<<endl;}else{//cout<<"IDE device is attached to primary controller, drive 1."<<endl;}}if (bIDEDeviceMap&4){if (bIDEDeviceMap&64){//cout<<"ATAPI device is attached to secondary controller, drive 0."<<endl;}else{//cout<<"IDE device is attached to secondary controller, drive 0."<<endl;}}if (bIDEDeviceMap&8){if (bIDEDeviceMap&128){//cout<<"ATAPI device is attached to secondary controller, drive 1."<<endl;}else{//cout<<"IDE device is attached to secondary controller, drive 1."<<endl;}}}void hdid9x(){ZeroMemory(&vers,sizeof(vers));//We start in 95/98/Meh=CreateFile("\\\\.\\Smartvsd",0,0,0,CREATE_NEW,0,0);if (!h){//cout<<"open smartvsd.vxd failed"<<endl;exit(0);}if (!DeviceIoControl(h,DFP_GET_VERSION,0,0,&vers,sizeof(vers),&i,0)){ //cout<<"DeviceIoControl failed:DFP_GET_VERSION"<<endl;CloseHandle(h);return;}//If IDE identify command not supported, failsif (!(vers.fCapabilities&1)){//cout<<"Error: IDE identify command not supported.";CloseHandle(h);return;}//Display IDE drive number detectedDetectIDE(vers.bIDEDeviceMap);//Identify the IDE drivesfor (j=0;j<4;j++){PIDSECTOR phdinfo;char s[41];ZeroMemory(&in,sizeof(in));ZeroMemory(&out,sizeof(out));if (j&1){in.irDriveRegs.bDriveHeadReg=0xb0;}else{in.irDriveRegs.bDriveHeadReg=0xa0;}if (vers.fCapabilities&(16>>j)){//We don't detect a ATAPI device.//cout<<"Drive "<<(int)(j+1)<<" is a ATAPI device, we don't detect it"<<end l;continue;}else{in.irDriveRegs.bCommandReg=0xec;}in.bDriveNumber=j;in.irDriveRegs.bSectorCountReg=1;in.irDriveRegs.bSectorNumberReg=1;in.cBufferSize=512;if (!DeviceIoControl(h,DFP_RECEIVE_DRIVE_DATA,&in,sizeof(in),&out,sizeof(out),&i,0 )){//cout<<"DeviceIoControl failed:DFP_RECEIVE_DRIVE_DATA"<<endl;CloseHandle(h);return;}phdinfo=(PIDSECTOR)out.bBuffer;memcpy(s,phdinfo->sModelNumber,40);s[40]=0;ChangeByteOrder(s,40);//cout<<endl<<"Module Number:"<<s<<endl;memcpy(s,phdinfo->sFirmwareRev,8);s[8]=0;ChangeByteOrder(s,8);//cout<<"\tFirmware rev:"<<s<<endl;memcpy(s,phdinfo->sSerialNumber,20);s[20]=0;ChangeByteOrder(s,20);strcpy(HardDiskNO, s);//cout<<"\tSerial Number:"<<s<<endl;//cout<<"\tCapacity:"<<phdinfo->ulTotalAddressableSectors/2/1024<<"M"<<endl<<endl;}//Close handle before quitCloseHandle(h);}void hdidnt(){char hd[80];PIDSECTOR phdinfo;char s[41];ZeroMemory(&vers,sizeof(vers));//We start in NT/Win2000for (j = 0; j < 4; j++){sprintf(hd,"\\\\.\\PhysicalDrive%d",j);h = CreateFile(hd,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);if (!h) continue;if (!DeviceIoControl(h,DFP_GET_VERSION,0,0,&vers,sizeof(vers),&i,0)){CloseHandle(h);continue;}//If IDE identify command not supported, failsif (!(vers.fCapabilities&1)){CloseHandle(h);return;}//Identify the IDE drivesZeroMemory(&in,sizeof(in));ZeroMemory(&out,sizeof(out));if (j&1){in.irDriveRegs.bDriveHeadReg=0xb0;}else{in.irDriveRegs.bDriveHeadReg=0xa0;}if (vers.fCapabilities&(16>>j)) {//We don't detect a ATAPI device.//cout<<"Drive "<<(int)(j+1)<<" is a ATAPI device, we don't detect it"<<endl;continue;}else{in.irDriveRegs.bCommandReg=0xec;}in.bDriveNumber=j;in.irDriveRegs.bSectorCountReg=1;in.irDriveRegs.bSectorNumberReg=1;in.cBufferSize=512;if (!DeviceIoControl(h,DFP_RECEIVE_DRIVE_DA TA,&in,sizeof(in),&out,sizeof(out),&i,0)){ //cout<<"DeviceIoControl failed:DFP_RECEIVE_DRIVE_DATA"<<endl;CloseHandle(h);return;}phdinfo=(PIDSECTOR)out.bBuffer;memcpy(s,phdinfo->sModelNumber,40);s[40]=0;ChangeByteOrder(s,40);//cout<<endl<<"Module Number:"<<s<<endl;memcpy(s,phdinfo->sFirmwareRev,8);s[8]=0;ChangeByteOrder(s,8);//cout<<"\tFirmware rev:"<<s<<endl;memcpy(&s[21],phdinfo->sSerialNumber,20);s[40]=0;ChangeByteOrder(&s[21],20);//cout<<"\tSerial Number:"<<s<<endl;sprintf(s, "硬盘%d 的序列号是:%s", j + 1, &s[21]);strcpy(&HardDiskNO[j * 50], s);//cout<<"\tCapacity:"<<phdinfo->ulTotalAddressableSectors/2/1024<<"M"<<endl<<endl;CloseHandle(h);}}extern "C" {char * _export _stdcall GetHardDiskNO();}//---------------------------------------------------------------------------char * _stdcall GetHardDiskNO(){OSVERSIONINFO VersionInfo;ZeroMemory(&VersionInfo,sizeof(VersionInfo));VersionInfo.dwOSVersionInfoSize=sizeof(VersionInfo);GetVersionEx(&VersionInfo);memset(HardDiskNO, 0, 200);switch (VersionInfo.dwPlatformId){case VER_PLATFORM_WIN32s:break;case VER_PLATFORM_WIN32_WINDOWS:hdid9x();break;case VER_PLATFORM_WIN32_NT:hdidnt();break;}return HardDiskNO;}。
c语言解密代码下面是一个简单的`C`语言加密解密代码,实现了凯撒加密的功能:```c#include<stdio.h>#include<stdlib.h>#include<string.h>// 函数 encode() 将字母顺序推后 n 位,实现文件加密功能void encode(char str[], int n){char c;int i;for (i = 0; i < strlen(str); ++i){// 遍历字符串c = str[i];if (c >='a' && c <='z'){// c 是小写字母if (c + n % 26 <='z'){// 若加密后不超出小写字母范围str[i] = (char)(c + n % 26);}else{// 加密后超出小写字母范围,从头开始循环小写字母 str[i] = (char)(c + n % 26 - 26);}elseif (c >='A' && c <='Z'){// c 为大写字母if (c + n % 26 <= 'Z'){// 加密后不超出大写字母范围str[i] = (char)(c + n % 26);}else{// 加密后超出大写字母范围,从头开始循环大写字母 str[i] = (char)(c + n % 26 - 26);}}else{// 不是字母,不加密str[i] = c;printf("\nAfter encode: \n");puts(str);}}// 输出加密后的字符串printf("\nAfter encode: \n");puts(str);}// 实现解密功能,将字母顺序前移 n 位void decode(char str[], int n){int i;for (i = 0; i < strlen(str); ++i){c = str[i];if (c >='a' && c <='z'){// 解密后还为小写字母,直接解密if (c - n % 26 >='a'){str[i] = (char)(c - n % 26);}else{// 解密后不为小写字母了,通过循环小写字母处理为小写字母 str[i] = (char)(c - n % 26 + 26);}}elseif (c >= 'A' && c <='Z'){// c 为大写字母if (c - n % 26 >='A'){// 解密后还为大写字母str[i] = (char)(c - n % 26);}else{// 解密后不为大写字母了,循环大写字母,处理为大写字母str[i] = (char)(c - n % 26 + 26);}}else{// 不是字母,不加密str[i] = c;}}// 输出解密后的字符串printf("\nAfter decode: \n");puts(str);}int main(){char str[20];int n;printf("请输入字符串(以空格结束输入):\n");gets(str);printf("请输入密钥(1-25的整数):\n");scanf("%d", &n);printf("加密前的字符串为:%s\n", str);encode(str, n);printf("加密后的字符串为:%s\n", str);decode(str, n);printf("解密后的字符串为:%s\n", str);return 0;}```在上述代码中,加密函数`encode()`通过将字符串中的每个字符循环向后移动`n`位实现加密,解密函数`decode()`通过将字符串中的每个字符循环向前移动`n`位实现解密。
高质量C++/C 编程指南目录前言 (6)第1 章文件结构 (8)1.1 版权和版本的声明 (8)1.2 头文件的结构 (8)1.3 定义文件的结构 (8)1.4 头文件的作用 (8)1.5 目录结构 (8)第2 章程序的版式 (8)2.1 空行 (8)2.2 代码行 (8)2.3 代码行内的空格 (8)2.4 对齐 (8)2.5 长行拆分 (8)2.6 修饰符的位置 (8)2.7 注释 (8)2.8 类的版式 (8)第3 章命名规则 (8)3.1 共性规则 (8)3.2 简单的W INDOWS 应用程序命名规则 (8)3.3 简单的U NIX 应用程序命名规则 (8)第4 章表达式和基本语句 (8)4.1 运算符的优先级 (8)4.2 复合表达式 (8)4.3 IF 语句 (8)4.4 循环语句的效率 (8)4.5 FOR 语句的循环控制变量 (8)4.6 SWITCH 语句 (8)4.7 GOTO 语句 (8)第5 章常量 (8)5.1 为什么需要常量 (8)5.2 CONST 与#DEFINE 的比较 (8)5.3 常量定义规则 (8)第6 章函数设计.....6.1 参数的规则 (8)6.2 返回值的规则 (8)6.3 函数内部实现的规则 (8)6.4 其它建议 (8)6.5 使用断言 (8)6.6 引用与指针的比较 (8)第7 章内存管理 (8)7.1 内存分配方式 (8)7.2 常见的内存错误及其对策 (8)7.3 指针与数组的对比 (8)7.4 指针参数是如何传递内存的? (8)7.5 FREE 和DELETE 把指针怎么啦? (8)7.6 动态内存会被自动释放吗? (8)7.7 杜绝“野指针” (8)7.8 有了MALLOC/FREE 为什么还要NEW/DELETE ? (8)7.9 内存耗尽怎么办? (8)7.10 MALLOC/FREE 的使用要点 (8)7.11 NEW/DELETE 的使用要点 (8)7.12 一些心得体会 (8)第8 章C++函数的高级特性 (8)8.1 函数重载的概念 (8)8.2 成员函数的重载、覆盖与隐藏 (8)8.3 参数的缺省值 (8)8.4 运算符重载 (8)8.5 函数内联 (8)8.6 一些心得体会 (8)第9 章类的构造函数、析构函数与赋值函数 (8)9.1 构造函数与析构函数的起源 (8)9.2 构造函数的初始化表 (8)9.3 构造和析构的次序 (8)9.4 示例:类S TRING 的构造函数与析构函数 (8)9.5 不要轻视拷贝构造函数与赋值函数 (8)9.6 示例:类S TRING 的拷贝构造函数与赋值函数 (8)9.7 偷懒的办法处理拷贝构造函数与赋值函数 (8)9.8 如何在派生类中实现类的基本函数 (8)第10 章类的继承与组合 (8)10.1 继承 (8)10.2 组合 (8)第11 章其它编程经验 (8)11.1 使用CONST 提高函数的健壮性 (8)11.2 提高程序的效率 (8)11.3 一些有益的建议..........................................................................................................8 参考文献.................................................................................................................................8 附录A :C++/C 代码审查表................................................................................................8 附录B :C++/C 试题............................................................................................................8 附录C :C++/C 试题的答案与评分标准.................................................................... .. (8)前言软件质量是被大多数程序员挂在嘴上而不是放在心上的东西!除了完全外行和真正的编程高手外,初读本书,你最先的感受将是惊慌:“哇!我以前捏造的C++/C程序怎么会有那么多的毛病?”别难过,作者只不过比你早几年、多几次惊慌而已。