0x0 环境
——————–
环境:
系统:Windows 10
工具:Ollydbg
——————–
0x1 跑起来
这玩意要求输入邮件地址和序列号,随便输入弹出对话框提示“Registration failure.”

0x2 IDA分析
这玩意加了壳。。。。不过看字符串里面发现有MessageBoxA的字符串。


0x3 Ollydbg分析
用OD载入程序后对MessageBoxA函数ret处下cc断点后点击OK可以看到OD在函数尾部断下来了。

F8一下MessageBoxA的上层返回出是在000A1300

返回到此处看下当前栈窗口可以知道当前函数上层都是user32的代码空间所以猜测找到当前函数头看看上面有什么内容。

网上翻阅找到字符串“Your E-mail address in not valid.”

找到一个很关键的地方,OD分析出在000A10AF处给ESI的值为GetDlgItemTextA函数的地址,并且在000A10CA和000A10DE处有对ESI进行CALL调用,此处肯定就是拿邮件地址和序列号的地方了。在往上翻就到了当前函数头了。

000A10CA处拿到的是输入的邮件地址

000A10DE处拿到的是输入的序列号。

000A10AF 8B35 10C10A00 mov esi,dword ptr ds:[AC110] ; user32.GetDlgItemTextA 000A10B5 8D85 C0FCFFFF lea eax,dword ptr ss:[ebp-340] 000A10BB 83C4 24 add esp,24 000A10BE 68 00010000 push 100 000A10C3 50 push eax 000A10C4 68 E9030000 push 3E9 000A10C9 53 push ebx 000A10CA FFD6 call esi ; 获取输入的邮件地址 000A10CC 68 00010000 push 100 000A10D1 8D85 C0FDFFFF lea eax,dword ptr ss:[ebp-240] 000A10D7 50 push eax 000A10D8 68 EA030000 push 3EA 000A10DD 53 push ebx 000A10DE FFD6 call esi ; 获取输入的序列号 000A10E0 8D85 C0FCFFFF lea eax,dword ptr ss:[ebp-340] 000A10E6 68 0CFD0A00 push yyys.000AFD0C ; 参数二: "@" 000A10EB 50 push eax ; 参数一: 输入的邮件地址 000A10EC E8 AF020000 call yyys.000A13A0 ; 猜测为检查输入的邮件地址中是否包含了@字符集 000A10F1 83C4 08 add esp,8 000A10F4 85C0 test eax,eax 000A10F6 74 4C je short yyys.000A1144 ; 没有包含就跳转到000A1144 "Your E-mail address in not valid." 000A10F8 8D85 C0FCFFFF lea eax,dword ptr ss:[ebp-340] 000A10FE 68 34FD0A00 push yyys.000AFD34 ; 参数二: "." 000A1103 50 push eax ; 参数一: 输入的邮件地址 000A1104 E8 97020000 call yyys.000A13A0 ; 猜测为检查输入的邮件地址中是否包含了.字符集 000A1109 83C4 08 add esp,8 000A110C 85C0 test eax,eax 000A110E 74 34 je short yyys.000A1144 000A1110 8D85 C0FCFFFF lea eax,dword ptr ss:[ebp-340] 000A1116 68 34FD0A00 push yyys.000AFD34 000A111B 50 push eax 000A111C E8 7F020000 call yyys.000A13A0 ; 这个检查和上面一样 000A1121 83C4 08 add esp,8 000A1124 8078 01 00 cmp byte ptr ds:[eax+1],0 000A1128 74 1A je short yyys.000A1144 000A112A 8D85 C0FCFFFF lea eax,dword ptr ss:[ebp-340] 000A1130 68 0CFD0A00 push yyys.000AFD0C 000A1135 50 push eax 000A1136 E8 65020000 call yyys.000A13A0 ; 这个检查和上面一样 000A113B 83C4 08 add esp,8 000A113E 8078 01 2E cmp byte ptr ds:[eax+1],2E 000A1142 75 0A jnz short yyys.000A114E 000A1144 68 10FD0A00 push yyys.000AFD10 ; ASCII "Your E-mail address in not valid." 000A1149 E9 57010000 jmp yyys.000A12A5 000A114E 66:0F6F05 70FD0A00 movq mm0,qword ptr ds:[AFD70] 000A1156 8D8D C0FDFFFF lea ecx,dword ptr ss:[ebp-240] 000A115C F3: prefix rep: 000A115D 0F7F45 E4 movq qword ptr ss:[ebp-1C],mm0 000A1161 8D51 01 lea edx,dword ptr ds:[ecx+1] 000A1164 C745 F4 6C757265 mov dword ptr ss:[ebp-C],6572756C 000A116B 66:0F6F05 60FD0A00 movq mm0,qword ptr ds:[AFD60] 000A1173 F3: prefix rep: ; 这一大段不知道计算啥没细看 000A1174 0F7F45 C0 movq qword ptr ss:[ebp-40],mm0 000A1178 66:C745 F8 2E00 mov word ptr ss:[ebp-8],2E 000A117E 66:0F6F05 50FD0A00 movq mm0,qword ptr ds:[AFD50] 000A1186 F3: prefix rep: 000A1187 0F7F45 D0 movq qword ptr ss:[ebp-30],mm0 000A118B C745 E0 69733A00 mov dword ptr ss:[ebp-20],3A7369 000A1192 8A01 mov al,byte ptr ds:[ecx] 000A1194 41 inc ecx ; 计算输入序列号的长度 000A1195 84C0 test al,al 000A1197 ^ 75 F9 jnz short yyys.000A1192 000A1199 2BCA sub ecx,edx 000A119B 83F9 10 cmp ecx,10 000A119E 0F85 FD000000 jnz yyys.000A12A1 ; 序列号必须满足16位字符否则注册失败 000A11A4 80BD C0FDFFFF 42 cmp byte ptr ss:[ebp-240],42 ; [ebp-240]保存输入的序列号,判断序列号第一个字符是否为‘B’ 000A11AB 0F85 F0000000 jnz yyys.000A12A1 ; 不是则检查失败 000A11B1 0FBE85 CFFDFFFF movsx eax,byte ptr ss:[ebp-231] 000A11B8 83C0 42 add eax,42 000A11BB 3D 9B000000 cmp eax,9B ; 检查最后一个字符+0x42是否等于0x9B 000A11C0 0F85 DB000000 jnz yyys.000A12A1 ; 不是0x9B检查失败 000A11C6 0FBE8D C1FDFFFF movsx ecx,byte ptr ss:[ebp-23F] 000A11CD 8D41 FD lea eax,dword ptr ds:[ecx-3] 000A11D0 83F8 57 cmp eax,57 ; 检查第二个字符-0x3是否为0x57 000A11D3 0F85 C8000000 jnz yyys.000A12A1 ; 不是则检查失败 000A11D9 0FBE85 CEFDFFFF movsx eax,byte ptr ss:[ebp-232] 000A11E0 03C1 add eax,ecx 000A11E2 3D 9B000000 cmp eax,9B ; 检查倒数第二个字符+第二个字符0x5A是否为0x9B 000A11E7 0F85 B4000000 jnz yyys.000A12A1 ; 不是则检查失败 000A11ED 0FBE8D C2FDFFFF movsx ecx,byte ptr ss:[ebp-23E] 000A11F4 8D41 01 lea eax,dword ptr ds:[ecx+1] 000A11F7 83F8 3A cmp eax,3A ; 检查第三个字符+1是否为0x3A 000A11FA 0F85 A1000000 jnz yyys.000A12A1 ; 不是则检查失败 000A1200 0FBE85 CDFDFFFF movsx eax,byte ptr ss:[ebp-233] 000A1207 03C1 add eax,ecx 000A1209 3D 9B000000 cmp eax,9B ; 检查倒数第三个字符+第三个字符是否为0x9B 000A120E 0F85 8D000000 jnz yyys.000A12A1 ; 不是则检查失败 000A1214 80BD C3FDFFFF 64 cmp byte ptr ss:[ebp-23D],64 ; 检查第四个字符是否为0x64 000A121B 0F85 80000000 jnz yyys.000A12A1 000A1221 0FBE85 CCFDFFFF movsx eax,byte ptr ss:[ebp-234] 000A1228 83C0 64 add eax,64 000A122B 3D 9B000000 cmp eax,9B ; 检查倒数第四个字符+0x64是否为0x9B 000A1230 75 6F jnz short yyys.000A12A1 000A1232 80BD C4FDFFFF 6D cmp byte ptr ss:[ebp-23C],6D ; 检查第五个字符是否为0x6D 000A1239 75 66 jnz short yyys.000A12A1 000A123B 0FBE85 CBFDFFFF movsx eax,byte ptr ss:[ebp-235] 000A1242 05 81000000 add eax,81 000A1247 3D C8000000 cmp eax,0C8 ; 检查倒数第五个字符+0x81是否为0xC0 000A124C 75 53 jnz short yyys.000A12A1 000A124E 0FBE8D C5FDFFFF movsx ecx,byte ptr ss:[ebp-23B] 000A1255 8D41 D3 lea eax,dword ptr ds:[ecx-2D] 000A1258 83F8 44 cmp eax,44 ; 检查第六个字符-0x2D是否为0x44 000A125B 75 44 jnz short yyys.000A12A1 000A125D 0FBE85 CAFDFFFF movsx eax,byte ptr ss:[ebp-236] 000A1264 03C1 add eax,ecx 000A1266 3D AA000000 cmp eax,0AA ; 检查倒数第六个字符+第六个字符是否为0xAA 000A126B 75 34 jnz short yyys.000A12A1 000A126D 80BD C6FDFFFF 34 cmp byte ptr ss:[ebp-23A],34 ; 检查第七个字符是否为0x34 000A1274 75 2B jnz short yyys.000A12A1 000A1276 0FBE85 C9FDFFFF movsx eax,byte ptr ss:[ebp-237] 000A127D 83C0 34 add eax,34 000A1280 3D 9B000000 cmp eax,9B ; 检查倒数第七个字符+0x34是否为0x9B 000A1285 75 1A jnz short yyys.000A12A1 000A1287 80BD C7FDFFFF 63 cmp byte ptr ss:[ebp-239],63 ; 检查第八个字符是否为0x63 000A128E 75 11 jnz short yyys.000A12A1 000A1290 0FBE85 C8FDFFFF movsx eax,byte ptr ss:[ebp-238] 000A1297 83C0 63 add eax,63 000A129A 3D 9B000000 cmp eax,9B ; 检查倒数第八个字符+0x63是否为0x9B 000A129F 74 1A je short yyys.000A12BB 000A12A1 8D45 E4 lea eax,dword ptr ss:[ebp-1C] 000A12A4 50 push eax 000A12A5 8D85 C0FEFFFF lea eax,dword ptr ss:[ebp-140] 000A12AB 68 00010000 push 100 000A12B0 50 push eax 000A12B1 E8 4D030000 call yyys.000A1603 ; 注册失败提示 000A12B6 83C4 0C add esp,0C 000A12B9 EB 30 jmp short yyys.000A12EB 000A12BB 8D45 C0 lea eax,dword ptr ss:[ebp-40] 000A12BE 50 push eax 000A12BF 8D85 C0FEFFFF lea eax,dword ptr ss:[ebp-140] 000A12C5 68 00010000 push 100 000A12CA 50 push eax 000A12CB E8 33030000 call yyys.000A1603 ; 注册成功提示
0x04后记
这个调试起来没什么难度,输入的 地址纯粹只是个检查是否满足为邮件地址并没有什么算法并且序列号也是写死的“BZ9dmq4c8g9G7bAY”即可注册成功。这么简单的猜谜为什么要加一个壳呢。。
发表评论