对一个重定位重启验证进行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,这样就注册成功了
如果大家出现什么错误的话,可以自己额外增加一个区段进行补码就问题不大了,具体问题具体分析(增加的区段需可读可写)
追码的话就在这里
软件:
很详细,套用习大大的话:给你点个赞! {:5_121:} 占楼,再看看 套用qq空间的话 给你100个赞~ 多少收电费收费 多是少收电费收费 学习学习这些软件的逆向分析思路,感谢楼主带给我们的教程。 嗯!学习了;另给你点个赞 膜拜师傅,来学习一下 学习逆向谢谢分享