尝试了很久也无法定位到注册的算法和关键跳,请各位大牛帮忙看看
打开软件点击注册,随意输入假码,然后bp MessageBoxA
断下后atl+K看调用堆栈,翻到调用messagebox的函数,显示调用就来到了这里
00404C20 /. 55 push ebp
00404C21 |. 8BEC mov ebp,esp
00404C23 |. 83E4 F8 and esp,FFFFFFF8
00404C26 |. 6A FF push -1
00404C28 |. 68 8B8D4300 push pdf.00438D8B
00404C2D |. 64:A1 0000000>mov eax,dword ptr fs:[0]
00404C33 |. 50 push eax
00404C34 |. 81EC 14010000 sub esp,114
00404C3A |. A1 50A54400 mov eax,dword ptr ds:[44A550]
00404C3F |. 33C4 xor eax,esp
00404C41 |. 50 push eax
00404C42 |. 8D8424 180100>lea eax,dword ptr ss:[esp+118]
00404C49 |. 64:A3 0000000>mov dword ptr fs:[0],eax
00404C4F |. 8D4424 04 lea eax,dword ptr ss:[esp+4]
00404C53 |. 50 push eax
00404C54 |. E8 67010000 call pdf.00404DC0
00404C59 |. 8D4C24 04 lea ecx,dword ptr ss:[esp+4]
00404C5D |. C78424 200100>mov dword ptr ss:[esp+120],0
00404C68 |. E8 EB9E0000 call pdf.0040EB58 注意这个call
00404C6D |. 83F8 01 cmp eax,1
00404C70 |. 75 0E jnz short pdf.00404C80
00404C72 |. 6A 00 push 0
00404C74 |. 6A 00 push 0
00404C76 |. 68 300A4400 push pdf.00440A30 ; 注册码错误!
00404C7B |. E8 FDBF0000 call pdf.00410C7D 弹出错误信息框函数
00404C80 |> 8D4C24 04 lea ecx,dword ptr ss:[esp+4]
00404C84 |. C78424 200100>mov dword ptr ss:[esp+120],-1
00404C8F |. E8 CC010000 call pdf.00404E60
00404C94 |. 8B8C24 180100>mov ecx,dword ptr ss:[esp+118]
00404C9B |. 64:890D 00000>mov dword ptr fs:[0],ecx
00404CA2 |. 59 pop ecx
00404CA3 |. 8BE5 mov esp,ebp
00404CA5 |. 5D pop ebp
00404CA6 \. C3 retn
call pdf.0040EB58 函数显示了输入注册码的对话框,输入后按确定直接跳到了下一句cmp eax,1 如果eax为1就直接显示注册码错误
尝试了下对这里的的比较转跳爆破,虽然没弹错误框,但也没显示注册成功,看来要找到pdf.0040EB58 中的算法,由于这个函数调用了一个dialog,涉及到windows消息循环,没法单步跟进去,我就在窗口中对确定按钮设了消息断点,断下WM_LBUTTONUP消息,点击确定,断在了系统领空,对.text下内存访问断电并F9就回到了用户领空,来到了这里
0040A8E8 8BFF mov edi,edi ; 消息处理函数
0040A8EA /. 55 push ebp
0040A8EB |. 8BEC mov ebp,esp
0040A8ED |. 817D 0C 60030>cmp [arg.2],360
0040A8F4 |. 75 05 jnz short pdf.0040A8FB
0040A8F6 |. 33C0 xor eax,eax
0040A8F8 |. 40 inc eax
0040A8F9 |. EB 36 jmp short pdf.0040A931
0040A8FB |> 56 push esi
0040A8FC |. 8B75 08 mov esi,[arg.1]
0040A8FF |. 56 push esi
0040A900 |. E8 7DF8FFFF call pdf.0040A182
0040A905 |. 85C0 test eax,eax
0040A907 |. 74 17 je short pdf.0040A920
0040A909 |. 3970 20 cmp dword ptr ds:[eax+20],esi
0040A90C |. 75 12 jnz short pdf.0040A920
0040A90E |. FF75 14 push [arg.4]
0040A911 |. FF75 10 push [arg.3]
0040A914 |. FF75 0C push [arg.2]
0040A917 |. 56 push esi
0040A918 |. 50 push eax
0040A919 |. E8 D7FEFFFF call pdf.0040A7F5 注意这个call
0040A91E |. EB 10 jmp short pdf.0040A930
0040A920 |> FF75 14 push [arg.4] ; /lParam
0040A923 |. FF75 10 push [arg.3] ; |wParam
0040A926 |. FF75 0C push [arg.2] ; |Message
0040A929 |. 56 push esi ; |hWnd
0040A92A |. FF15 28A54300 call dword ptr ds:[<&USER32.DefWindowPro>; \DefWindowProcA
0040A930 |> 5E pop esi
0040A931 |> 5D pop ebp
0040A932 \. C2 1000 retn 10
这里没错的话应该是消息处理函数,可以看到如果是不需要用户处理的消息交给windows默认回调函数,如果是就传给pdf.0040A7F5 ,果断就跟进去了。
但是跟进去以后并未发现有价值的东西,也没看到类似算法的。于是我ATL+M搜索我输入的假码,在内存中只有一处,下内存访问断点,发现这个call根本没访问假码所在的内存。
网上一番搜索后看到有篇文章提到用对botton下消息断点,第一次断下的并不是botton的处理函数。于是我又重复单步到系统领空,再用内存断点返回到用户领空的步骤
中间几次虽然有跳到过不一样的代码的地方去,但看起来都不像是算法的地方
到此就不知道该怎么办了,请各位大牛帮忙看看
pdf.rar
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!