今天逛看雪论坛,看到有人推荐了一个网站,说里面有很多练手的东西,于是我就进去看了看。http://www.crackmes.de/,在这里感谢下提供网站的那位大牛。既然进去了,也就顺便找了个东西练手。话说好久都没有发表过文章了,于是我详细的分析了一个,在这里发表一下自己的逆向过程,如有不对的地方,希望大家指出来。
这个程序加了一个壳,但是很弱啊。直接用esp定律来到OEP,构建输入表的时候有点问题,我就没有脱了,直接找到关键的汇编代码处,进行分析吧。
0040135B . 68 95010000 PUSH 195 ; /ControlID = 195 (405.)
00401360 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401363 . E8 16030000 CALL <JMP.&user32.GetDlgItem> ; \GetDlgItem
00401368 . A3 90344000 MOV DWORD PTR DS:[403490],EAX
0040136D . 16 PUSH SS
0040136E . 81C3 8EA80800 ADD EBX,8A88E
00401374 . 42 INC EDX
00401375 . 83F2 3C XOR EDX,3C
00401378 . 83E2 00 AND EDX,0
0040137B . 17 POP SS ; 段寄存器更改
0040137C . 9C PUSHFD
0040137D . 58 POP EAX
0040137E . 25 00010000 AND EAX,100
00401383 . 0BC0 OR EAX,EAX
00401385 . F64424 01 01 TEST BYTE PTR SS:[ESP+1],1
0040138A . 0F85 D8010000 JNZ KeygenMe.00401568
00401390 . E8 A4020000 CALL KeygenMe.00401639
00401395 . 68 9C344000 PUSH KeygenMe.0040349C ; ASCII "thankyou"
0040139A . 6A 15 PUSH 15
0040139C . 6A 0D PUSH 0D
0040139E . FF35 90344000 PUSH DWORD PTR DS:[403490]
004013A4 . FFD0 CALL EAX
004013A6 . 8BD0 MOV EDX,EAX ; 获取字符串长度
004013A8 . 42 INC EDX ; 长度加1
004013A9 . C1E2 03 SHL EDX,3 ; 向左移3位,相当于乘上8,结果记为a
004013AC . BE 80000000 MOV ESI,80
004013B1 . 8D3C32 LEA EDI,DWORD PTR DS:[EDX+ESI] ; a加上常数0x80,记为b
004013B4 . 69D7 E6010000 IMUL EDX,EDI,1E6 ; b乘上0x1E6,结果记为c
004013BA . 83E6 00 AND ESI,0
004013BD . 87F2 XCHG EDX,ESI ; 将c的值放入esi
004013BF . 33D2 XOR EDX,EDX
004013C1 . 81FE 505D0100 CMP ESI,15D50 ; 判断esi的值是否大于0x15d50,大于则跳走
根据这一段可以逆推出字符串的最小长度,即:((0x15d50/0x1e6)-0x80)/8-1=6
004013C7 . 73 05 JNB SHORT KeygenMe.004013CE
004013C9 . E9 9A010000 JMP KeygenMe.00401568
004013CE > 83F8 0C CMP EAX,0C ; 字条串长度不能大于12个字符
004013D1 . 0F87 91010000 JA KeygenMe.00401568
004013D7 . 68 CC344000 PUSH KeygenMe.004034CC
004013DC . 68 9C344000 PUSH KeygenMe.0040349C ; ASCII "thankyou"
004013E1 E8 2A030000 CALL KeygenMe.00401710 ; 复制字符串到其它空间
004013E6 . 68 9C344000 PUSH KeygenMe.0040349C ; ASCII "thankyou"
004013EB . E8 60FDFFFF CALL KeygenMe.00401150
004013F0 . 50 PUSH EAX
004013F1 . B8 9C344000 MOV EAX,KeygenMe.0040349C ; ASCII "thankyou"
004013F6 . EB 06 JMP SHORT KeygenMe.004013FE
004013F8 > 8030 4E XOR BYTE PTR DS:[EAX],4E ; 对每个字符进变换
004013FB . D020 SHL BYTE PTR DS:[EAX],1
004013FD . 40 INC EAX
004013FE > 8038 00 CMP BYTE PTR DS:[EAX],0
00401401 .^ 75 F5 JNZ SHORT KeygenMe.004013F8
00401403 . 5F POP EDI
00401404 . 57 PUSH EDI
00401405 . 68 9C344000 PUSH KeygenMe.0040349C ; ASCII "tL^@JnBv"
0040140A . E8 D8FDFFFF CALL KeygenMe.004011E7 ; 关键CALL
0040140F . 8BD8 MOV EBX,EAX
00401411 . 53 PUSH EBX
00401412 . EB 3B JMP SHORT KeygenMe.0040144F
004011E7 /$ 55 PUSH EBP
004011E8 |. 8BEC MOV EBP,ESP
004011EA |. 53 PUSH EBX
004011EB |. 56 PUSH ESI
004011EC |. 33C0 XOR EAX,EAX
004011EE |. 40 INC EAX
004011EF |. 33DB XOR EBX,EBX
004011F1 |. 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
004011F4 |> 837D 0C 00 /CMP DWORD PTR SS:[EBP+C],0
004011F8 |. 74 3B |JE SHORT KeygenMe.00401235 ; 判断长度是否满足要求
004011FA |. 817D 0C B0150>|CMP DWORD PTR SS:[EBP+C],15B0
00401201 |. 77 05 |JA SHORT KeygenMe.00401208
00401203 |. 8B55 0C |MOV EDX,DWORD PTR SS:[EBP+C]
00401206 |. EB 05 |JMP SHORT KeygenMe.0040120D
00401208 |> BA B0150000 |MOV EDX,15B0
0040120D |> 2955 0C |SUB DWORD PTR SS:[EBP+C],EDX
00401210 |> 85D2 |/TEST EDX,EDX
00401212 |. 74 0C ||JE SHORT KeygenMe.00401220
00401214 |. 4A ||DEC EDX ; 长度减1
00401215 |. 33C9 ||XOR ECX,ECX ; ecx清0
00401217 |. 8A0E ||MOV CL,BYTE PTR DS:[ESI] ; 依次取各个字符
00401219 |. 03C1 ||ADD EAX,ECX ; 得到的值加上eax
0040121B |. 46 ||INC ESI
0040121C |. 03D8 ||ADD EBX,EAX ; 将结果存入ebx中
0040121E |.^ EB F0 |\JMP SHORT KeygenMe.00401210
00401220 |> B9 F1FF0000 |MOV ECX,0FFF1 ; 做除法
00401225 |. 33D2 |XOR EDX,EDX ; 将edx清0,便于保存结果
00401227 |. F7F1 |DIV ECX ; 进行除法
00401229 |. 52 |PUSH EDX
0040122A |. 8BC3 |MOV EAX,EBX ; 将ebx赋值给eax,进行下一轮除法
0040122C |. 33D2 |XOR EDX,EDX
0040122E |. F7F1 |DIV ECX ; 进行除法
00401230 |. 8BDA |MOV EBX,EDX ; 将结果放入ebx
00401232 |. 58 |POP EAX
00401233 |.^ EB BF \JMP SHORT KeygenMe.004011F4
00401235 |> C1E3 10 SHL EBX,10 ; 将ebx左移16位
00401238 |. 0BC3 OR EAX,EBX ; 将eax接在ebx的后16位,形成一个32位的数
0040123A |. 5E POP ESI
0040123B |. 5B POP EBX
0040123C |. C9 LEAVE
0040123D \. C2 0800 RETN 8
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)