前言:shark恒老师的一个cm2.2的逆向,学习到很多
总结:
1、当有隐藏文件的时候,我们一定要多看看,可能就是作者不想让我们看见的东西,类似以下
2、基于类似注册表之类的验证,我们可以用相应的工具进行监视,比如如下的工具
逆向过程:
1、最开始拿到软件的时候,就是先对其功能界面进行了解,测试发现,输入账号密码提示如下,然后它自动重启,发现还是在原来的界面,没有进行登陆
2、然后我们直接载入OD进行观察,最有效的发现线索就是直接查看字符串,利用智能搜索,查找相关信息,发现一些信息如下,这些都需要注意,很可能验证是基于注册表中进行验证的
3、那么我们就可以利用相应的工具来监视,来证明猜想是否正确,利用PRegMonitor4工具,确实证明了猜想
4、那么利用相应的API函数来下断点,我们这里可以用到RegQueryValueExA/W 来进行下断点
5、开始跑程序,进行多次F9,因为程序从注册表中获取的不只有账号和密码,还有其他的数据,然后F9到如下,然后执行到用户代码
6、走出当前的retn,来到第二个,发现没有什么真码假码的比较继续,执行到用户代码,来到如下
7、发现有多个关键的赋值
004515EC |. 8D4D FC lea ecx,[local.1]
004515EF |. BA 2C174500 mov edx,CM2_2.0045172C ; 用户名
004515F4 |. 8BC3 mov eax,ebx
004515F6 |. E8 C94AFDFF call CM2_2.004260C4
004515FB |. 8D4D F8 lea ecx,[local.2]
004515FE |. BA 3C174500 mov edx,CM2_2.0045173C ; 密码
00451603 |. 8BC3 mov eax,ebx
00451605 |. E8 BA4AFDFF call CM2_2.004260C4
0045160A |. 8BC3 mov eax,ebx
0045160C |. E8 5748FDFF call CM2_2.00425E68
00451611 |. 8BC3 mov eax,ebx
00451613 |. E8 6820FBFF call CM2_2.00403680
00451618 |. 837D FC 00 cmp [local.1],0x0
0045161C |. 0F84 AF000000 je CM2_2.004516D1
00451622 |. 837D F8 00 cmp [local.2],0x0
00451626 |. 0F84 A5000000 je CM2_2.004516D1
0045162C |. 8D45 F8 lea eax,[local.2]
0045162F |. 50 push eax
00451630 |. 8D45 FC lea eax,[local.1]
00451633 |. 50 push eax
00451634 |. 8D45 F4 lea eax,[local.3]
00451637 |. 50 push eax
00451638 |. E8 DBFEFFFF call
0045163D |. 8B45 F8 mov eax,[local.2] ; 密码赋值给eax
00451640 |. 8B55 F4 mov edx,[local.3] ; 可疑字符串赋值给edx
00451643 |. E8 B831FBFF call CM2_2.00404800 ; 关键CALL,比较了密码和可疑字符串
00451648 |. 0F85 83000000 jnz CM2_2.004516D1 ; 关键跳转受上面的CALL影响
进入关键CALL分析,发现可疑字符串就是真码,并且发现 真码的生成是€队蠹易仿耄
再加上3131313131
,31则是1的机器码,账号为11111,那么也认证了,并且比较的时候是四个字节四个字节进行比较
00404800 /$ 53 push ebx ; 堆栈平衡
00404801 |. 56 push esi ; 堆栈平衡
00404802 |. 57 push edi ; 堆栈平衡
00404803 |. 89C6 mov esi,eax ; 密码的地址 赋值给esi
00404805 |. 89D7 mov edi,edx ; 可疑字符串的地址赋值给edi
00404807 |. 39D0 cmp eax,edx ; 比较 可疑字符串和密码是否相同
00404809 |. 0F84 8F000000 je CM2_2.0040489E ; 不同 不跳
0040480F |. 85F6 test esi,esi ; 检测密码是否为空
00404811 |. 74 68 je short CM2_2.0040487B ; 不空 不跳
00404813 |. 85FF test edi,edi ; 检查可疑字符串是否为空
00404815 |. 74 6B je short CM2_2.00404882 ; 不空 不跳
00404817 |. 8B46 FC mov eax,dword ptr ds:[esi-0x4] ; 密码的长度赋值给eax
0040481A |. 8B57 FC mov edx,dword ptr ds:[edi-0x4] ; 可疑字符串的长度赋值给edx
0040481D |. 29D0 sub eax,edx ; 密码的长度减去可疑字符串的长度
0040481F |. 77 02 ja short CM2_2.00404823 ; 密码的长度小于字符串的长度 不跳
00404821 |. 01C2 add edx,eax ; 密码的长度 赋值给 edx
00404823 |> 52 push edx ; 把 密码的长度 压入到堆栈
00404824 |. C1EA 02 shr edx,0x2 ; edx 左移两位
00404827 |. 74 26 je short CM2_2.0040484F ; edx不为0 不跳
00404829 |> 8B0E /mov ecx,dword ptr ds:[esi] ; 密码的前四字节机器码赋值给 ecx
0040482B |. 8B1F |mov ebx,dword ptr ds:[edi] ; 可疑字符串的前四字节机器码的值赋值给ebx
0040482D |. 39D9 |cmp ecx,ebx ; 比较可疑字符串和密码的前四字节是否相等
0040482F |. 75 58 |jnz short CM2_2.00404889 ; 不相等 跳
00404831 |. 4A |dec edx
00404832 |. 74 15 |je short CM2_2.00404849
00404834 |. 8B4E 04 |mov ecx,dword ptr ds:[esi+0x4]
00404837 |. 8B5F 04 |mov ebx,dword ptr ds:[edi+0x4]
0040483A |. 39D9 |cmp ecx,ebx
0040483C |. 75 4B |jnz short CM2_2.00404889
0040483E |. 83C6 08 |add esi,0x8
00404841 |. 83C7 08 |add edi,0x8
00404844 |. 4A |dec edx
00404845 |.^ 75 E2 \jnz short CM2_2.00404829
00404847 |. EB 06 jmp short CM2_2.0040484F
00404849 |> 83C6 04 add esi,0x4
0040484C |. 83C7 04 add edi,0x4
0040484F |> 5A pop edx
00404850 |. 83E2 03 and edx,0x3
00404853 |. 74 22 je short CM2_2.00404877
00404855 |. 8B0E mov ecx,dword ptr ds:[esi]
00404857 |. 8B1F mov ebx,dword ptr ds:[edi]
00404859 |. 38D9 cmp cl,bl
0040485B |. 75 41 jnz short CM2_2.0040489E
0040485D |. 4A dec edx
0040485E |. 74 17 je short CM2_2.00404877
00404860 |. 38FD cmp ch,bh
00404862 |. 75 3A jnz short CM2_2.0040489E
00404864 |. 4A dec edx
00404865 |. 74 10 je short CM2_2.00404877
00404867 |. 81E3 0000FF00 and ebx,0xFF0000
0040486D |. 81E1 0000FF00 and ecx,0xFF0000
00404873 |. 39D9 cmp ecx,ebx
00404875 |. 75 27 jnz short CM2_2.0040489E
00404877 |> 01C0 add eax,eax
00404879 |. EB 23 jmp short CM2_2.0040489E
0040487B |> 8B57 FC mov edx,dword ptr ds:[edi-0x4]
0040487E |. 29D0 sub eax,edx
00404880 |. EB 1C jmp short CM2_2.0040489E
00404882 |> 8B46 FC mov eax,dword ptr ds:[esi-0x4]
00404885 |. 29D0 sub eax,edx
00404887 |. EB 15 jmp short CM2_2.0040489E
00404889 |> 5A pop edx
0040488A |. 38D9 cmp cl,bl 密码的第一位和可疑字符串的第一位进行比较
0040488C |. 75 10 jnz short CM2_2.0040489E 不相等, 跳
0040488E |. 38FD cmp ch,bh
00404890 |. 75 0C jnz short CM2_2.0040489E
00404892 |. C1E9 10 shr ecx,0x10
00404895 |. C1EB 10 shr ebx,0x10
00404898 |. 38D9 cmp cl,bl
0040489A |. 75 02 jnz short CM2_2.0040489E
0040489C |. 38FD cmp ch,bh
0040489E |> 5F pop edi
0040489F |. 5E pop esi
004048A0 |. 5B pop ebx
004048A1 \. C3 retn