前言:
坛友们,年轻就是资本,和我一起逆天改命吧,我的学习过程全部记录及学习资源:https://www.52pojie.cn/thread-1503734-1-1.html
立帖为证!--------记录学习的点点滴滴
0x1发现目标
1.小白第一个cm,新手快来找自信:https://www.52pojie.cn/thread-1571404-1-1.html
2.对于没信心的小菜鸟来说,最喜欢这种新手难度的了,可以找回自信。
3.题目描述:没有壳和花指令,非常适合新手成功会提示相关成功字样。
0x2开始破解
1.IDA F5试试
int __stdcall sub_411760(HWND hDlg, int a2, int a3, int a4)
{
unsigned int l; // [esp+D4h] [ebp-8Ch]
unsigned int k; // [esp+E0h] [ebp-80h]
int j; // [esp+ECh] [ebp-74h]
unsigned int i; // [esp+F8h] [ebp-68h]
CHAR Text[20]; // [esp+104h] [ebp-5Ch] BYREF
int v10; // [esp+118h] [ebp-48h]
char v11[20]; // [esp+124h] [ebp-3Ch]
char v12[20]; // [esp+138h] [ebp-28h]
CHAR String[4]; // [esp+14Ch] [ebp-14h] BYREF
int v14; // [esp+150h] [ebp-10h]
char v15; // [esp+154h] [ebp-Ch]
__CheckForDebuggerJustMyCode(&unk_41C012);
*(_DWORD *)String = 0;
v14 = 0;
v15 = 0;
v12[0] = 105;
v12[1] = 96;
v12[2] = 110;
v12[3] = 114;
v12[4] = 105;
v12[5] = 116;
v12[6] = 96;
v12[7] = 104;
v12[8] = 1;
v11[0] = -76;
v11[1] = -58;
v11[2] = -61;
v11[3] = -67;
v11[4] = -53;
v11[5] = -90;
v11[6] = -79;
v11[7] = -35;
v11[8] = 1;
v10 = 1;
Text[0] = -72;
Text[1] = -90;
Text[2] = -50;
Text[3] = -77;
Text[4] = -78;
Text[5] = -56;
Text[6] = -72;
Text[7] = -89;
Text[8] = 1;
if ( a2 == 16 )
{
EndDialog(hDlg, 0);
}
else if ( a2 == 273 && a3 == 1002 )
{
for ( i = 0; i < 9; ++i )
v12[i] ^= 1u;
GetDlgItemTextA(hDlg, 1001, String, 9);
for ( j = 0; j < 9; ++j )
{
if ( String[j] != v12[j] )
{
v10 = 0;
break;
}
v10 = 1;
}
for ( k = 0; k < 9; ++k )
Text[k] ^= v10;
if ( IsDebuggerPresent() )
v10 = 0;
if ( !v10 )
{
for ( l = 0; l < 9; ++l )
Text[l] = v11[l] ^ 1;
}
MessageBoxA(0, Text, "tip", 0);
}
return 0;
}
2.固定一下基址,因为动态基址跳来跳去不利于我们破解,所以点一下固定基址,把基址固定下来,再点保存。
3.OD下messagebox断点看看反汇编代码:
0041197B 6A 00 push 0x0
0041197D 68 307B4100 push cm.00417B30 ; tip
00411982 8D45 A4 lea eax,dword ptr ss:[ebp-0x5C]
00411985 50 push eax
00411986 6A 00 push 0x0
00411988 FF15 98B04100 call dword ptr ds:[<&USER32.MessageBoxA>] ; user32.MessageBoxA
再看看堆栈窗口
0018F77C 0041198E /CALL 到 MessageBoxA 来自 cm.00411988
0018F780 00000000 |hOwner = NULL
0018F784 0018F894 |Text = "登录失败"
0018F788 00417B30 |Title = "tip"
0018F78C 00000000 \Style = MB_OK|MB_APPLMODAL
4.TEXT决定我们弹窗的内容,看看值从哪来?似乎有些晕。
Text[0] = -72;
Text[1] = -90;
Text[2] = -50;
Text[3] = -77;
Text[4] = -78;
Text[5] = -56;
Text[6] = -72;
Text[7] = -89;
Text[8] = 1;
for ( k = 0; k < 9; ++k )
Text[k] ^= v10;
if ( !v10 )
{
for ( l = 0; l < 9; ++l )
Text[l] = v11[l] ^ 1;
}
5.提示文本有些晕,再看一下我们输入的字符串string,总得比较一下才知道我输入的对不对吧,如果对了不就自己弹出正确的提示了,就不用去想TEXT怎么运算才提示成功。
GetDlgItemTextA(hDlg, 1001, String, 9);
for ( j = 0; j < 9; ++j )
{
if ( String[j] != v12[j] )
{
v10 = 0;
break;
}
v10 = 1;
}
GetDlgItemTextA就是获取我们输入的字符串,string存储的就是我们输入的字符串,if ( String[j] != v12[j] )这一句就是比较的关键了。
6.OD中对GetDlgItemTextA下断点:
004118CC 0FBE4C05 EC movsx ecx,byte ptr ss:[ebp+eax-0x14] ; 123456
004118D1 8B55 8C mov edx,dword ptr ss:[ebp-0x74]
004118D4 0FBE4415 D8 movsx eax,byte ptr ss:[ebp+edx-0x28] ; haoshuai
004118D9 3BC8 cmp ecx,eax ; 比较
004118DB 74 09 je short cm.004118E6
7.je直接改jmp,让v10等于1,即可完成爆破,所以正确的字符串是haoshuai。
0x3总结
1.这个生成的好像是debug程序,带很多调试信息,IDA F5反编译很清晰。
2.ida可以看到代码的大体结构,OD进行调试可以获取实时的参数,变量的值。
3.study pe比较好用,可以固定基址,也可以探测是否使用公开的加密算法。