能力值:
( LV4,RANK:40 )
|
-
-
2 楼
直接断messageboxw即可....
加壳也许会好一点...还有就是messagebox...crackme最忌讳的不就是这个么...
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
可是你这是爆破,我想要的是逆算法过程。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
有时间在说吧?
|
能力值:
( LV4,RANK:140 )
|
-
-
5 楼
算法应该是这样的
esi初始化为0,然后在用户名窗口每输入一次都会获取当前用户名的长度然后调用这样的算法,最后用esi以10进制替换%d QWER_%d_ASDF
for(int i = 0; i < NameLen; i++)
{
esi += Name[i] - 10;
}
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
[QUOTE=Lnairan;1440587]算法应该是这样的
esi初始化为0,然后在用户名窗口每输入一次都会获取当前用户名的长度然后调用这样的算法,最后用esi以10进制替换%d QWER_%d_ASDF
for(int i = 0; i < NameLen; i++)
{
esi += Name[i] - 10;
}[/QUOTE]
是啊,可是我放在OD里完全就蒙了,下GetWindowText断点看着就是来回绕,看不懂。。。。。。
|
能力值:
( LV8,RANK:140 )
|
-
-
7 楼
再接再厉吧,骚年
b1ngzl
QWER_1724_ASDF
|
能力值:
( LV4,RANK:140 )
|
-
-
8 楼
我是根据提示框回溯和上下翻看GetWindowText附近的代码
|
能力值:
( LV7,RANK:100 )
|
-
-
9 楼
算法嘛,,
用户名长度大于5
密码是截图中的固定值...
这个没啥难度,建议弄成多线程配合的,,,
=======================
仔细看了一下,原来密码是会变的,,
算法是 static uint key=0;
uint ret=GetWindowText(handle,buffer,20);
if(ret==0x300)
{
return;
}
int strLen=strlen(buffer);
int index=0;
while(index < strLen)
{
key=key-10;
key=key+buffer[index];
index++;
}
sprintf (outBuffer,"QWER_%d_ASDF",key);
printf("%s\r\n",outBuffer);
|
能力值:
( LV4,RANK:50 )
|
-
-
10 楼
对的 但是在OD里怎么看呢,我下GetWindowText断点,断了以后就看不懂了。。。。
GetWindowText是在编辑框消息中获取的,每次编辑框内容改变就Get一次,放在OD里就搞不清楚了。。。。。
|
能力值:
( LV4,RANK:50 )
|
-
-
11 楼
[QUOTE=BinGzL;1440618]再接再厉吧,骚年
b1ngzl
QWER_1724_ASDF
[/QUOTE]
请教教我在OD里如何分析算法,每次编辑框内容改变就会触发一次密码计算函数,在OD里完全蒙了
|
能力值:
( LV8,RANK:130 )
|
-
-
12 楼
我用编辑框下断点的时候就发现一输入就中断,知道肯定是有编辑框内容改变事件,然后就f8单步走几下,在回到主程序代码的时候,往下能直接看到重点。
1、为输入用户名的时候 获取。
2、为获取输入的序列号
3、就出明文的正确序列号了。
4、jne对正确和错误分别做不同的跳转。
|
能力值:
( LV4,RANK:50 )
|
-
-
13 楼
这个只是找到注册码,不能分析出算法,我是写在编辑框改变(EN_CHANGE)消息中对每次输入的用户名每个字符运算的,可是我放OD里找不到窗口过程(回调函数)了,请问在OD里怎样找到SDK的窗口过程。
|
能力值:
( LV8,RANK:130 )
|
-
-
14 楼
getwindowtextw下断 就行了。算法计算的过程我的图中有呀,你看不出来吗?我只是算法太菜,汇编又菜,分析不好而已。用这种断,是可以跟踪到你程序中的算法的。
|
能力值:
( LV4,RANK:50 )
|
-
-
15 楼
是这样的,有点说不清了,看下代码应该能理解我的意思了。
INT_PTR CALLBACK On_WM_Command(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
WORD _code = HIWORD(wParam);
GetWindowTextW(edit1, m_Sedit1, 20);
if(_code==EN_CHANGE&&edit1==(HWND)lParam)//每次编辑框1内容改变触发
{
for (int i = 0; i < wcslen(m_Sedit1); i++)
{
//_result是一个int型全局变量,用于得到计算后的数值作为密码
_result += m_Sedit1[i];
_result -= 10;
}
}
if(_code==BN_CLICKED)//按钮点击后做判断与连接操作
{
int _length = GetWindowTextLengthW(edit1);
if (_length < 5)
goto _false;
m_result.Format(L"QWER_%d_ASDF", _result);
GetWindowTextW(edit2,m_Sedit2,20);
if (!wcscmp(m_result, m_Sedit2))
{
//_Text = L"正确";
wcscpy_s(_Text, _right);
messagebox();//这个是我自己写的一个函数 用于提示内容字符串加解密
}
else
{
_false:
// _Text = L"错误";
wcscpy_s(_Text, _false);
messagebox();
}
}
return FALSE;
}
如代码,我把计算写在COMMAND消息里,每次编辑框1内容改变就进行一次计算,最后按钮点击做一些连接字符串与判断对错操作。你给的那张图应该是按钮点击后的判断字符串长度和连接字符串的操作,是在按钮点击事件中,没有进到ENCHANGE消息中,你应该明白我的意思了吧
我就是因为在消息循环中看不懂,找不到如代码写的那样每次取用户名的ASCII然后减10,结果加到一个int全局变量中。
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
不知道是不是这样的,我是新人,感觉很有意思。
|
能力值:
( LV8,RANK:130 )
|
-
-
17 楼
好吧。你既然这么说,晚上的时候,我来给你写一个详细的分析。我算法再菜,对照着你的源码看,应该还是可以的。
|
能力值:
( LV4,RANK:50 )
|
-
-
18 楼
万分感谢
|
能力值:
( LV8,RANK:130 )
|
-
-
19 楼
你看这个对不对。
我的汇编是自己看了几电子书,太水了。
如果确实是这个,我不明白的是,为什么我只有前面改了跳转才能到这个位置。
汗……
最像你的那第一个循环,有减10,有计次,好像也有累加,你看对不对。
|
能力值:
( LV4,RANK:50 )
|
-
-
20 楼
我怎么就跟不到这里呢,看来我还得继续看看,感觉差太多了,自己写的竟然都看不懂
|
能力值:
( LV8,RANK:130 )
|
-
-
21 楼
你先在用户名和密码框随便输入点信息,然后在编辑框那个获取下断.这时候程序会被立刻断下来
为什么会被断下来呢,因为程序要检查编辑框的内容有没有被改变.但这时候你已经无法改变编辑框的内容了,所以程序一直在打转转,一直在检查所以没有机会在编辑框中输入,因为一直检查并没有改变内容,所以到不了编辑框内容改变事件中去. 所以你需要改一处跳转才能到这里。
我想明白了.
|
能力值:
( LV4,RANK:50 )
|
-
-
22 楼
奥,如果getwindowtext写在编辑框改变事件里就好分析了,怪不得一直进不去。谢谢你啦
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
在OD里主程序领空,Ctrl+N,可以看到函数列表,找到对话框创建函数DialogBoxParamW.或者bp DialogBoxParamW运行,返回
|
|
|