cm下载链接:
https://n0zom1z0.lanzoup.com/iB4Gz2el88cb
密码:38sy
crack目标是让register框去掉。不让patch,所以要真算出Code。
第一个难点:
DELPHI。。。窗口文字与处理函数的定义在这种地方:
这个cancel处,只要两个框填一样的就会弹GREAT+LAMER:
然后就是register的分析,但这里这个a1始终为0???
嘶,这么看有一个思路:
先通过if ( v9 )这里不是valid long的地方得到一个dword_445830,然后再传valid的。
比如我输入code = 123asd,得到的结果就是:[0x445830] = 0x1603
def enc(name,code):a1 = 0x1603 # ?v14 = codev13 = namev4 = 0v5 = len(v13)v12 = v5v6 = 1while True:v7 = len(v13)if v7 >= 1:while True:v7 -= 1v4 += a1 * (ord(v13[v7])&0xFF) * (ord(v13[v6-1])&0xFF)if v7<=0:breakv6 += 1v12 -= 1if v12<=0:breakv8 = abs(v4) % 666666v14 = v14%80 + v14//89 + 1return v8,v14if v8 == v14:return 1else:return 0print(enc("crackme",6783372))
# 228694
for v14 in range(1,0xFFFFFFFF,1):if(v14%80 + v14//89 + 1 == 228694):print(v14)
# v14 = 89*x + y
# 20353206
虽然过了这个cmp,但为啥还要我again啊???
:??? 搞不懂了。。。
哦,是还要破解again这个按钮的意思。。。不是说我前面破解错了,而是还有一关()
一样的操作~
完整过一遍。
但这个算法好像自己写的有点问题。。。实际是动调拿的值
结果发现是python的abs后取模和C的不一样!!!
。。。逆天。。。
整体代码最好还是用C写,这里懒得重构了,python+C就行。
def GenDWORD(name):v7 = namev1 = 891v2 = len(v7) - 1v3 = 1while True:v1 += (ord(v7[v3-1])&0xFF) * ((ord(v7[v3])&0xFF) % 0x11 + 1)v3 += 1v2 -= 1if(v2<=0):breakreturn v1 % 29000
def enc(name,code):a1 = GenDWORD('123asd')v14 = codev13 = namev4 = 0v5 = len(v13)v12 = v5v6 = 1while True:v7 = len(v13)if v7 >= 1:while True:v7 -= 1v4 += a1 * (ord(v13[v7])&0xFF) * (ord(v13[v6-1])&0xFF)print(hex(v4),end=' ')v4 &= 0xFFFFFFFFif v7<=0:breakv6 += 1v12 -= 1if v12<=0:breakprint(v4)v8 = abs(v4) % 666666 v14 = v14%80 + v14//89 + 1return v8,v14if v8 == v14:return 1else:return 0print(enc("crackme",6783372))
# 228694
# for v14 in range(1,0xFFFFFFFF,1):
# if(v14%80 + v14//89 + 1 == 228694):
# print(v14)
# v14 = 89*x + y
# 20353206
#include<bits/stdc++.h>
using namespace std;int main(){int n = 0xb107b8ac;cout<<abs(n) % 666666;
}
记得上回做是今年4月份。。。当时竟然没分析出来,😓。。。
AEWSOME REVERSE!