老文章档案 · 2003 年

NMI's Java Code Viewer 4.8.2的注册码

破解教程 · 算法分析 · 2003-10-09 · 作者:郭大志 人气: · 出处:赢政天下整理收藏)

首先加载snjrt11.dll的符号表,这个DLL从名字上看似为Sun的Java Run Time支撑库。

用bpx MultiByteToWideChar设断点,因为Java程序和VB程序一样,也是用WideChar形式的字符串。

之后再用BPR断点监视WideChar形式的注册码,发现它把你输入的注册码转换成一个整数,

再用BPR或BPM断点监视这个整数,就到了生成注册码的程序段。

一个可用的注册码为:

Name: Me

Country: China

Code: 1605226644

下面的程序段生成并比较注册码。可见,写一个注册机也并非不可能。

0167:0040FD2C SUB ESP,18

0167:0040FD2F PUSH EBX

0167:0040FD30 PUSH EBP

0167:0040FD31 PUSH ESI

0167:0040FD32 PUSH EDI

0167:0040FD33 MOV ECX,[ESP+3C]

0167:0040FD37 MOV EBP,EAX

0167:0040FD39 MOV [ESP+10],EAX

0167:0040FD3D MOV ESI,[ESP+34]

0167:0040FD41 MOV EDI,[ESP+38]

0167:0040FD45 MOV EBX,[ECX]

0167:0040FD47 CMP DWORD PTR [ESP+2C],00

0167:0040FD4C JNZ 0040FD76

0167:0040FD4E MOV EDX,[SNJRT11!$Classjava_lang_String]

0167:0040FD54 MOV ECX,[EBX+04]

0167:0040FD57 PUSH EDX

0167:0040FD58 PUSH ECX

0167:0040FD59 MOV EAX,[00427F00]

0167:0040FD5E CMP EAX,00000000

0167:0040FD63 MOV EDX,[EBX+04]

0167:0040FD66 MOV ECX,[EDX+04]

0167:0040FD69 CALL [ECX+44]

0167:0040FD6C PUSH EAX

0167:0040FD6D CALL SNJRT11!__j_checkcast@8

0167:0040FD72 MOV [ESP+2C],EAX

0167:0040FD76 TEST EBP,EBP

0167:0040FD78 JNZ 0040FDA0

0167:0040FD7A MOV EDX,[SNJRT11!$Classjava_lang_String]

0167:0040FD80 MOV ECX,[EBX+04]

0167:0040FD83 PUSH EDX

0167:0040FD84 PUSH ECX

0167:0040FD85 MOV EAX,[00427F44]

0167:0040FD8A CMP EAX,00000000

0167:0040FD8F MOV EDX,[EBX+04]

0167:0040FD92 MOV ECX,[EDX+04]

0167:0040FD95 CALL [ECX+44]

0167:0040FD98 PUSH EAX

0167:0040FD99 CALL SNJRT11!__j_checkcast@8

0167:0040FD9E MOV EBP,EAX

0167:0040FDA0 MOV EAX,[ESP+30]

0167:0040FDA4 TEST EAX,EAX

0167:0040FDA6 JNZ 0040FDB2

0167:0040FDA8 MOV DWORD PTR [ESP+14],00000000

0167:0040FDB0 JMP 0040FDC1

0167:0040FDB2 MOV EAX,[ESP+30]

0167:0040FDB6 MOV EDX,[EAX]

0167:0040FDB8 CALL SNJRT11!$java_lang_Integer_intValue__

0167:0040FDBD MOV [ESP+14],EAX

0167:0040FDC1 MOV [ESP+10],EBP

0167:0040FDC5 MOV ECX,[SNJRT11!$Classjava_lang_StringBuffer]

0167:0040FDCB PUSH ECX

0167:0040FDCC CALL SNJRT11!__j_new@4

0167:0040FDD1 CALL SNJRT11!$java_lang_StringBuffer__4init_5__

0167:0040FDD6 MOV [ESP+18],EAX

