E-钻文件夹加密大师V8.30算法分析
作者:lchhome
首先发现它加了UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo的壳,很容易手脱,并修复输入表就可以了,简述一下。
用OD载入程序,利用插件,可以找到“请输入用户名和注册码”这个提示,双击,如下:
004B823B 6A 00 PUSH 0
004B823D 68 DC834B00 PUSH 12_.004B83DC ; 提示
004B8242 68 E4834B00 PUSH 12_.004B83E4 ; 请输入用户名和注册码
004B8247 8BC3 MOV EAX,EBX
004B8249 E8 72E9FAFF CALL 12_.00466BC0
004B824E 50 PUSH EAX
004B824F E8 54F3F4FF CALL <JMP.&user32.MessageBoxA>
004B8254 E9 29010000 JMP 12_.004B8382
004B8259 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
004B825C 50 PUSH EAX
004B825D 8D55 F0 LEA EDX,DWORD PTR SS:[EBP-10]
004B8260 8B83 F8020000 MOV EAX,DWORD PTR DS:[EBX+2F8]
004B8266 E8 4180FAFF CALL 12_.004602AC
004B826B 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
004B826E B9 06000000 MOV ECX,6
004B8273 BA 01000000 MOV EDX,1
004B8278 E8 23CBF4FF CALL 12_.00404DA0
004B827D 33C0 XOR EAX,EAX
004B827F 55 PUSH EBP
004B8280 68 62834B00 PUSH 12_.004B8362
004B8285 64:FF30 PUSH DWORD PTR FS:[EAX]
004B8288 64:8920 MOV DWORD PTR FS:[EAX],ESP
004B828B 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004B828E E8 710FF5FF CALL 12_.00409204 这个CALL是读取你输入的注册码 ,我就在这里按F2下断
004B8293 B9 03000000 MOV ECX,3 赋值ECX=3
004B8298 99 CDQ
004B8299 F7F9 IDIV ECX
004B829B 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14]
004B829E E8 250EF5FF CALL 12_.004090C8 这句CALL是把你的注册码整除3得到一个值,记为A吧
004B82A3 8B55 EC MOV EDX,DWORD PTR SS:[EBP-14]
004B82A6 A1 F41A4F00 MOV EAX,DWORD PTR DS:[4F1AF4]
004B82AB 8B00 MOV EAX,DWORD PTR DS:[EAX]
004B82AD E8 EA110300 CALL 12_.004E949C 跟进(1)典型的比较
004B82B2 84C0 TEST AL,AL
004B82B4 74 6D JE SHORT 12_.004B8323 相等则跳,不等则往下走
004B82B6 8D55 E8 LEA EDX,DWORD PTR SS:[EBP-18]
004B82B9 8B83 F8020000 MOV EAX,DWORD PTR DS:[EBX+2F8]
004B82BF E8 E87FFAFF CALL 12_.004602AC
004B82C4 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
004B82C7 BA 10844B00 MOV EDX,12_.004B8410 ; 4792597878n2n9n:im 这个值很奇怪哟
004B82CC E8 BBC9F4FF CALL 12_.00404C8C 跟进(2)
004B82D1 74 50 JE SHORT 12_.004B8323 相等则跳,跳则有你乐的!
004B82D3 A1 F41A4F00 MOV EAX,DWORD PTR DS:[4F1AF4]
004B82D8 8B00 MOV EAX,DWORD PTR DS:[EAX]
004B82DA 8B88 50040000 MOV ECX,DWORD PTR DS:[EAX+450]
004B82E0 B2 01 MOV DL,1
004B82E2 A1 60994300 MOV EAX,DWORD PTR DS:[439960]
004B82E7 E8 2417F8FF CALL 12_.00439A10
004B82EC 8BF0 MOV ESI,EAX
004B82EE 8D55 E0 LEA EDX,DWORD PTR SS:[EBP-20]
004B82F1 8B83 F8020000 MOV EAX,DWORD PTR DS:[EBX+2F8]
004B82F7 E8 B07FFAFF CALL 12_.004602AC
004B82FC 8B45 E0 MOV EAX,DWORD PTR SS:[EBP-20]
004B82FF 8D55 E4 LEA EDX,DWORD PTR SS:[EBP-1C]
004B8302 E8 F109F5FF CALL 12_.00408CF8
004B8307 8B45 E4 MOV EAX,DWORD PTR SS:[EBP-1C]
004B830A 50 PUSH EAX
004B830B B9 2C844B00 MOV ECX,12_.004B842C ; ASCII "zcm"
004B8310 BA 38844B00 MOV EDX,12_.004B8438 ; edia
004B8315 8BC6 MOV EAX,ESI
004B8317 8B18 MOV EBX,DWORD PTR DS:[EAX]
004B8319 FF53 04 CALL DWORD PTR DS:[EBX+4]
004B831C 8BC6 MOV EAX,ESI
004B831E E8 49B7F4FF CALL 12_.00403A6C
004B8323 B8 48844B00 MOV EAX,12_.004B8448 ; 感谢您的注册,软件现在将自动重新启动\n\n如果注册成功了,您会发现主程序界面上方的"软件注册"变灰了
004B8328 E8 BBAAF7FF CALL 12_.00432DE8
跟进(1)
004E949C 55 PUSH EBP
004E949D 8BEC MOV EBP,ESP
004E949F 33C9 XOR ECX,ECX
004E94A1 51 PUSH ECX
004E94A2 51 PUSH ECX
004E94A3 51 PUSH ECX
004E94A4 51 PUSH ECX
004E94A5 51 PUSH ECX
004E94A6 51 PUSH ECX
004E94A7 51 PUSH ECX
004E94A8 53 PUSH EBX
004E94A9 56 PUSH ESI
004E94AA 57 PUSH EDI
004E94AB 8955 FC MOV DWORD PTR SS:[EBP-4],EDX
004E94AE 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004E94B1 E8 7AB8F1FF CALL 12_.00404D30
004E94B6 33C0 XOR EAX,EAX
004E94B8 55 PUSH EBP
004E94B9 68 DD954E00 PUSH 12_.004E95DD
004E94BE 64:FF30 PUSH DWORD PTR FS:[EAX]
004E94C1 64:8920 MOV DWORD PTR FS:[EAX],ESP
004E94C4 33C0 XOR EAX,EAX
004E94C6 55 PUSH EBP
004E94C7 68 9F954E00 PUSH 12_.004E959F
004E94CC 64:FF30 PUSH DWORD PTR FS:[EAX]
004E94CF 64:8920 MOV DWORD PTR FS:[EAX],ESP
004E94D2 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004E94D5 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
004E94D8 E8 3BB4F1FF CALL 12_.00404918
004E94DD 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
004E94E0 E8 5BB6F1FF CALL 12_.00404B40
004E94E5 85C0 TEST EAX,EAX
004E94E7 0F8E 95000000 JLE 12_.004E9582
004E94ED 8945 EC MOV DWORD PTR SS:[EBP-14],EAX
004E94F0 BB 01000000 MOV EBX,1 EBX=1(初始值) 循环开始
004E94F5 8BFB MOV EDI,EBX ――――――――――――――――――――――――――――――
004E94F7 0FAFFB IMUL EDI,EBX EDI=EDI*EBX 这里的EDI 和EBX为依次加1
004E94FA 8BC7 MOV EAX,EDI
004E94FC F7EB IMUL EBX EBX初始值为1,依次加1
004E94FE 8D53 14 LEA EDX,DWORD PTR DS:[EBX+14] EDX=EBX+14
004E9501 8BCA MOV ECX,EDX ECX=EDX
004E9503 99 CDQ
004E9504 F7F9 IDIV ECX EAX整除ECX,这里的EAX的值=EBX*EBX*EBX,EBX初始值为1,依次加1,可从004E94FC、004E953A 、004E953C句看出
004E9506 8BF2 MOV ESI,EDX 余数移入ESI
004E9508 8BC7 MOV EAX,EDI
004E950A 8D53 0A LEA EDX,DWORD PTR DS:[EBX+A] EDX=EBX+A
004E950D 8BCA MOV ECX,EDX ECX=EDX
004E950F 99 CDQ
004E9510 F7F9 IDIV ECX 整除ECX
004E9512 03F2 ADD ESI,EDX ESI=ESI+EDX
004E9514 8BC3 MOV EAX,EBX
004E9516 03C0 ADD EAX,EAX EAX=EAX+EAX(EAX初始值为1,依次加1)
004E9518 03F0 ADD ESI,EAX ESI=ESI+EAX
004E951A 46 INC ESI
004E951B 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
004E951E 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
004E9521 0FB6541A FF MOVZX EDX,BYTE PTR DS:[EDX+EBX-1]
004E9526 03D6 ADD EDX,ESI EDX=EDX+ESI EDX的值为依次取A值(就是你的注册码整除3得到的数)的ASCII码
004E9528 E8 3BB5F1FF CALL 12_.00404A68
004E952D 8B55 E8 MOV EDX,DWORD PTR SS:[EBP-18] 得到n位的值
004E9530 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
004E9533 E8 10B6F1FF CALL 12_.00404B48
004E9538 8BC3 MOV EAX,EBX
004E953A F7EB IMUL EBX ×EBX
004E953C F7EB IMUL EBX ×EBX
004E953E 8D53 0A LEA EDX,DWORD PTR DS:[EBX+A] EDX=EBX+A
004E9541 8BCA MOV ECX,EDX ECX=EDX
004E9543 99 CDQ
004E9544 F7F9 IDIV ECX 整除ECX
004E9546 8BF2 MOV ESI,EDX
004E9548 8BC7 MOV EAX,EDI
004E954A 8D53 14 LEA EDX,DWORD PTR DS:[EBX+14] EDX=EBX+14
004E954D 8BCA MOV ECX,EDX
004E954F 99 CDQ
004E9550 F7F9 IDIV ECX 整除ECX
004E9552 03F2 ADD ESI,EDX ESI=ESI+EDX
004E9554 8BC3 MOV EAX,EBX
004E9556 03C0 ADD EAX,EAX EAX=EAX+EAX(EAX初始值为1,依次加1)
004E9558 03F0 ADD ESI,EAX ESI=ESI+EAX
004E955A 46 INC ESI
004E955B 8D45 E4 LEA EAX,DWORD PTR SS:[EBP-1C]
004E955E 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
004E9561 0FB6541A FF MOVZX EDX,BYTE PTR DS:[EDX+EBX-1]
004E9566 03D6 ADD EDX,ESI EDX=EDX+ESIEDX的值为依次取A值(就是你的注册码整除3得到的数)的ASCII码
004E9568 E8 FBB4F1FF CALL 12_.00404A68
004E956D 8B55 E4 MOV EDX,DWORD PTR SS:[EBP-1C] 得到n+1位的值
004E9570 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
004E9573 E8 D0B5F1FF CALL 12_.00404B48
004E9578 43 INC EBX
004E9579 FF4D EC DEC DWORD PTR SS:[EBP-14] 跳回,直至算完 循环结束
004E957C ^ 0F85 73FFFFFF JNZ 12_.004E94F5 ――――――――――――――――――――――――――――
004E9582 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10] 这里为最后算完的值移入EAX
004E9585 BA F8954E00 MOV EDX,12_.004E95F8 ; ASCII "66FFMJRXJELR" 这是软件赋于的固定值
004E958A E8 FDB6F1FF CALL 12_.00404C8C 典型的比较,把算出来的值与66FFMJRXJELR比较
004E958F 75 04 JNZ SHORT 12_.004E9595
跟进(2)
00404C8A 8BC0 MOV EAX,EAX
00404C8C 53 PUSH EBX
00404C8D 56 PUSH ESI
00404C8E 57 PUSH EDI
00404C8F 89C6 MOV ESI,EAX
00404C91 89D7 MOV EDI,EDX
00404C93 39D0 CMP EAX,EDX
00404C95 0F84 8F000000 JE 12_.00404D2A
00404C9B 85F6 TEST ESI,ESI
00404C9D 74 68 JE SHORT 12_.00404D07
00404C9F 85FF TEST EDI,EDI
00404CA1 74 6B JE SHORT 12_.00404D0E
00404CA3 8B46 FC MOV EAX,DWORD PTR DS:[ESI-4]
00404CA6 8B57 FC MOV EDX,DWORD PTR DS:[EDI-4]
00404CA9 29D0 SUB EAX,EDX
00404CAB 77 02 JA SHORT 12_.00404CAF
00404CAD 01C2 ADD EDX,EAX
00404CAF 52 PUSH EDX
00404CB0 C1EA 02 SHR EDX,2
00404CB3 74 26 JE SHORT 12_.00404CDB
00404CB5 8B0E MOV ECX,DWORD PTR DS:[ESI] 你的注册码前四位
00404CB7 8B1F MOV EBX,DWORD PTR DS:[EDI] “4792597878n2n9n:im”的前四位
00404CB9 39D9 CMP ECX,EBX 比较
00404CBB 75 58 JNZ SHORT 12_.00404D15 不等跳走
00404CBD 4A DEC EDX
00404CBE 74 15 JE SHORT 12_.00404CD5
00404CC0 8B4E 04 MOV ECX,DWORD PTR DS:[ESI+4] 你的注册码第五位至第八位
00404CC3 8B5F 04 MOV EBX,DWORD PTR DS:[EDI+4] “4792597878n2n9n:im”的第五位至第八位
00404CC6 39D9 CMP ECX,EBX 比较
00404CC8 75 4B JNZ SHORT 12_.00404D15 不等跳走
00404CCA 83C6 08 ADD ESI,8
00404CCD 83C7 08 ADD EDI,8
00404CD0 4A DEC EDX
00404CD1 ^ 75 E2 JNZ SHORT 12_.00404CB5
00404CD3 EB 06 JMP SHORT 12_.00404CDB
00404CD5 83C6 04 ADD ESI,4
00404CD8 83C7 04 ADD EDI,4
00404CDB 5A POP EDX
00404CDC 83E2 03 AND EDX,3
00404CDF 74 22 JE SHORT 12_.00404D03
00404CE1 8B0E MOV ECX,DWORD PTR DS:[ESI]
00404CE3 8B1F MOV EBX,DWORD PTR DS:[EDI]
00404CE5 38D9 CMP CL,BL 比较两者第九位
00404CE7 75 41 JNZ SHORT 12_.00404D2A 不等跳走,完了
00404CE9 4A DEC EDX
00404CEA 74 17 JE SHORT 12_.00404D03
00404CEC 38FD CMP CH,BH 比较两者第十位
00404CEE 75 3A JNZ SHORT 12_.00404D2A 不等跳走,完了
00404CF0 4A DEC EDX
00404CF1 74 10 JE SHORT 12_.00404D03
00404CF3 81E3 0000FF00 AND EBX,0FF0000
00404CF9 81E1 0000FF00 AND ECX,0FF0000
00404CFF 39D9 CMP ECX,EBX
00404D01 75 27 JNZ SHORT 12_.00404D2A
00404D03 01C0 ADD EAX,EAX
00404D05 EB 23 JMP SHORT 12_.00404D2A 返回
算法总结:
一、注册码和用户名无关;
二、注册码须十位;
三、注册码是根据字符串“66FFMJRXJELR”算出来,下面具体分析一下:
6 6 F F M J R X J E L R
ASCII码 36 36 46 46 4D 4A 52 58 4A 45 4C 52
EBX 1 2 3 4 5 6
EAX 1 2 3 4 5 6
EBX*EBX*EBX 1 8 1B 40 7D D8
ECX=EBX+14 15 16 17 18 19 1A
EDX1=MOD ECX 1 8 4 10 0 8
ECX=EBX+A B C D E F 10
EDX2=MOD ECX 1 4 9 2 A 4
EAX=EAX+EAX 2 4 6 8 A C
EDX=EDX2+EDX1 2 C D 12 A C
ESI=EAX+EDX 4 10 13 1A 14 18
EDX=ESI+1 5 11 14 1B 15 19
ASCII码-EDX 31 35 39 37 35 33
十进制 1 5 9 7 5 3
得到值159753,再×3=479259
再和字符串“4792597878n2n9n:im”比较,相等则取前十位,就是真注册码。
我认为软件作者在加密中,拿“4792597878n2n9n:im”这个字符串去比较可算是败笔!这样的话,前面的算法都是白搭,直接跟进004B82CC这个CALL就容易找到注册码!一点小见解!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)