Shy 发表于 2016-7-27 13:03

对一个重定位重启验证进行SMC爆破+追码

本教程由热情洋溢的木木不哭赞助播出(“哎呀我摔倒了要漂亮姐姐亲亲才能起来{:5_187:}”)

逆向前言:这个程序其实有点意思,,,注册码存放于一个dll后缀名却非dll文件里面,而且虽然本身加壳是upx,但是脱完却有重定位,所以正好可以试试SMC
SMC(Self Modifying Code):自修改代码,应用于不脱壳逆向,,,(从别人帖子复制的)

逆向正文:
首先我们需要确定一下这个程序的爆破点对不对?因为这个程序有提示框,所以我们下MessageBox的函数断点,一般来说易语言是断MessageBoxA,
但是这个是Delphi的,所以我们把所有跟MessageBox有关的信息框断点都断下来就行了,,
**** Hidden Message *****
断下以后进这里
004B35F4    E8 6B19F5FF   call 00404F64                            ; 再进这里
然后再进

00404E38    53            push ebx                                 ; 刚刚那个call进去以后就单步到此处
00404E39    56            push esi
00404E3A    57            push edi
00404E3B    55            push ebp
00404E3C    81C4 04F0FFFF   add esp, -0xFFC
00404E42    50            push eax
00404E43    83C4 FC         add esp, -0x4
00404E46    8BF1            mov esi, ecx
00404E48    891424          mov dword ptr , edx
00404E4B    8BF8            mov edi, eax
00404E4D    85F6            test esi, esi
00404E4F    7F 09         jg short 00404E5A
00404E51    8BC7            mov eax, edi
00404E53    E8 84FEFFFF   call 00404CDC
00404E58    EB 5F         jmp short 00404EB9
00404E5A    8D6E 01         lea ebp, dword ptr
00404E5D    81FD FF070000   cmp ebp, 0x7FF
00404E63    7D 28         jge short 00404E8D
00404E65    56            push esi
00404E66    8D4424 08       lea eax, dword ptr
00404E6A    8B4C24 04       mov ecx, dword ptr
00404E6E    BA FF0F0000   mov edx, 0xFFF
00404E73    E8 84FFFFFF   call 00404DFC
00404E78    8BD8            mov ebx, eax
00404E7A    85DB            test ebx, ebx
00404E7C    7C 0F         jl short 00404E8D
00404E7E    8D5424 04       lea edx, dword ptr
00404E82    8BC7            mov eax, edi
00404E84    8BCB            mov ecx, ebx
00404E86    E8 41FFFFFF   call 00404DCC                            ; 再到这


最后到上面这个00404E86 这句代码的时候
单步到此处
00404DCC    53            push ebx
00404DCD    56            push esi
00404DCE    57            push edi
00404DCF    89C3            mov ebx, eax
00404DD1    89D6            mov esi, edx
00404DD3    89CF            mov edi, ecx
00404DD5    89F8            mov eax, edi
00404DD7    E8 C4FFFFFF   call 00404DA0
00404DDC    89F9            mov ecx, edi                           ; 此时eax的值为将要写入读取的机器码的值
00404DDE    89C7            mov edi, eax
00404DE0    85F6            test esi, esi
00404DE2    74 09         je short 00404DED
00404DE4    89C2            mov edx, eax
00404DE6    89F0            mov eax, esi
00404DE8    E8 5BDCFFFF   call 00402A48                            ; 假注册码写入中
00404DED    89D8            mov eax, ebx
00404DEF    E8 E8FEFFFF   call 00404CDC
00404DF4    893B            mov dword ptr , edi
00404DF6    5F            pop edi
00404DF7    5E            pop esi
00404DF8    5B            pop ebx
00404DF9    C3            retn


这里就是一个假注册码读取并存放到内存当中的地方
固定值为,1C700C 我们只需要在这个地址下读取断点就可以了(时机为软件完全运行起来,并在将要点击软件注册之前,否则时机不对浪费大量时间)
然后返回到此处

