【著述标题】: ReHPer KeyGenMe v1.0分析 【著述作家】: 隐者无疆[BCG] 【作家邮箱】: xxx@yahoo.com 【作家主页】: hxxp://www.xxxx.com 【软件称呼】: ReHPer KeyGenMe v1.0 【软件大小】: 372K 【下载地址】: 【加壳形貌】: 无壳 【保护形貌】: Name+SN 【编写话语】: Borland Delphi 【使用用具】: OD,IDA,DeDe 【操作平台】: Windows 【软件先容】: 2/10 - Needs a little brain (or luck) 【作家声明】: 我是一只小菜鸟,偶有所得,愿与各人共享。 -------------------------------------------------------------------------------- 【详备历程】 未必间,在crackmes.de上看到了这个CM,发现作家的想路有独有之处。现公布我的分析,失当之处宽容指正。 1.Peid侦壳,显现“Borland Delphi 6.0 - 7.0”。 2.用Dede分析,找到check按钮对应的代码;IDA分析该段代码。 3.贴出重要代码如下: .text:00454D0A mov [ebp+NameOpRst], 1 ; initialize .text:00454D11 lea edx, [ebp+szName] .text:00454D14 mov eax, [ebp+hForm1] .text:00454D17 mov eax, [eax+36Ch] .text:00454D1D call Controls::TControl::GetText(void) .text:00454D1D .text:00454D22 mov eax, [ebp+szName] .text:00454D25 lea edx, [ebp+szName_Lower] .text:00454D28 call Sysutils::LowerCase(System::AnsiString) .text:00454D28 .text:00454D2D mov eax, [ebp+szName_Lower] .text:00454D30 test eax, eax .text:00454D32 jz short NullName .text:00454D32 .text:00454D34 sub eax, 4 .text:00454D37 mov eax, [eax] ; eax<-- NameLen .text:00454D37 .text:00454D39 .text:00454D39 NullName: ; CODE XREF: Button1Click+56j .text:00454D39 add al, 2 ;谛视这个处所,用户名的长度加2,这里很重要 .text:00454D3B test al, al .text:00454D3D jbe short _text_454D60 .text:00454D3D .text:00454D3F mov dl, 1 .text:00454D3F .text:00454D41 .text:00454D41 GoOn: ; CODE XREF: Button1Click+82j .text:00454D41 movzx ecx, dl ;\ 这一部分代码用于顾问输入的Name 以及 .text:00454D44 mov ebx, [ebp+szName_Lower] ;| 内存中Name字符串后头的两个字节 .text:00454D47 movzx ecx, byte ptr [ebx+ecx-1] ;| 作家在这里给咱们等着咱们 .text:00454D4C add [ebp+NameOpRst], ecx ;| 对于这一部分,底下有具体分析 .text:00454D4F mov ecx, [ebp+NameOpRst] ;| .text:00454D52 ror ecx, 6 ;| 通过这个轮回的狡计,取得一个整数值 .text:00454D55 add ecx, 1 ;| 记作 val .text:00454D58 mov [ebp+NameOpRst], ecx ;| .text:00454D5B inc edx ;| .text:00454D5C dec al ;| .text:00454D5E jnz short GoOn ;/ .text:00454D5E .text:00454D60 .text:00454D60 _text_454D60: ; CODE XREF: Button1Click+61j .text:00454D60 not [ebp+NameOpRst] .text:00454D63 xor eax, eax .text:00454D65 pop edx .text:00454D66 pop ecx .text:00454D67 pop ecx .text:00454D68 mov fs:[eax], edx .text:00454D6B jmp short GetText2 。。。 .text:00454DA1 GetText2: ; CODE XREF: Button1Click+8Fj .text:00454DA1 lea edx, [ebp+szText2] .text:00454DA4 mov eax, [ebp+hForm1] .text:00454DA7 mov eax, [eax+370h] .text:00454DAD call Controls::TControl::GetText(void) .text:00454DAD .text:00454DB2 mov eax, [ebp+szText2] .text:00454DB5 push eax .text:00454DB6 mov eax, [ebp+NameOpRst] ;前边狡计取得的val .text:00454DB9 xor edx, edx .text:00454DBB push edx .text:00454DBC push eax .text:00454DBD lea edx, [ebp+HexVal] ;val十六进制值对应的字符串,记作sn1 .text:00454DC0 mov eax, 8 .text:00454DC5 call Sysutils::IntToHex(__int64,int) .text:00454DC5 .text:00454DCA lea eax, [ebp+HexVal] .text:00454DCD push eax .text:00454DCE lea eax, [ebp+szComputerName] ;狡计机名,记作 sn2 .text:00454DD1 call _text_454C9C ; GetComputerName .text:00454DD1 .text:00454DD6 mov edx, [ebp+szComputerName] .text:00454DD9 pop eax .text:00454DDA call System::__linkproc__ LStrCat(void) ; sn1+sn2 .text:00454DDA .text:00454DDF mov edx, [ebp+HexVal] ; sn1+sn2 .text:00454DE2 pop eax ; 输入的序列号 .text:00454DE3 call System::__linkproc__ LStrCmp(void) .text:00454DE3 .text:00454DE8 jnz short Failed .text:00454DE8 .text:00454DEA push 40h ; uType .text:00454DEC mov eax, ds:_bss_45C5A4 .text:00454DF1 call System::__linkproc__ LStrToPChar(System::AnsiString) .text:00454DF1 .text:00454DF6 push eax ; lpCaption .text:00454DF7 push offset s_GoodWorkWrite ; "Good work! Write keygen! :)" .text:00454DFC mov eax, [ebp+hForm1] .text:00454DFF call _text_43E414 .text:00454DFF .text:00454E04 push eax ; hWnd .text:00454E05 call MessageBoxA_0 .text:00454E05 .text:00454E0A jmp short End 4.转头一下性爱巴士剧情,注册考证的历程:通过一个轮回顾问输入的 用户名 和 在内存中紧跟自后的两个字节(!!), 取得一个整数值,这个整数十六进制数值转成字符串即为序列号的第一部分s1;取狡计机名为序列号的第二部分sn2 sn1和sn2平直连结,即得正确的序列号。 5. 问题是 在内存中紧跟用户名后的两个字节是什么? 领先,内存中紧跟用户名后的第一个字节为 “\0”,即字符串以0收尾。 那么,内存中紧跟用户名后的第二个字节呢? 很灾难,这个字节的值基本上是立时的。不外万幸的是咱们不错想 一个目标让它不得不取“定值”。 内存中的本色会按四字节对都,因此输入用户名的存储地址细目是4的倍数。读入的name被存放在一段闲置的内存 空间中,同期底本的数据被隐私。在OD中不雅察转存区发现,被隐私的部分要么底本即是"\0",要么是长度为三个字节 的内存地址。是以,淌若咱们实现用户名的长度为 4*n+2(n=0,1,2,3,4,5),则内存中紧跟用户名后的第二个字节 细目为"\0"。 6.对输入的用户名作上述规定后,注册机编写就相比简便了。 作家说:Needs a little brain (or luck),我想其中的luck即是输入的用户名长度偶合称心上述要求,呵呵 -------------------------------------------------------------------------------- 【版权声明】: 本文原创于看雪时代论坛, 转载请注明作家并保合手著述的竣工, 谢谢! 2006年12月25日 12:28:37
最新四色米奇影视777在线看[谛视]传递专科常识、拓宽行业东谈主脉——看雪讲师团队等你加入!性爱巴士剧情
上传的附件: rehper keygenme v1.0 keygen.rar (31.25kb,6次下载)