先说明昂……半原创,算法分析是自己来得……注册机不会写……从网上so来的……
看到这个东西我就晕倒了……=.=咳……
直接IDA对付……
载入后找到处理窗口回调的地方……,在这里……CODE:004010CE
CODE:004010CE WndProc proc near
CODE:004010CE
CODE:004010CE hWnd = dword ptr 8
CODE:004010CE iMsg = dword ptr 0Ch
CODE:004010CE wParam = dword ptr 10h
然后F5之,修修改改后代码变成了这样……嗯……我这篇文章唯一有用的地方就在这里了……好好看哦~~ signed int __stdcall WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM a4)
{
UINT ST10_4_0;
signed int result;
int pIndex;
int index;
if ( iMsg == WM_COMMAND )
{
if ( wParam == 1 )
{
pIndex = 0;
Temp = 0;
Score = 0;
while ( 1 )
{
index = CharTable[pIndex];
if ( index == 77 )
break;
Temp = CharTable[pIndex++];
if ( IsDlgButtonChecked(hWnd, index) )
Score += pIndex * CharTable[pIndex] * Temp;
}
if ( 77 * Score == 15946854 )
{
MessageBoxA(
0,
"Congratulations! Please send a screenshot of your solution to duelist@beer.com!",
"Duelist's Crackme #3",
0x2000u);
result = 1;
}
看到这里我就晕倒了……嗯……不会做了……:'( 咳……不得不承认我数学水平之差……想了半个多小时也没想明白……:L
不过看到了CrackME的标题就想到办法了~~
既然是Duelist's Crackme #3 所以就百度之……果然让我找到了……
下面内容转自看雪……
 算法比较简单,地址[4020FE]处为一个19个字节的表0x16, 0x49, 0x5E, 0x15, 0x27, 0x26, 0x21, 0x25, 0x1D, 0x59, 0x53, 0x37, 0x31, 0x48, 0x5D, 0x0C, 0x61, 0x52, 0x4D。
进一步跟踪发现各按钮对应的代号,为了和注册机一致,我把每个代号都减了1,18个按钮的代号如下:
16 1 2 0 7 5 6 9 10
3 11 12 13 14 15 17 4 8
如我用注册机算出的一个号码为25726,转化为二进制110010001111110,把对应1位的选中就可以了,如
注册机源码如下:
#include<iostream.h>
void main()
{
long unsigned loop=262143
long unsigned i,itemp,EAX,count,sum
char table[19]={0x16, 0x49, 0x5E, 0x15, 0x27, 0x26, 0x21, 0x25, 0x1D, 0x59, 0x53, 0x37, 0x31,
0x48, 0x5D, 0x0C, 0x61, 0x52, 0x4D}
for(i=0
{
sum=0
count=0
do
{
if(itemp%2==1){EAX=table[count]*table[count+1]*(count+1)
count++
itemp/=2
}
while(itemp)
if(sum*0x4d==0xf35466)
{
cout<<i<<endl
}
}
}
我只找到了一个正确答案,可能也只有一个正确答案。
可怜我到现在还是没看明白算法到底啥意思……:'(
:Q 咳……可怜的我……
[ 本帖最后由 yangjt 于 2009-2-6 11:04 编辑 ] |