一点小意见,不知对否…… (3千字)
与我同时出道的随风而去[CNCG]兄今天终于搞出了他的第一个算法,实在是可喜可贺!呵呵,我看了看,但居然发现有一些地方还存在问题,最奇怪的是我跟踪过程中看到的地址竟完全不同,不过指令大致一样,所以写了出来,望大家多多指教。具体跟踪过程及取注册码风兄已说得很清楚,在此不再哆嗦,只是我跟的地址有所不同,所以我干脆一步到位,下bpx GETDLGITEMTEXTA断点,再按一下F12就到达程序领空,不用按10次F10,然后跟进风兄提及到的第一个Call中。
0177:015C2F90 SUB ESP,BYTE +28
0177:015C2F93 PUSH EBP
0177:015C2F94 MOV EBP,[ESP+30]
0177:015C2F98 TEST EBP,EBP
0177:015C2F9A PUSH EDI
0177:015C2F9B JZ NEAR 015C30CA
0177:015C2FA1 MOV EDX,[ESP+38]
0177:015C2FA5 TEST EDX,EDX
0177:015C2FA7 JZ NEAR 015C30CA
0177:015C2FAD MOV EDI,EBP
0177:015C2FAF OR ECX,BYTE -01
0177:015C2FB2 XOR EAX,EAX
0177:015C2FB4 REPNE SCASB
0177:015C2FB6 NOT ECX
0177:015C2FB8 DEC ECX
0177:015C2FB9 JZ NEAR 015C30CA
0177:015C2FBF MOV EDI,EDX
0177:015C2FC1 OR ECX,BYTE -01
0177:015C2FC4 REPNE SCASB
0177:015C2FC6 NOT ECX
0177:015C2FC8 DEC ECX
0177:015C2FC9 JZ NEAR 015C30CA
0177:015C2FCF PUSH EBX
0177:015C2FD0 XOR BL,BL
0177:015C2FD2 MOV ECX,08
0177:015C2FD7 LEA EDI,[ESP+11]
0177:015C2FDB MOV [ESP+10],BL
0177:015C2FDF XOR EDX,EDX
0177:015C2FE1 REP STOSD
0177:015C2FE3 MOV EDI,EBP
0177:015C2FE5 OR ECX,BYTE -01
0177:015C2FE8 REPNE SCASB
0177:015C2FEA NOT ECX
0177:015C2FEC DEC ECX
0177:015C2FED PUSH ESI
0177:015C2FEE TEST ECX,ECX
0177:015C2FF0 MOV [ESP+3C],ECX
0177:015C2FF4 JNG 015C3000
0177:015C2FF6 MOV AL,[EDX+EBP] \\取用户名第一位字母十六进制值并存入al
0177:015C2FF9 XOR BL,AL \\al与bl相异或,结果存入bl
0177:015C2FFB INC EDX \\edx的值递增,初值为0
0177:015C2FFC CMP EDX,ECX \\取完一位后edx的值变1,与ecx比较,(ecx值为用户名长度)
0177:015C2FFE JL 015C2FF6 \\当edx小于ecx时跳到上面继续取用户名,至取完后则跳
0177:015C3000 XOR ESI,ESI \\这里esi清零
0177:015C3002 CMP ESI,BYTE +08 \\奇怪的是上面清零后esi当然不可能等于8
0177:015C3005 JL 015C300E \\我跟到这里是不跳的,只有改变跳转才能去到计注册码的地方?
0177:015C3007 LEA EAX,[ECX+ECX]
0177:015C300A CMP ESI,EAX
0177:015C300C JNL 015C3075
0177:015C300E MOV EDI,EBP
0177:015C3010 OR ECX,BYTE -01
0177:015C3013 XOR EAX,EAX
0177:015C3015 REPNE SCASB
0177:015C3017 MOV EAX,ESI
0177:015C3019 CDQ
0177:015C301A NOT ECX
0177:015C301C SUB EAX,EDX
0177:015C301E DEC ECX
0177:015C301F SAR EAX,1
0177:015C3021 XOR EDX,EDX
0177:015C3023 DIV ECX
0177:015C3025 CMP ESI,BYTE +01
0177:015C3028 MOV EDI,EDX
0177:015C302A JNG 015C3031
0177:015C302C LEA EAX,[ESI-01]
0177:015C302F JMP SHORT 015C3033
0177:015C3031 XOR EAX,EAX
0177:015C3033 MOV CL,[ESP+EAX+14]
0177:015C3037 XOR CL,BL
0177:015C3039 XOR CL,8D
0177:015C303C MOV BL,CL
0177:015C303E MOV [ESP+10],BL
0177:015C3042 MOV EDX,[ESP+10]
0177:015C3046 PUSH EDX
0177:015C3047 CALL 015C2F40
0177:015C304C MOV ECX,[ESP+40]
0177:015C3050 MOV [ESP+ESI+18],AL
0177:015C3054 SUB ECX,EDI
0177:015C3056 MOV DL,[ECX+EBP-01]
0177:015C305A XOR DL,AL
0177:015C305C XOR DL,D8
0177:015C305F PUSH EDX
0177:015C3060 CALL 015C2F40
0177:015C3065 MOV ECX,[ESP+44]
0177:015C3069 ADD ESP,BYTE +08
0177:015C306C MOV [ESP+ESI+15],AL
0177:015C3070 ADD ESI,BYTE +02
0177:015C3073 JMP SHORT 015C3002
0177:015C3075 MOV ESI,[ESP+40]\\经过上面的跳转已经来到这里,假注册出现
0177:015c3079 lea eax, dword ptr [esp+14] //这里存放了真的注册码,下d esp+14
总结:跟了一遍,发现与风兄所写的有很大出入,不知是否我的Winamp版本问题?
我的注册名和注册码:
CNCG
rApCpHu9
谨以此文献给我的好朋友风兄!
