或者谁能破了它?
- 标 题:谁有winhex9.4的注册码? (16字)
- 作 者:isno
- 时 间:2000-6-23 15:30:49/font>
- 链 接:http://bbs.pediy.com/showthread.php?t=118497
或者谁能破了它?
试试这个注册码:
CODE1:78907
CODE2:580966
发信人: shizg (刀客☆永远的痛), 信区: Hacker
标 题: Winhex的破解,大家感兴趣么?新版本也不怕哟
发信站: BBS 水木清华站 (Fri Jun 9 09:47:56 2000)
winhex这个编辑器功能很强大,可以改ram。当初出来新版本而老注册号不能用时,
只好自己解决。好像从9.1*版本到现在的9.41,我都是这么做的,连跟踪都不用做,
找特征串,几分钟就搞定。有了注册码,不知大家还感不感兴趣,还是贴出来,
供参考。遇到新版本也可以试试。
要求:W32dasm,任意16进制编辑器,呵呵,比如老版本的winhex:)
下面以V9.25版为例,关键代码如下:
:00448611 mov dword ptr [2*edi+0044B8A6], eax
:00448618 jmp WINHEX.00448680
:0044861A mov eax, dword ptr [0044D180]
:0044861F call WINHEX.0042C608
:00448624 cmp eax, dword ptr [0044D184]
1 :0044862A jne 0044864A ->*******此处让它跳到0044864E,即不用做下面的比较
16进制751E改为EB22。4E-2C=22为跳的长度
:0044862C cmp byte ptr [0044E95D], 00
2 :00448633 jne 0044864E ->*******就是上面要改的地址
:00448635 mov al, 03
:00448637 call WINHEX.0040B5AC
:0044863C not ax
:0044863F movzx eax, ax
:00448642 cmp eax, dword ptr [0044D15C]
:00448648 je 0044864E
:0044864A xor eax, eax
:0044864C jmp WINHEX.00448650
3 :0044864E mov al, 01 ->********跳到这里,要赋值了
4 :00448650 mov byte ptr [0044EE8B], al ->****记下0044EE8B,它就是整个程序
判断的特征地址。如为1表示注册过,因此将程
序中所有mov byte ptr [0044EE8B], 00都让它
赋1
例如:
:00438111 call WINHEX.004049F8
:00438116 mov dword ptr [0044FCD4], eax
:0043811B call WINHEX.0043679C
:00438120 cmp byte ptr [edi+0000189F], 00
:00438127 je 00438130
:00438129 mov byte ptr [0044EE8B], 00 ***一个需要改的地方
:00438130 push 00000000
:00438132 mov eax, dword ptr [0044B00C]
上面是代码,拿到一个新版本,先用w32dasm反编译,然后:
1。搜索特征串mov dword ptr [2*edi+
只有一个,找到下面的jne处,改为强制跳转,例如改为jmp 0044864e,
跳转长度16进制一减就可以。
2。看0044864e处将al=1赋值给什么地址,如0044ee8b,记下
3。查找所有赋0语句,例如mov byte ptr [0044EE8B], 00
很快找到一个,记下其16进制机器码,例如c6058bee440000,就不用找了。
全部将其替换为c6058bee440001
4。随便一个16进制编辑器,修改即可。
标题: 实际上在cfg里面存有code和使用次数。我最初也用这方法,但无新版本code,只好用前面的方法。从9.1开始我都这么干的:)
内容:
这是我最早跟9.04版时,发现cfg文件的
: 0x90开始是winhex运行的次数.
: 0xa8开始是输入的两个code的二进制,例如8.85版本的就是:
: 81030100160e08
: 0x10381就是66433,0x80e16就是527894
BTW:这里可真是一个好地方,我也是一只菜鸟,多请教:)
http://www.winhex.com
输入注册码之后关闭该程序,然后用bpx GetVolumeInformationA设断点,
等中断下来后按两次F12,看见如下的判断:
0167:0044E150 MOV AL,03
0167:0044E152 CALL 0040BEF8
//这里头调用GetVolumeInformationA
0167:0044E157 NOT AX
0167:0044E15A MOVZX EAX,AX
0167:0044E15D CMP EAX,[0045321C]
0167:0044E163 JNZ 0044E186
0167:0044E165 MOV EAX,00453258
0167:0044E16A SUB EAX,08
0167:0044E16D SUB EAX,10
0167:0044E170 MOV EAX,[EAX]
//取出code1
0167:0044E172 CALL 0042E9E0
//检查code1,并计算code2
0167:0044E177 MOV EDX,00453258
0167:0044E17C SUB EDX,04
0167:0044E17F SUB EDX,10
0167:0044E182 CMP EAX,[EDX]
//比较真假code2
0167:0044E184 JZ 0044E18A
0167:0044E186 XOR EAX,EAX
//bad flag
0167:0044E188 JMP 0044E18C
0167:0044E18A MOV AL,01
//good flag
0167:0044E18C MOV EDX,00455384
0167:0044E191 INC EDX
0167:0044E192 MOV [EDX],AL
//set a flag
0167:0044E194 JMP 0044E1DD
上面的CALL 0042E9E0中会检查code1的合法性,如果合法则返回计算出来的code2,否则返回-1。
对code1的检查是比较麻烦的,如果有兴趣可以跟踪一下,大致上是这样的:求code1的平方,并将该平方值转换为字符串,
再将串的首字符和尾字符去掉,得到一个新串,再将新串转换成整数,然后再进行其它处理。
MOV [EDX], AL这条指令会设一个标志,用BPM EDX设断点监视此标志,很快看见如下的判断,是用来检查code1的:
0167:0043D279 CMP BYTE PTR [00455385],00
0167:0043D280 JNZ 0043D29F
0167:0043D282 CMP DWORD PTR [EDI+00000088],02
0167:0043D289 JLE 0043D29F
0167:0043D28B PUSH 00
0167:0043D28D PUSH 000DBBA0
0167:0043D292 PUSH 02
0167:0043D294 MOV EAX,[004562B0]
0167:0043D299 PUSH EAX
0167:0043D29A CALL USER32!SetTimer
0167:0043D29F LEA EAX,[EDI+000000E0]
0167:0043D2A5 SUB EAX,08
0167:0043D2A8 MOV EAX,[EAX]
//取出code1
0167:0043D2AA MOV [00455424],EAX
0167:0043D2AF CMP DWORD PTR [00455424],000D9038
0167:0043D2B9 JG 0043D31C
0167:0043D2BB CMP DWORD PTR [00455424],00008235
0167:0043D2C5 JL 0043D31C
0167:0043D2C7 MOV EAX,[00455424]
0167:0043D2CC MOV EBX,000003E8
0167:0043D2D1 CDQ
0167:0043D2D2 IDIV EBX
0167:0043D2D4 CMP EDX,00000247
0167:0043D2DA JZ 0043D31C
0167:0043D2DC MOV EAX,[00455424]
0167:0043D2E1 MOV EBX,000003E8
0167:0043D2E6 CDQ
0167:0043D2E7 IDIV EBX
0167:0043D2E9 CMP EDX,00000315
0167:0043D2EF JZ 0043D31C
0167:0043D2F1 MOV EAX,[00455424]
0167:0043D2F6 MOV EBX,000003E8
0167:0043D2FB CDQ
0167:0043D2FC IDIV EBX
0167:0043D2FE CMP EDX,7B
0167:0043D301 JZ 0043D31C
0167:0043D303 MOV EAX,[00455424]
0167:0043D308 MOV ECX,00000064
0167:0043D30D CDQ
0167:0043D30E IDIV ECX
0167:0043D310 MOV ECX,EDX
0167:0043D312 CMP ECX,07
0167:0043D315 JZ 0043D327
0167:0043D317 CMP ECX,54
0167:0043D31A JZ 0043D327
0167:0043D31C MOV EAX,004553A0
0167:0043D321 SUB EAX,1B
0167:0043D324 MOV BYTE PTR [EAX],00
//bad guy!
0167:0043D327 XOR EAX,EAX
根据上面的代码可知code1还要满足如下几个条件:
1、code1取值范围为[0x8235,0xD9038];
2、code1除以1000的余数不能等于0x247或者0x315或者0x7B;
3、code1除以100的余数必须为7或者0x54。
经过几次试探就可以找到合适的code1,继而得到对应的code2。
code1: 111184
code2: 785826
dr0/China