学习:基于注册表验证的逆向实现

摘要:
最有效的线索是直接查看字符串[local.2]004515FE|。BA3C174500movedx,并将密码分配给eax00451640|。8B55F4movedx,[本地.3];可疑字符串分配给edx00451643|。E8B831FBFFFcallCM2_2.00404800;将密码与可疑字符串00451648|进行比较。0F8583000000jnzCM2_2.004516D1;

前言:shark恒老师的一个cm2.2的逆向,学习到很多

总结:
1、当有隐藏文件的时候,我们一定要多看看,可能就是作者不想让我们看见的东西,类似以下
学习:基于注册表验证的逆向实现第1张

2、基于类似注册表之类的验证,我们可以用相应的工具进行监视,比如如下的工具
学习:基于注册表验证的逆向实现第2张


逆向过程:

1、最开始拿到软件的时候,就是先对其功能界面进行了解,测试发现,输入账号密码提示如下,然后它自动重启,发现还是在原来的界面,没有进行登陆
学习:基于注册表验证的逆向实现第3张

2、然后我们直接载入OD进行观察,最有效的发现线索就是直接查看字符串,利用智能搜索,查找相关信息,发现一些信息如下,这些都需要注意,很可能验证是基于注册表中进行验证的
学习:基于注册表验证的逆向实现第4张

3、那么我们就可以利用相应的工具来监视,来证明猜想是否正确,利用PRegMonitor4工具,确实证明了猜想
学习:基于注册表验证的逆向实现第5张
学习:基于注册表验证的逆向实现第6张

4、那么利用相应的API函数来下断点,我们这里可以用到RegQueryValueExA/W 来进行下断点
学习:基于注册表验证的逆向实现第7张

5、开始跑程序,进行多次F9,因为程序从注册表中获取的不只有账号和密码,还有其他的数据,然后F9到如下,然后执行到用户代码
学习:基于注册表验证的逆向实现第8张

学习:基于注册表验证的逆向实现第9张

6、走出当前的retn,来到第二个,发现没有什么真码假码的比较继续,执行到用户代码,来到如下
学习:基于注册表验证的逆向实现第10张

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

学习:基于注册表验证的逆向实现第11张
学习:基于注册表验证的逆向实现第12张

免责声明:文章转载自《学习:基于注册表验证的逆向实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇基础sql整理(七) SpringBoot起飞之路-整合SpringSecurity(Mybatis、JDBC、内存)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

javascript中字符串常用操作总结、JS字符串操作大全

字符串的操作在js中非常频繁,也非常重要。以往看完书之后都能记得非常清楚,但稍微隔一段时间不用,便会忘得差不多,记性不好是硬伤啊。。。今天就对字符串的一些常用操作做个整理,一者加深印象,二者方便今后温习查阅。 String对象属性 (1) length属性 length算是字符串中非常常用的一个属性了,它的功能是获取字符串的长度。当然需要注意的是js中的中...

【Python】-NO.98.Note.3.Python -【Python3 解释器、运算符】

1.0.0 Summary Tittle:【Python】-NO.98.Note.3.Python -【Python3 解释器】 Style:Python Series:Python Since:2018-07-08 End:2018-07-08 Total Hours:30+ Degree Of Diffculty:5 Degree Of Mastery...

java中的数组

什么是数组呢?   数组是用来存储同一种数据类型多个元素的容器     数据类型:可以是基本类型,也可以是引用类型     容器:比如教室(有多个学生;多个桌子等),衣柜(放多个衣服)等,可以存放多个事物 数组的定义格式   数组的定义格式一:     数据类型[] 数组名= new 数据类型[长度] 例: //定义一个长度为3的整型数组 int[] ar...

SIGAI深度学习第六集 受限玻尔兹曼机

讲授玻尔兹曼分布、玻尔兹曼机的网络结构、实际应用、训练算法、深度玻尔兹曼机等。受限玻尔兹曼机(RBM)是一种概率型的神经网络。和其他神经网络的区别:神经网络的输出是确定的,而RBM的神经元的输出值是不确定的,以某种概率取到某一个值、以另一种概率取到另一个值,神经元的输出值。各个神经元的输入值服从某种概率分布,所有神经元的输出值服从玻尔兹曼分布。 大纲: 玻...

iOS可变字符串的所有操作

可直接把代码复制即可结合输出看结果加深记忆 //创建一个可变字符串 NSMutableString * ms1 = [[NSMutableString alloc]init];     //可以通过类方法来创建 NSMutableString * ms2 = [NSMutableString string];          //用格式化方法创建一个可变...

telent三种认证及vlan简单划分

实验一 telent三种认证方式登录 实验拓扑图如下: 操作过程: 1.认证模式为none R1操作:       1.system-view进入系统试图2.telnet server enable开启Telnet服务3.改名sys R14.int G0/0端口5.ip address x.x.x.x xx 配置ip地址6.exit退出对R2操作:1.s...