基于注册表程序验证的逆向

前言:基于注册表验证的逆向笔记

cm2.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 <jmp.&fnlc.CM22>
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


总结:

1、当有隐藏文件的时候,我们一定要多看看,可能就是作者不想让我们看见的东西,类似以下

2、基于类似注册表之类的验证,我们可以用相应的工具进行监视,比如如下的工具

posted @ 2019-12-20 13:22  zpchcbd  阅读(337)  评论(0编辑  收藏  举报