TA的每日心情 | 开心 2017-10-25 13:07 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|
本人菜鸟一个,有什么错误的地方请指正!
可能有些地方没有说明白,请慢慢吸收:loveliness:
00401540 . 83EC 18 SUB ESP,18
00401543 . 53 PUSH EBX
00401544 . 33C0 XOR EAX,EAX
00401546 . 55 PUSH EBP
00401547 . 56 PUSH ESI
00401548 . 894424 19 MOV DWORD PTR SS:[ESP+19],EAX
0040154C . BE 01000000 MOV ESI,1
00401551 . 57 PUSH EDI
00401552 . 8BD9 MOV EBX,ECX
00401554 . 894424 21 MOV DWORD PTR SS:[ESP+21],EAX
00401558 . 56 PUSH ESI
00401559 . 895C24 14 MOV DWORD PTR SS:[ESP+14],EBX
0040155D . C64424 20 00 MOV BYTE PTR SS:[ESP+20],0
00401562 . 884424 29 MOV BYTE PTR SS:[ESP+29],AL
00401566 . E8 CF030000 CALL <JMP.&MFC42.#6334>
0040156B . 8B4B 60 MOV ECX,DWORD PTR DS:[EBX+60] ; 取假注册码
0040156E . 8B51 F8 MOV EDX,DWORD PTR DS:[ECX-8]
00401571 . 83FA 0B CMP EDX,0B
00401574 . 7D 18 JGE SHORT 0040158E
00401576 . 6A 00 PUSH 0
00401578 . 6A 00 PUSH 0
0040157A . 68 64304000 PUSH 00403064
0040157F . 8BCB MOV ECX,EBX
00401581 . E8 AE030000 CALL <JMP.&MFC42.#4224>
00401586 . 5F POP EDI
00401587 . 5E POP ESI
00401588 . 5D POP EBP
00401589 . 5B POP EBX
0040158A . 83C4 18 ADD ESP,18
0040158D . C3 RETN
0040158E > 0FBE01 MOVSX EAX,BYTE PTR DS:[ECX] ; 取假注册码的十六进制 (1)
00401591 . 8D7A FD LEA EDI,DWORD PTR DS:[EDX-3] ; 注册码的位数减去3
00401594 . 894424 14 MOV DWORD PTR SS:[ESP+14],EAX ; 把取假注册码的十六进制数 esp+14 保存 (固定值)
00401598 . 897C24 18 MOV DWORD PTR SS:[ESP+18],EDI ; 把每次edx-3注册码的位数保存
0040159C > 0FBE2C31 MOVSX EBP,BYTE PTR DS:[ECX+ESI] ; 取注册码的十六进制数
004015A0 . 03C6 ADD EAX,ESI ; 把取的第一个注册码加esi
004015A2 . 25 FF000000 AND EAX,0FF ; 这个是小写转大写的
004015A7 . 33C5 XOR EAX,EBP ; 把取的第一个注册码加+esi与取的第二个注册码 或
004015A9 . 46 INC ESI ; 循环加一
004015AA . 3BF7 CMP ESI,EDI
004015AC .^ 7E EE JLE SHORT 0040159C
004015AE . 0FBE7411 FE MOVSX ESI,BYTE PTR DS:[ECX+EDX-2] ; 取注册码的倒数第二位 (1)
004015B3 . 83C0 42 ADD EAX,42 ; 把前8注册码计算的数加上42
004015B6 . 8BF8 MOV EDI,EAX
004015B8 . C1FF 04 SAR EDI,4 ; 把相加的结果右移4
004015BB . 83C7 41 ADD EDI,41 ; 右移的后加上41
004015BE . 3BF7 CMP ESI,EDI ; 结果比较
004015C0 . 74 18 JE SHORT 004015DA
004015C2 . 6A 00 PUSH 0
004015C4 . 6A 00 PUSH 0
004015C6 . 68 58304000 PUSH 00403058
004015CB . 8BCB MOV ECX,EBX
004015CD . E8 62030000 CALL <JMP.&MFC42.#4224> ; 提示错误
004015D2 . 5F POP EDI
004015D3 . 5E POP ESI
004015D4 . 5D POP EBP
004015D5 . 5B POP EBX
004015D6 . 83C4 18 ADD ESP,18
004015D9 . C3 RETN
004015DA > 0FBE5411 FF MOVSX EDX,BYTE PTR DS:[ECX+EDX-1] ; 取最后一位注册码 (2)
004015DF . 83E0 0F AND EAX,0F ; eax=65 和0F进行与计算
004015E2 . 83C0 41 ADD EAX,41 ; 再加上41
004015E5 . 3BD0 CMP EDX,EAX ; 进行比较
004015E7 . 74 18 JE SHORT 00401601
004015E9 . 6A 00 PUSH 0
004015EB . 6A 00 PUSH 0
004015ED . 68 58304000 PUSH 00403058
004015F2 . 8BCB MOV ECX,EBX
004015F4 . E8 3B030000 CALL <JMP.&MFC42.#4224>
004015F9 . 5F POP EDI
004015FA . 5E POP ESI
004015FB . 5D POP EBP
004015FC . 5B POP EBX
004015FD . 83C4 18 ADD ESP,18
00401600 . C3 RETN
00401601 > BD 01000000 MOV EBP,1
00401606 . 33FF XOR EDI,EDI
00401608 . 8BF5 MOV ESI,EBP
0040160A . 8D51 01 LEA EDX,DWORD PTR DS:[ECX+1] ; 取注册码
0040160D . 2BF1 SUB ESI,ECX
0040160F > 8A0A MOV CL,BYTE PTR DS:[EDX] ; 从注册码第二位开始取十六进制 (2)
00401611 . 8D0416 LEA EAX,DWORD PTR DS:[ESI+EDX]
00401614 . 0FBE5A 01 MOVSX EBX,BYTE PTR DS:[EDX+1] ; 取注册码位数+1的注册码
00401618 . 83E1 0F AND ECX,0F ; 取的第一位注册码和0F进行与计算
0040161B . C1E1 04 SHL ECX,4 ; 结果逻辑左移4
0040161E . D1F8 SAR EAX,1 ; 注册码位数算术左移1
00401620 . 8D4C19 AF LEA ECX,DWORD PTR DS:[ECX+EBX-51] ; 这个是把左移4的ecx+取的第二位注册码的和减去51,把结果设A
00401624 . 8B5C24 14 MOV EBX,DWORD PTR SS:[ESP+14] ; 把先前取的注册码第二位十六进制数 (固定值)
00401628 . 83C0 06 ADD EAX,6 ; 位数加6
0040162B . 8D4403 FF LEA EAX,DWORD PTR DS:[EBX+EAX-1] ; 把先前取的第一位注册码十六进制数加上eax-1
0040162F . 25 FF000000 AND EAX,0FF ; 结果与0FF进行与计算,结果设为B
00401634 . 33C8 XOR ECX,EAX ; A与B 进行异或计算
00401636 . 83F9 20 CMP ECX,20 ; 结果与20H比较
00401639 . 0F8C AF000000 JL 004016EE ; 小于20H就跳
0040163F . 81F9 80000000 CMP ECX,80 ; 与80H比较
00401645 . 0F8F A3000000 JG 004016EE ; 大于80H就跳
0040164B . 884C3C 1C MOV BYTE PTR SS:[ESP+EDI+1C],CL ; 把计算结果保存
0040164F . 8B4C24 18 MOV ECX,DWORD PTR SS:[ESP+18]
00401653 . 83C5 02 ADD EBP,2 ; 循环次数加2
00401656 . 83C2 02 ADD EDX,2 ; 注册码加2 每次取二个注册码
00401659 . 47 INC EDI ; edi+1
0040165A . 41 INC ECX ; ecx+1
0040165B . 3BE9 CMP EBP,ECX
0040165D .^ 7E B0 JLE SHORT 0040160F
0040165F . 83FF 02 CMP EDI,2
00401662 . 7D 1A JGE SHORT 0040167E
00401664 . 8B4C24 10 MOV ECX,DWORD PTR SS:[ESP+10]
00401668 . 6A 00 PUSH 0
0040166A . 6A 00 PUSH 0
0040166C . 68 48304000 PUSH 00403048
00401671 . E8 BE020000 CALL <JMP.&MFC42.#4224>
00401676 . 5F POP EDI
00401677 . 5E POP ESI
00401678 . 5D POP EBP
00401679 . 5B POP EBX
0040167A . 83C4 18 ADD ESP,18
0040167D . C3 RETN
0040167E > 8D7C24 1C LEA EDI,DWORD PTR SS:[ESP+1C]
00401682 . 83C9 FF OR ECX,FFFFFFFF ; 9与FFFFFFFF 进行或
00401685 . 33C0 XOR EAX,EAX ; 清零
00401687 . F2:AE REPNE SCAS BYTE PTR ES:[EDI]
00401689 . F7D1 NOT ECX
0040168B . 49 DEC ECX
0040168C . 83F9 03 CMP ECX,3
0040168F . 7D 18 JGE SHORT 004016A9
00401691 . 8B4C24 10 MOV ECX,DWORD PTR SS:[ESP+10]
00401695 . 50 PUSH EAX
00401696 . 50 PUSH EAX
00401697 . 68 3C304000 PUSH 0040303C
0040169C . E8 93020000 CALL <JMP.&MFC42.#4224>
004016A1 . 5F POP EDI
004016A2 . 5E POP ESI
004016A3 . 5D POP EBP
004016A4 . 5B POP EBX
004016A5 . 83C4 18 ADD ESP,18
004016A8 . C3 RETN
004016A9 > 6A 02 PUSH 2 ; /maxlen = 2
004016AB . 8D540C 1D LEA EDX,DWORD PTR SS:[ESP+ECX+1D] ; |
004016AF . 68 38304000 PUSH 00403038 ; |s2 = "PS"
004016B4 . 52 PUSH EDX ; |s1
004016B5 . FF15 B4214000 CALL DWORD PTR DS:[<&MSVCRT.strncmp>] ; \strncmp
004016BB . 83C4 0C ADD ESP,0C
004016BE . 85C0 TEST EAX,EAX
004016C0 . 6A 00 PUSH 0
004016C2 . 6A 00 PUSH 0
004016C4 . 74 07 JE SHORT 004016CD
004016C6 . 68 3C304000 PUSH 0040303C
004016CB . EB 05 JMP SHORT 004016D2
004016CD > 68 2C304000 PUSH 0040302C
004016D2 > 8B7424 1C MOV ESI,DWORD PTR SS:[ESP+1C]
004016D6 . 8BCE MOV ECX,ESI
004016D8 . E8 57020000 CALL <JMP.&MFC42.#4224>
004016DD . 6A 00 PUSH 0
004016DF . 8BCE MOV ECX,ESI
004016E1 . E8 54020000 CALL <JMP.&MFC42.#6334>
004016E6 . 5F POP EDI
004016E7 . 5E POP ESI
004016E8 . 5D POP EBP
004016E9 . 5B POP EBX
004016EA . 83C4 18 ADD ESP,18
004016ED . C3 RETN
004016EE > 8B4C24 10 MOV ECX,DWORD PTR SS:[ESP+10]
004016F2 . 6A 00 PUSH 0
004016F4 . 6A 00 PUSH 0
004016F6 . 68 20304000 PUSH 00403020
004016FB . E8 34020000 CALL <JMP.&MFC42.#4224>
00401700 . 5F POP EDI
00401701 . 5E POP ESI
00401702 . 5D POP EBP
00401703 . 5B POP EBX
00401704 . 83C4 18 ADD ESP,18
00401707 . C3 RETN
分析结果:
这个算法分成二个部分判断
第一部分:
用一个假注册码来解释 12345678910 ,取前8位假注册码比如23456789进行计算的和(计算过程从绿(1)开始),再进行计算的和和假注册码的倒数第二位比较相等不(计算过程从我标注的红(1)开始),不相等提示错误。然后再用23456789计算和,再进行计算的和和最后一位假注册码进行比较是否相等(计算过程从红(2)开始),不相等提示错误。
问题:
1、很奇怪的就是为什么注册码是从第二位开始取而不是第一位开始取,第一个注册码到哪里去了?是什么作用?
第二部分:
这部分的算法就更夸张了,从绿(2)开始:还是用一个假注册码解释 12345678910,这个算法每次取二个注册码进行计算,在和一个固定值进行计算。在这里我饶了很久后来发现一个问题一个字符串"PS",后来发现注册码最后三个组合的计算必须等于字符串“PS(” 比如: 23 45 57 89 10
P(50H) S(53H) ((28H)
总结:
1、注册码最后二位必须为红(1)红(2)
2、注册码最后六位的注册码两位组合计算的字符串味"PS("
最后还是没有把注册码找出来/:013 |
|