一款明码比较 keygenme 的不完全算法分析,果断日它一下。
本帖最后由 cxj98 于 2016-10-14 13:02 编辑所用到的工具推荐 x32dbg,我前几天有发布,看我发表过的主题可找到。
所用到的 KeyGenMe 获取方式1:叫 wgz001 王哥拿,不要告诉他是我告诉你的,不谢,我是雷锋。
KeygenMe 获取方式2: https://yunpan.cn/cvRunwiJbQGCm访问密码 e337
话说已经有一段时间消声匿迹在破解界中,完全忙碌于现状的中国生活环境下,所有工厂几乎都是2班倒 12个小时 + 1小时吃饭时间 + 早班提前10-15分钟打考勤卡 + 下午班提前 10-15分钟打考勤卡 + 晚班提前 10-15 分钟打卡,一天上班基本上要上14个小时,工资又低,还没有2500,于是国庆节就果断辞工了,现在失业在家等找其它工作。
不知道什么时候从某论坛淘到一款明码比较的 KeygenMe,这不在我的电脑硬盘里翻箱倒柜给找出来了,最近看到 wgz001 王哥在某论坛发了不少算法分析破文,一年多不见,感觉此牛功力大展不少,受其影响,遂无奈又想操弄旧业。
果断请出神器 x32dbg,载入 KeygenMe.exe, F9 加大马达跑起来,输入用户名:chixiaojie,假码:abcdefghijklmn,轻触 Register 按扭,妮玛,大白天跳出 "Wrong Code! Try Again !",差点把我吓出心脏病,不管它,直接搜索哪里闹鬼,发现:
004545D0 | 68 B8 46 45 00 | PUSH <keygenme1.sub_4546B8> | 4546B8:L"Wrong Code! Try Again !"
往上翻一翻,发现新线索有一处可以直接躲开它:
004545B2 | 75 15 | JNE keygenme1.4545C9 |
果断下断点,再往上翻一翻,一直翻到断首下断:
004544DC | 55 | PUSH EBP |
万事俱备,准备单挑。F9继续跑起来,看能否直达天堂,这中间省略N多,手算全是体力活,不解释,所有看过程:
004544DA <keygenme1 | 8B C0 | MOV EAX,EAX |
004544DC | 55 | PUSH EBP |
004544DD | 8B EC | MOV EBP,ESP |
004544DF | 33 C9 | XOR ECX,ECX |
004544E1 | 51 | PUSH ECX |
004544E2 | 51 | PUSH ECX |
004544E3 | 51 | PUSH ECX |
004544E4 | 51 | PUSH ECX |
004544E5 | 51 | PUSH ECX |
004544E6 | 53 | PUSH EBX |
004544E7 | 56 | PUSH ESI | esi:"<BE"
004544E8 | 8B F0 | MOV ESI,EAX | esi:"<BE"
004544EA | 33 C0 | XOR EAX,EAX |
004544EC | 55 | PUSH EBP |
004544ED | 68 0F 46 45 00 | PUSH <keygenme1.sub_45460F> |
004544F2 | 64 FF 30 | PUSH DWORD PTR FS: |
004544F5 | 64 89 20 | MOV DWORD PTR FS:,ESP |
004544F8 | 8D 55 F4 | LEA EDX,DWORD PTR SS: | :"chixiaojie"
004544FB | 8B 86 00 03 00 00 | MOV EAX,DWORD PTR DS: |
00454501 | E8 BA D6 FD FF | CALL <keygenme1.sub_431BC0> |
00454506 | 8B 55 F4 | MOV EDX,DWORD PTR SS: | :"chixiaojie"
00454509 | 8B C6 | MOV EAX,ESI | esi:"<BE"
0045450B | 8B 08 | MOV ECX,DWORD PTR DS: |
0045450D | FF 51 18 | CALL DWORD PTR DS: |
00454510 | 8B 45 FC | MOV EAX,DWORD PTR SS: |
00454513 | E8 F4 FB FA FF | CALL <keygenme1.sub_40410C> |
00454518 | 33 DB | XOR EBX,EBX |
0045451A | 8B 46 08 | MOV EAX,DWORD PTR DS: | :"chixiaojie" <- 将用户名给 eax
0045451D | E8 EA FB FA FF | CALL <keygenme1.sub_40410C> |
00454522 | 85 C0 | TEST EAX,EAX |
00454524 | 7E 13 | JLE keygenme1.454539 |
00454526 | BA 01 00 00 00 | MOV EDX,1 | <- 设循环次数的初始值为1
0045452B | 8B 4E 08 | MOV ECX,DWORD PTR DS: | <- 里存放着用户名传递给 ECX
0045452E | 0F B6 4C 11 FF | MOVZX ECX,BYTE PTR DS: | <- 逐位获取用户名 ASCII
00454533 | 03 D9 | ADD EBX,ECX | <- EBX=EBX+ECX EBX初始值为0,用户名 ascii 的累加和
00454535 | 42 | INC EDX | <- 循环次数
00454536 | 48 | DEC EAX | <- 用户名长度递减,直到减完为止。
00454537 | 75 F2 | JNE keygenme1.45452B | <- 一直循环,直到完毕才执行下一步
00454539 | 83 C3 53 | ADD EBX,53 |
0045453C | 81 C3 2A C6 87 47 | ADD EBX,4787C62A |
00454542 | 8B C3 | MOV EAX,EBX | <- EAX = (用户名 ascii 累加和) + 53 + 0x4787C62A
00454544 | B9 19 00 00 00 | MOV ECX,19 | <- 设 ECX 初始值为 0x19
00454549 | 99 | CDQ | <- 将双字数据扩展为四字节,该指令先把edx的每一位置成eax的最高位(若eax>=0x80000000, 则edx=0xFFFFFFFF;若eax<0x80000000,则edx=0x00000000) ,再把edx扩展为eax的高位。
0045454A | F7 F9 | IDIV ECX | <- IDIV ECX 就是 EAX / ECX,商数放在 EAX,余数放在 EDX (这里的 ECX 初始值 = 19)
0045454C | 8B D8 | MOV EBX,EAX | <- EBX = EAX
0045454E | 81 C3 78 A4 6A D7 | ADD EBX,D76AA478 | <- EBX = EBX + 0xD76AA478
00454554 | C1 E3 03 | SHL EBX,3 | <- 将 EBX 的值左移3位,相当于 EBX = EBX * 8 (左移1位 * 2,左移2位 * 4,左移3位 * 8,以此类推,就是 2 的平方)
00454557 | D1 EB | SHR EBX,1 | <- 将 EBX 的值右移1位,相当于 EBX = EBX / 2
00454559 | 69 C3 05 84 08 08 | IMUL EAX,EBX,8088405 | <- EAX = EBX * 0x8088405
0045455F | 8B D8 | MOV EBX,EAX |
00454561 | 8B C3 | MOV EAX,EBX |
00454563 | B9 9F 86 01 00 | MOV ECX,1869F | <- 设 ECX 初始值 = 0x1869F
00454568 | 99 | CDQ | <- 将双字数据扩展为四字节,该指令先把edx的每一位置成eax的最高位(若eax>=0x80000000, 则edx=0xFFFFFFFF;若eax<0x80000000,则edx=0x00000000) ,再把edx扩展为eax的高位。
00454569 | F7 F9 | IDIV ECX | <- IDIV ECX 就是 EAX / ECX,商数放在 EAX,余数放在 EDX (这里的 ECX 初始值 = 0x1869F,余数 = EAX Mod ECX)
0045456B | 8B D8 | MOV EBX,EAX | <- 将 EAX 传递给 EBX
0045456D | 81 C3 78 A4 6A D7 | ADD EBX,D76AA478 | <- EBX = EBX + 0xD76AA478
00454573 | 8B C3 | MOV EAX,EBX | <- 将 EBX 传递给 EAX
00454575 | F7 EB | IMUL EBX | <- EBX = EBX * EAX
00454577 | 69 C0 13 46 30 A8 | IMUL EAX,EAX,A8304613 | <- EAX = EAX * 0xA8304613
0045457D | 8B D8 | MOV EBX,EAX | <- 将 EAX 值传递给 EBX
0045457F | 8D 55 F0 | LEA EDX,DWORD PTR SS: | :"-1735924981"
00454582 | 8B C3 | MOV EAX,EBX | 77171854E137A7F89887E30B
00454584 | E8 C7 36 FB FF | CALL <keygenme1.sub_407C50> | <- 这个暂时不知道什么 Call,目测可能是固定字符串
00454589 | 8B 4D F0 | MOV ECX,DWORD PTR SS: | <- 有符号 "-1735924981" 存放在
0045458C | 8D 45 F8 | LEA EAX,DWORD PTR SS: | :"43694E31-1735924981"
0045458F | BA 24 46 45 00 | MOV EDX,keygenme1.454624 | <- 固定字符串 "43694E31"
00454594 | E8 BF FB FA FF | CALL <keygenme1.sub_404158> |
00454599 | 8D 55 EC | LEA EDX,DWORD PTR SS: | <- 假码 "abcdefghijklmn" 存放在
0045459C | 8B 86 04 03 00 00 | MOV EAX,DWORD PTR DS: |
004545A2 | E8 19 D6 FD FF | CALL <keygenme1.sub_431BC0> | <- 路过此地,可能是固定字符 "43694E31" 连接上面的 "-1735924981"
004545A7 | 8B 55 EC | MOV EDX,DWORD PTR SS: | <- 获取假唐僧 "abcdefghijklmn"
004545AA | 8B 45 F8 | MOV EAX,DWORD PTR SS: | <- 哟西真码佛现身 "43694E31-1735924981"
004545AD | E8 A6 FC FA FF | CALL <keygenme1.sub_404258> | <- 这个还用说,真假码比较 Call
004545B2 | 75 15 | JNE keygenme1.4545C9 | <- 相等继续运行上天堂,不相符阻止上天堂只能跳下地狱。
004545B4 | 6A 40 | PUSH 40 | <- 天堂门入口,玉皇大帝欢迎你!
004545B6 | 68 30 46 45 00 | PUSH <keygenme1.sub_454630> | 454630:L"Congratulation"
004545BB | 68 50 46 45 00 | PUSH <keygenme1.sub_454650> | 454650:L"Congratulation !! ,Now Write Keygen "
004545C0 | 6A 00 | PUSH 0 |
004545C2 | E8 A5 1F FB FF | CALL <keygenme1.MessageBoxW> |
004545C7 | EB 13 | JMP keygenme1.4545DC |
004545C9 | 6A 10 | PUSH 10 | <- 地狱门入口,阎王等着你!
004545CB | 68 9C 46 45 00 | PUSH keygenme1.45469C | 45469C:L"Oh no no ..."
004545D0 | 68 B8 46 45 00 | PUSH <keygenme1.sub_4546B8> | 4546B8:L"Wrong Code! Try Again !"
004545D5 | 6A 00 | PUSH 0 |
004545D7 | E8 90 1F FB FF | CALL <keygenme1.MessageBoxW> |
004545DC | 33 C0 | XOR EAX,EAX |
004545DE | 5A | POP EDX |
004545DF | 59 | POP ECX |
004545E0 | 59 | POP ECX |
004545E1 | 64 89 10 | MOV DWORD PTR FS:,EDX |
004545E4 | 68 16 46 45 00 | PUSH <keygenme1.sub_454616> |
004545E9 | 8D 45 EC | LEA EAX,DWORD PTR SS: | :"abcdefghijklmn"
004545EC | E8 5B F8 FA FF | CALL <keygenme1.sub_403E4C> |
004545F1 | 8D 45 F0 | LEA EAX,DWORD PTR SS: | :"-1735924981"
004545F4 | E8 53 F8 FA FF | CALL <keygenme1.sub_403E4C> |
004545F9 | 8D 45 F4 | LEA EAX,DWORD PTR SS: | :"chixiaojie"
004545FC | E8 4B F8 FA FF | CALL <keygenme1.sub_403E4C> |
00454601 | 8D 45 F8 | LEA EAX,DWORD PTR SS: | :"43694E31-1735924981"
00454604 | BA 02 00 00 00 | MOV EDX,2 |
00454609 | E8 62 F8 FA FF | CALL <keygenme1.sub_403E70> |
0045460E | C3 | RET |
最终算出注册码为 43694E31-1735924981,算法是 固定字符 + 有符号(十六进制码),Congratulation !! ,Now Write Keygen 玉皇大帝等着你们的到来。本破文系不完全分析,可能某些注释有误,若发现,还请大牛们指正。
本帖最后由 cqr2287 于 2016-10-16 11:25 编辑
好吧,挺好的算法分析。回头我也拿来练练算法分析 98大牛,确实消失好长时间了,终于又见到你破文了 感谢分享,学习一下。 又见牛了,谢谢分享 楼主应该把小软件放上来,我等菜鸟看着破文比着操练一下。 怎么老是滑动验证失败呢?! 干的漂亮 。话说 如此技术 为何 只有不到 2500 薪资 厉害了我的哥 我也想知道为何工资只有2500 大牛为何工资这么点?现如今做逆向的收入很高啊(专门吃这碗饭的)
页:
[1]
2