一个裸奔的递归算法的keygenme
本帖最后由 KaQqi 于 2019-5-19 16:25 编辑成功或者失败提示:
要求:keygen
https://www.lanzouj.com/i46mpna
楼下大佬太强了
视频:https://www.bilibili.com/video/av52823122/ 本帖最后由 梦游枪手 于 2019-5-16 22:53 编辑
有两个bug说下第一个
这里使用了注册码的前两位来计算真正的注册码,这样子下面的判断不可能为成功,楼主是想用输入的数字的前两位计算注册码吗?
第二个
count没有在判断结束后清零,导致realcode在每次判断后都会跟之前的注册码叠加在一起,在判断结束后应该将realcode和count一起清零
附上python写的注册机,虽然现在还不知道对不对
tablesize=0
table=*10000
realcode=*10000
stringtable=*100
stringcount=0
def rowtostring():
global stringcount
for i in range(1,tablesize+1):
realcode=stringtable+0x30
stringcount+=1
return
def cellhadnotnum(row,col):
for i in range(1,col+1):
if table == 1:
return False
if row - i >= 0 and table == 1:
return False;
if row - i <= tablesize and table == 1:
return False;
return True
def calcrealcode(col):
if col>tablesize:
return 0
for row in range(1,tablesize+1):
if cellhadnotnum(row,col):
table=1
stringtable=row
if col==tablesize:
rowtostring()
table=0
else:
calcrealcode(col+1)
table=0
stringtable=0
if __name__=='__main__':
inputnum=raw_input()
num=[]
for i in inputnum:
num.append(ord(i)-ord('0'))
if len(num)>=2:
tablesize=(num*0x5c+8*num)%0x100%10
if tablesize==0:
tablesize=9
calcrealcode(1)
code=''
for i in range(stringcount):
code+=chr(realcode+0x30)
stringcount=0
print code
int __thiscall sub_401370(_DWORD *this)
{
int v1; // ecx
int result; // eax
int v3; // ecx
int v4; // ecx
int v5; // ecx
int v6; // ecx
int v7; // ecx
int v8; // ecx
int v9; // ecx
int v10; // ecx
int v11; // ecx
int v12; //
int v13; //
_DWORD *v14; //
int v15; //
char v16; //
char v17; //
int *v18; //
char v19; //
char v20; //
int *v21; //
char v22; //
char v23; //
int *v24; //
char v25; //
char v26; //
int *v27; //
char v28; //
char v29; //
int *v30; //
char v31; //
char v32; //
int *v33; //
char v34; //
char v35; //
int *v36; //
char v37; //
char v38; //
int *v39; //
int v40; //
char v41; //
char v42; //
int *v43; //
int v44; //
char v45; //
char v46; //
int *v47; //
size_t i; //
char v49; //
char v50; //
char *v51; //
char v52; //
char v53; //
char v54; //
char *Str; //
int v56; //
v14 = this;
QLineEdit::text(this, &v54);
v56 = 0;
QString::toLatin1(&v54, &v50);
LOBYTE(v56) = 1;
v51 = QByteArray::data((QByteArray *)&v50);
QLineEdit::text(v14, &v53);
LOBYTE(v56) = 2;
QString::toLatin1(&v53, &v52);
LOBYTE(v56) = 3;
Str = QByteArray::data((QByteArray *)&v52);
for ( i = 0; i < strlen(Str); ++i )
Str -= 48;
if ( *v51 >= 48 && *v51 <= 57 )
{
if ( v51 >= 48 && v51 <= 57 )
{
v49 = (char)(92 * *Str + 8 * Str) % 10;
if ( !v49 )
v49 = 9;
dword_40CAD8 = v49;
sub_401290(1);
if ( !strcmp(Str1, Str) )
{
QString::QString((QString *)&v38, "You win.");
LOBYTE(v56) = 8;
QString::QString((QString *)&v37, "Success!");
LOBYTE(v56) = 9;
v13 = 0;
v12 = v4;
v39 = &v12;
unknown_libname_1(1024);
QMessageBox::information(v14, &v37, &v38);
LOBYTE(v56) = 8;
QString::~QString((QString *)&v37);
LOBYTE(v56) = 3;
QString::~QString((QString *)&v38);
}
else
{
QString::QString((QString *)&v35, "failed");
LOBYTE(v56) = 10;
QString::QString((QString *)&v34, "warning");
LOBYTE(v56) = 11;
v13 = 0;
v12 = v5;
v36 = &v12;
unknown_libname_1(1024);
QMessageBox::warning(v14, &v34, &v35);
LOBYTE(v56) = 10;
QString::~QString((QString *)&v34);
LOBYTE(v56) = 3;
QString::~QString((QString *)&v35);
QString::QString((QString *)&v32, "Nuclear missile launched.");
LOBYTE(v56) = 12;
QString::QString((QString *)&v31, "warning");
LOBYTE(v56) = 13;
v13 = 0;
v12 = v6;
v33 = &v12;
unknown_libname_1(1024);
QMessageBox::warning(v14, &v31, &v32);
LOBYTE(v56) = 12;
QString::~QString((QString *)&v31);
LOBYTE(v56) = 3;
QString::~QString((QString *)&v32);
QString::QString((QString *)&v29, "Iron Curtain Activated");
LOBYTE(v56) = 14;
QString::QString((QString *)&v28, "warning");
LOBYTE(v56) = 15;
v13 = 0;
v12 = v7;
v30 = &v12;
unknown_libname_1(1024);
QMessageBox::warning(v14, &v28, &v29);
LOBYTE(v56) = 14;
QString::~QString((QString *)&v28);
LOBYTE(v56) = 3;
QString::~QString((QString *)&v29);
QString::QString((QString *)&v26, "Chronosphere Activated");
LOBYTE(v56) = 16;
QString::QString((QString *)&v25, "warning");
LOBYTE(v56) = 17;
v13 = 0;
v12 = v8;
v27 = &v12;
unknown_libname_1(1024);
QMessageBox::warning(v14, &v25, &v26);
LOBYTE(v56) = 16;
QString::~QString((QString *)&v25);
LOBYTE(v56) = 3;
QString::~QString((QString *)&v26);
QString::QString((QString *)&v23, "Lightning Storm Created");
LOBYTE(v56) = 18;
QString::QString((QString *)&v22, "warning");
LOBYTE(v56) = 19;
v13 = 0;
v12 = v9;
v24 = &v12;
unknown_libname_1(1024);
QMessageBox::warning(v14, &v22, &v23);
LOBYTE(v56) = 18;
QString::~QString((QString *)&v22);
LOBYTE(v56) = 3;
QString::~QString((QString *)&v23);
QString::QString((QString *)&v20, "Genetic Mutator Activated");
LOBYTE(v56) = 20;
QString::QString((QString *)&v19, "warning");
LOBYTE(v56) = 21;
v13 = 0;
v12 = v10;
v21 = &v12;
unknown_libname_1(1024);
QMessageBox::warning(v14, &v19, &v20);
LOBYTE(v56) = 20;
QString::~QString((QString *)&v19);
LOBYTE(v56) = 3;
QString::~QString((QString *)&v20);
QString::QString((QString *)&v17, "Psychic Dominator Activated");
LOBYTE(v56) = 22;
QString::QString((QString *)&v16, "warning");
LOBYTE(v56) = 23;
v13 = 0;
v12 = v11;
v18 = &v12;
unknown_libname_1(1024);
QMessageBox::warning(v14, &v16, &v17);
LOBYTE(v56) = 22;
QString::~QString((QString *)&v16);
LOBYTE(v56) = 3;
QString::~QString((QString *)&v17);
}
v15 = 0;
LOBYTE(v56) = 2;
QByteArray::~QByteArray((QByteArray *)&v52);
LOBYTE(v56) = 1;
QString::~QString((QString *)&v53);
LOBYTE(v56) = 0;
QByteArray::~QByteArray((QByteArray *)&v50);
v56 = -1;
QString::~QString((QString *)&v54);
result = v15;
}
else
{
QString::QString((QString *)&v42, "You can Only input numer.");
LOBYTE(v56) = 6;
QString::QString((QString *)&v41, "warning");
LOBYTE(v56) = 7;
v13 = 0;
v12 = v3;
v43 = &v12;
unknown_libname_1(1024);
QMessageBox::warning(v14, &v41, &v42);
LOBYTE(v56) = 6;
QString::~QString((QString *)&v41);
LOBYTE(v56) = 3;
QString::~QString((QString *)&v42);
v40 = 0;
LOBYTE(v56) = 2;
QByteArray::~QByteArray((QByteArray *)&v52);
LOBYTE(v56) = 1;
QString::~QString((QString *)&v53);
LOBYTE(v56) = 0;
QByteArray::~QByteArray((QByteArray *)&v50);
v56 = -1;
QString::~QString((QString *)&v54);
result = v40;
}
}
else
{
QString::QString((QString *)&v46, "You can Only input number.");
LOBYTE(v56) = 4;
QString::QString((QString *)&v45, "warning");
LOBYTE(v56) = 5;
v13 = 0;
v12 = v1;
v47 = &v12;
unknown_libname_1(1024);
QMessageBox::warning(v14, &v45, &v46);
LOBYTE(v56) = 4;
QString::~QString((QString *)&v45);
LOBYTE(v56) = 3;
QString::~QString((QString *)&v46);
v44 = 0;
LOBYTE(v56) = 2;
QByteArray::~QByteArray((QByteArray *)&v52);
LOBYTE(v56) = 1;
QString::~QString((QString *)&v53);
LOBYTE(v56) = 0;
QByteArray::~QByteArray((QByteArray *)&v50);
v56 = -1;
QString::~QString((QString *)&v54);
result = v44;
}
return result;
} dfs算法。。 本帖最后由 KaQqi 于 2019-5-16 21:00 编辑
weikun444 发表于 2019-5-16 20:53
int __thiscall sub_401370(_DWORD *this)
{
int v1; // ecx
伪代码太难看了,你需要总结出算法
而且你f5的位置也不对。。
你f5的地方只是一个字符串转换的地方。。。 weikun444 发表于 2019-5-16 20:53
int __thiscall sub_401370(_DWORD *this)
{
int v1; // ecx
ida。。。这也算keygen?{:17_1061:} 瑟瑟发抖 不明觉厉。。。。 涛之雨 发表于 2019-5-16 21:21
ida。。。这也算keygen?
不算,他f5的地方都不对,他f5的地方就是一个字符串比较和转换类型,仅此而已 weikun444 发表于 2019-5-16 20:53
int __thiscall sub_401370(_DWORD *this)
{
int v1; // ecx
ida f5? 再加上一些分析和注释更好一些。
这个地方已经看到消息了。 梦游枪手 发表于 2019-5-16 22:48
有两个bug说下第一个
这里使用了注册码的前两位来计算真正的注册码,这样子下面的判断不可能为成功,楼 ...
膜拜大神,我也觉得他写的有点问题,但是没看出来,看了你的知道哪有问题了