3 160Crackme第三个之Afkayas.2 和 自动注册程序

编程入门 行业动态 更新时间:2024-10-09 20:22:07

3 160Crackme<a href=https://www.elefans.com/category/jswz/34/1712948.html style=第三个之Afkayas.2 和 自动注册程序"/>

3 160Crackme第三个之Afkayas.2 和 自动注册程序

1 打开软件熟悉


点击确定:发现出现

意思是类型失配 然后确定就结束了
我们思考类型失配 :不就是字符和数据吗 然后我们尝试输入数字
发现出现这个

2 找到切入

逆向工具使用的是x96dbg
我们尝试使用MessageBox -A -W -ExA -ExW 发现并没有断下 (上一篇一样的…防止独立看的)

  Message有以下几个版本:
1- MessageBoxA,MessageBoxW;
2- MessageBoxExA,MessageBoxExW;
3- MessageIndirectA,MessageBoxIndirectW;
4- MessageBoxTimeoutA,MessageBoxTimeoutW.
5 还有ShellMessageBoxA和ShellMessageBoxW在shell32.dll中:

我们全部下断点 (一定需要在返回时 不然断不下来) Tip: 其实 1->2->4 3->MessageBoxWorker发现在MessageBoxIndirectA断下了…

MessageBoxIndirect函数创建,显示并操作一个消息框。
这个消息框包含程序定义的消息文本和标题,任意图标,还有任意预定义的按钮的组合。

3 具体分析

名称注册码使用 111111111 222222

1 一直返回到出现不只是提示错误字符的地方(一个尝试)

F8=>ctrl+F9+F8=>ctrl+F9+F8=>ctrl+F9+F8=>… 到了rtcMsgBox

这里看名称就是一个被封装的弹窗函数 (其实是VB的) (tips:其实x96obg 可以直接在rtcMsgBox下断点)第二次:
继续F9+F8

到了这里发现出现了不同的字符 容易知道是正确的提示

4 开始破解

1 直接在这个函数的入口下断点 然后重新运行和点击

tips:先大致走一遍   发现出现了1111111111 
800041 800043  2400127 2400142 这些都需要注意

2 逐步单步 ==>F8

到这里就需要注意了 出现了我们的名称  我们需要观察他的调用
其实我们思考可以知道注册机正常逻辑 应该是获得我们的名称得到注册码 然后比较
我们就看那些地方使用到了这个传参
第一个点


这个函数的参数有我们的名称 看下函数名称叫vbLenBstr 猜测就是求长度 (可以百度知道就是求字符串长度,)

返回0x9
然后他又将返回值进行了一些计算 tips:这明显不正常...  我们应该注意后面的计算
即:
edi=eax=0x9
eid=eid*0x15B38    
直接高亮edi
第二个点


出现一个教rtcAnsiValueBstr的函数先不管他是做什么的 看到下面使用到了返回值
先 F8 看返回了什么

返回了一个字符’1’

同时对edi进行了操作 edi=edi+ax;    EAX=高16位+低16位AXAX=AH+AL    AX是16位的(2字节)
继续往下个跟  如果我们不知道vbastrI4的作用 他传递了我们可能涉及注册码的变量
但是我们看到他使用的返回值eax 那就先运行过去  没有使用返回值就跟进去



我们看到 返回800041 其实就是我们传递的变量 他应该是把整型==>字符串

然后往下跟发现出现了800043 这个就不对劲 重新观察是怎样来的


发现传递的字符串返回了浮点数 80041
然后下面对浮点数进行了操作

004082EF              | fld st(0),dword ptr ds:[401008]                    |
004082F5              | cmp dword ptr ds:[409000],0                        |
004082FC              | jne afkayas.2.408306                               |
004082FE              | fdiv st(0),dword ptr ds:[40100C]                   | ????????????
00408304              | jmp afkayas.2.408311                               |
00408306              | push dword ptr ds:[40100C]                         |
首先
取   [401008]放在 ST(0)   ==10                          [401008]=10  [40100C]=5 单浮点
然后  ST(0)/[40100C]      ==2  我们下在这二个地址下内存写入断点 然后改变 名称看他们会不会变
在后面这句
0040831E               | DEC1                      | faddp st(1),st(0)                                  |
将 800041+2=800043  然后转为了字符串  