0167:0040FDDA PUSH EAX

0167:0040FDDB MOV EAX,EDI

0167:0040FDDD CALL SNJRT11!$java_lang_StringBuffer_append__Ljava_lang_Stri

0167:0040FDE2 MOV EDX,[ESP+18]

0167:0040FDE6 MOV EAX,ESI

0167:0040FDE8 PUSH EDX

0167:0040FDE9 CALL SNJRT11!$java_lang_StringBuffer_append__Ljava_lang_Stri

0167:0040FDEE CALL SNJRT11!$java_lang_StringBuffer_toString__

0167:0040FDF3 MOV [ESP+1C],EAX

0167:0040FDF7 MOV EAX,EDI

0167:0040FDF9 MOV ECX,[EDI]

0167:0040FDFB CALL SNJRT11!$java_lang_String_hashCode__

0167:0040FE00 MOV [ESP+20],EAX

0167:0040FE04 MOV EAX,ESI

0167:0040FE06 MOV EDX,[ESI]

0167:0040FE08 CALL SNJRT11!$java_lang_String_hashCode__

0167:0040FE0D MOV [ESP+24],EAX

0167:0040FE11 MOV EAX,[ESP+1C]

0167:0040FE15 MOV ECX,[EAX]

0167:0040FE17 CALL SNJRT11!$java_lang_String_hashCode__

0167:0040FE1C MOV EBP,[ESP+20]

0167:0040FE20 IMUL EBP,[ESP+24]

0167:0040FE25 MOV EDX,[ESP+1C]

0167:0040FE29 ADD EBP,EAX

0167:0040FE2B MOV ECX,[EDX]

0167:0040FE2D SUB EBP,[ECX+08]

0167:0040FE30 JNS 0040FE34

0167:0040FE32 NEG EBP

0167:0040FE34 CMP [ESP+14],EBP //这里比较注册码!!!!

0167:0040FE38 JNZ 0040FF1F

//Note: only English characters allowed.

// so you can't use your Chinese name :-(

#include <stdio.h>

#include <string.h>

long java_lang_String_hashCode(char *str);

void main(void)

{

char Name[128];

char Country[128];

long NameCode, CountryCode, AllCode, Code;

printf("KeyGen for NMI's Java Code Viewer 4.8.2.\n");

printf("Input your name: ");

gets(Name);

printf("Input your country: ");

gets(Country);

NameCode = java_lang_String_hashCode(Name);

CountryCode = java_lang_String_hashCode(Country);

AllCode = java_lang_String_hashCode(strcat(Name, Country));

Code = NameCode * CountryCode + AllCode;

Code -= strlen(Name);

if (Code < 0)

{

Code = -Code;

}

printf("You code: %lu\n", Code);

}

long java_lang_String_hashCode(char *str)

{

int k, len, edi,step;

long result;

if (str == NULL)

{

return 0;

}

result = 0;

len = strlen(str);

if (len < 0x10)

{

for (k = 0; k < len; k++)

{

result *= 37;

result += (long)str[k] & 0xFF;

}

}

else

{

k = 0;

step = (len >> 3);

edi = len;

do

{

edi -= step;

result *= 0x27;

result += (long)str[k];

k += step;

} while (edi > 0);

}

return result;

} (出处:赢政天下整理收藏)

相关文章:

·语音界面2.0算法分析及注册机源码!

·侠客系统修改器1.21破解手记--算法分析

·中文拨号上网计时计费器 V4.12注册算法分析

·ClockWise 3.22e注册码算法分析

·CoolClock V1.02注册算法分析

·Directory Scanner v1.5 注册算法分析

·Disk Chief 1.2 简单注册算法分析

·EffeTech HTTP Sniffer 3.2注册算法分析

·eLib2.01算法分析

·EZ MP3 Recorder 1.15 注册算法分析

相关软件:

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)

| 广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright © 1999-2003

winzheng.com All Rights Reserved.

繁体版:由华琦数码技术提供

Powered

by:MeSky.Net

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史