zoukankan      html  css  js  c++  java
  • 学习:基于注册表验证的逆向实现

    前言: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 <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
    


  • 相关阅读:
    迭代器,生成器,可迭代
    变量名
    python安装
    pickle.dump() pickle.load() keyword.iskeyword() keyword.kwlist random.randint(1,100) random.choice(x) random.shuffle()
    time.time() time.asctime() time.localtime()
    input() raw_input() sys.stdin.readline()
    BufferedReader用法
    汉诺塔问题
    冒泡排序、选择排序和插入排序实例
    Connection reset by peer
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12072616.html
Copyright © 2011-2022 走看看