重新来过发现一直都是加2 继续往下跟

ST(0)本来是800043 但是*[401010]=2400129  [401010]=3  是双精度浮点数
然后再减去 [401018]=2400127                  [401018]=2
004083FB               | DC0D 10104000             | fmul st(0),qword ptr ds:[401010]                   |
00408401               | 83EC 08                   | sub esp,8                                          |
00408404               | DC25 18104000             | fsub st(0),qword ptr ds:[401018]                   |

刚好是我们计算的值
然后继续往下跟

发现和上面一模一样 我们即可以猜测应该和上次类似

004084E5               | DC25 20104000             | fsub st(0),qword ptr ds:[401020]                   |
004084EB               | 83EC 08                   | sub esp,8                                          |
004084EE               | DFE0                      | fnstsw ax                                          |
004084F0               | A8 0D                     | test al,D                                          |
004084F2               | 0F85 C7020000             | jne afkayas.2.4087BF                               |
004084F8               | DD1C24                    | fstp qword ptr ss:[esp],st(0)                      |
首先-[401020]=2400142    [401020]=-15  下断点看 重新来的时候看他会不会变

往下跟

到这一步开始出现了我们的注册码
继续:

这个_vbaR8Str 我们经过上面就可以猜测他是 把字符串转为浮点数有关
然后我们看他是怎样判断


发现这个位置 是关键 上面就一个 test si si
我们nop 调这个 je 尝试下

将注册码改为2400142 看我们的推测加密算法对不对 同时我们下的内存写入断点并没有触发 可以认定是一个常量

5 加密总结

注册码=  转字符串(字符串长度*0x15B38+string_name[0])
注册码= 转字符串((转浮点(注册码)+2)*3 -2-(-15))

6 编写程序(获得类名和窗口名称 可以使用spy++开源项目)


好多隐藏的文本框…

#include <Windows.h>
#include <iostream>
#include <atlstr.h>
using namespace std;
//发现这个就需要使用管理员的权限了...
int main()
{srand(time(NULL));HWND Handle = FindWindowW(L"ThunderRT5Form", L"AfKayAs CrackMe #2");HWND HandleRegistration = FindWindowExW(Handle, NULL, L"ThunderRT5TextBox", NULL);HandleRegistration = FindWindowExW(Handle, HandleRegistration, L"ThunderRT5TextBox", NULL);HandleRegistration = FindWindowExW(Handle, HandleRegistration, L"ThunderRT5TextBox", NULL);HandleRegistration = FindWindowExW(Handle, HandleRegistration, L"ThunderRT5TextBox", NULL);HandleRegistration = FindWindowExW(Handle, HandleRegistration, L"ThunderRT5TextBox", NULL);HWND HandleName = FindWindowExW(Handle, HandleRegistration, L"ThunderRT5TextBox", NULL);HWND HandleCliek = FindWindowExW(Handle, NULL, L"ThunderRT5CommandButton", L"OK");CString str = L"天晨";int Name = rand();CString str2;CString str3;str2.Format(L"%d", Name);int Serial = (((str2.GetLength() * 0x15B38) + str2[0]) + 2) * 3 - 2 - (-15);str3.Format(L"%d", Serial);SendMessageW(Handle, WM_SETTEXT, 0, (LPARAM)str.GetBuffer());SendMessageW(HandleName, WM_SETTEXT, 0, (LPARAM)str2.GetBuffer());SendMessageW(HandleRegistration, WM_SETTEXT, 0, (LPARAM)str3.GetBuffer());SendMessageW(HandleCliek, WM_LBUTTONDOWN, 0, NULL);Sleep(10);SendMessageW(HandleCliek, WM_LBUTTONUP, 0, NULL);}

7 其他

1 我们发现再程序开始需要等… 我们可以使用CE的变速齿轮 加速
2 我们可以在使用OllyDbg从零开始Cracking 这本书找到一些更好的方法

更多推荐

3 160Crackme第三个之Afkayas.2 和 自动注册程序

本文发布于:2024-03-12 02:41:25,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1730507.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:第三个   程序   Crackme   Afkayas

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!