程序:
keygenme1.7z
这个程序是用汇编写的,界面实在太炫了.
背景音乐听起来确实不错,它创建了一个线程负责wav的.
但是调试的时候程序断在那,那声音一卡一卡的,我实在受不了.所以把那创建线程的代码个NOP掉了.
未做加壳等任何保护,找到WM_COMMAND消息处理,下面开始分析.
先输入用户名为lazycat,注册码为123456.
然后它获取了用户名和注册码:
GetDlgItemText(hWnd, 1006, 0x0040DCF8 ,40); // 获取用户名
GetDlgItemText(hWnd, 1007, 0x0040DEF8 ,40); // 获取注册码
接着调用了一个子程序loc_401208:
int n_40DC86 = lstrlen(0x0040DCF8);
if(n_40DC86 < 4 || n_40DC86 > 32) {
// JMP 失败
}
int a = 0, b = 0, c = 0, d = 0;
for(int i = 0; i < n_40DC86; i++)
b -= 0x0040DCF8[i] - 0x19;
wsprintf(0x0040E0F8, "%lX", b); // 保存第一个KEY
b = b * b * b;
wsprintf(0x0040E1F8, "%lX", b); // 保存第二个KEY
c = 0x0040E0F8 * 0x0040E0F8 - 0x0040E0F8; // Shit.
wsprintf(0x0040E2F8, "%lX", c);
wsprintf(0x0040DDF8, "Bon-");
lstrcatA(0x0040DDF8, 0x0040E0F8); // 连接第一个KEY
lstrcatA(0x0040DDF8, "-");
lstrcatA(0x0040DDF8, 0x0040E1F8); // 连接第二个KEY
lstrcatA(0x0040DDF8, "-");
lstrcatA(0x0040DDF8, 0x0040E2F8);
可用的注册码为:
lazycat
Bon-FFFFFDB7-F4112A67-41720F48
算法很简单,y = F(x)式比较,分析完毕.
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
注册鸡鸡源码:
#include <Windows.h>
#include <stdio.h>
char szUserName[40] = { 0 }; // 用户名 0x0040DCF8
void KeyGen()
{
int nLen = lstrlenA(szUserName);
if(nLen < 4 || nLen > 32) {
printf("你的用户名长度非法...");
return;
}
int nKey1 = 0;
for(int i = 0; i < nLen; i++)
nKey1 -= szUserName[i] - 0x19;
char szKey1[5], szKey2[5], szKey3[5], szKey[50];
wsprintfA(szKey1, "%lX", nKey1);
wsprintfA(szKey2, "%lX", nKey1 * nKey1 * nKey1);
wsprintfA(szKey3, "%lX", 0x0040E0F8 * 0x0040E0F8 - 0x0040E0F8);
lstrcpyA(szKey, "Bon-");
lstrcatA(szKey, szKey1); // 连接第一个KEY
lstrcatA(szKey, "-");
lstrcatA(szKey, szKey2); // 连接第二个KEY
lstrcatA(szKey, "-");
lstrcatA(szKey, szKey3);
printf("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n");
printf("该用户名的注册码为:%s\n", szKey);
printf("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n");
}
int main()
{
printf("请输入用户名,长度为[4, 32]:");
scanf("%s", szUserName);
KeyGen();
return 0;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)