第三个之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 和 自动注册程序
发布评论