算法具体分析:此时我的注册码为1234567890
004050E8    53            push ebx
004050E9    56            push esi
004050EA    57            push edi
004050EB    89C6            mov esi, eax
004050ED    89D7            mov edi, edx
004050EF    39D0            cmp eax, edx
004050F1    0F84 8F000000   je 00405186
004050F7    85F6            test esi, esi
004050F9    74 68         je short 00405163
004050FB    85FF            test edi, edi
004050FD    74 6B         je short 0040516A
004050FF    8B46 FC         mov eax, dword ptr              ; 假注册码位数
00405102    8B57 FC         mov edx, dword ptr              ; 真注册码位数
00405105    29D0            sub eax, edx                           ; 真码位数-假码位数
00405107    77 02         ja short 0040510B                        ; 结果要为0
00405109    01C2            add edx, eax                           ; eax+edx
0040510B    52            push edx
0040510C    C1EA 02         shr edx, 0x2
0040510F    74 26         je short 00405137
00405111    8B0E            mov ecx, dword ptr                ; 4321
00405113    8B1F            mov ebx, dword ptr                ; 0535
00405115    39D9            cmp ecx, ebx                           ; 对比是否相等
00405117    75 58         jnz short 00405171
00405119    4A            dec edx
0040511A    74 15         je short 00405131
0040511C    8B4E 04         mov ecx, dword ptr              ; 8765
0040511F    8B5F 04         mov ebx, dword ptr              ; 8810
00405122    39D9            cmp ecx, ebx
00405124    75 4B         jnz short 00405171                     ; 对比是否相等
00405126    83C6 08         add esi, 0x8
00405129    83C7 08         add edi, 0x8
0040512C    4A            dec edx
0040512D^ 75 E2         jnz short 00405111
0040512F    EB 06         jmp short 00405137
00405131    83C6 04         add esi, 0x4
00405134    83C7 04         add edi, 0x4
00405137    5A            pop edx
00405138    83E2 03         and edx, 0x3
0040513B    74 22         je short 0040515F
0040513D    8B0E            mov ecx, dword ptr                ; 90
0040513F    8B1F            mov ebx, dword ptr                ; 08
00405141    38D9            cmp cl, bl                               ; 比较9与0是否相等
00405143    75 41         jnz short 00405186
00405145    4A            dec edx
00405146    74 17         je short 0040515F
00405148    38FD            cmp ch, bh
0040514A    75 3A         jnz short 00405186                     ; 比较0与8是否相等


算法总结:
1.注册码位数要为A(10)
2.取注册码的第1位到第4位,也就是1234跟注册码的第1位到第4位进行对比
2.取注册码的第5位到第8位,也就是5678跟注册码的第5位到第8位进行对比
3,对比最后两位是否相等


完全相等 call返回为0,je跳转到注册成功

所以我们如果要smc其实有两个点可以改
一个是算法部分,但是这个时机挺难把握,用这里算法call的地方太多了(方法1舍去)
另外的话就是改这个je判断了,这个就简单得很了

在SMC之前我们先来梳理一下
假设我们输入的不是真注册码,那么经过这个call对比,值肯定不为0
所以这个je就不会跳,然后我们需要让je就就得让call返回为0或者把je改成jnz
把je改成jnz的话就应该是那16进制的0F84改为0F85

因为0F是不变的,所以我们不需要改这里,只需要把84改成95即可,也就是所谓的一字节爆破
字节:byte
字:word
双字:dword

因为0F所在的内存地址为005AB8A0,所以地址+1得出:
005AB8A1为84所在的字节

最终我们需要SMC的代码为
mov byte ptr ds:,85

SMC开始:
首先找到那个jmp到OEP的位置

直接搜索二进制00000000000000000000000000000000000000000000000000

然后我们这样改


发现这样改不行,为什么?画横线的地方是地址重定位,因为我们不懂重定位,所以我们要绕过画横线的地方再SMC就可以了

ok,这样就注册成功了


如果大家出现什么错误的话,可以自己额外增加一个区段进行补码就问题不大了,具体问题具体分析(增加的区段需可读可写)
追码的话就在这里



软件:

Shark恒 发表于 2016-7-27 16:53

很详细,套用习大大的话:给你点个赞!

LYQingYe 发表于 2016-7-27 16:58

{:5_121:} 占楼,再看看

892644330 发表于 2016-7-27 19:18

套用qq空间的话 给你100个赞~

覃绍洋 发表于 2016-7-27 19:26

多少收电费收费

覃绍洋 发表于 2016-7-27 19:27

多是少收电费收费

pghuanghui 发表于 2016-7-27 19:45

学习学习这些软件的逆向分析思路,感谢楼主带给我们的教程。

jiajiayu 发表于 2016-7-27 20:03

嗯!学习了;另给你点个赞

一个good而已 发表于 2016-7-27 20:04

膜拜师傅,来学习一下

dufanxing 发表于 2016-7-28 09:56

学习逆向谢谢分享
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 对一个重定位重启验证进行SMC爆破+追码