学破解第155天,《找一个简单的cm,增加一下信心》
前言:坛友们,年轻就是资本,和我一起逆天改命吧,我的学习过程全部记录及学习资源:(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; //
unsigned int k; //
int j; //
unsigned int i; //
CHAR Text; // BYREF
int v10; //
char v11; //
char v12; //
CHAR String; // BYREF
int v14; //
char v15; //
__CheckForDebuggerJustMyCode(&unk_41C012);
*(_DWORD *)String = 0;
v14 = 0;
v15 = 0;
v12 = 105;
v12 = 96;
v12 = 110;
v12 = 114;
v12 = 105;
v12 = 116;
v12 = 96;
v12 = 104;
v12 = 1;
v11 = -76;
v11 = -58;
v11 = -61;
v11 = -67;
v11 = -53;
v11 = -90;
v11 = -79;
v11 = -35;
v11 = 1;
v10 = 1;
Text = -72;
Text = -90;
Text = -50;
Text = -77;
Text = -78;
Text = -56;
Text = -72;
Text = -89;
Text = 1;
if ( a2 == 16 )
{
EndDialog(hDlg, 0);
}
else if ( a2 == 273 && a3 == 1002 )
{
for ( i = 0; i < 9; ++i )
v12 ^= 1u;
GetDlgItemTextA(hDlg, 1001, String, 9);
for ( j = 0; j < 9; ++j )
{
if ( String != v12 )
{
v10 = 0;
break;
}
v10 = 1;
}
for ( k = 0; k < 9; ++k )
Text ^= v10;
if ( IsDebuggerPresent() )
v10 = 0;
if ( !v10 )
{
for ( l = 0; l < 9; ++l )
Text = v11 ^ 1;
}
MessageBoxA(0, Text, "tip", 0);
}
return 0;
}
```
  2.固定一下基址,因为动态基址跳来跳去不利于我们破解,所以点一下固定基址,把基址固定下来,再点保存。
!(https://s4.ax1x.com/2022/01/14/78N6PS.png)
  3.OD下messagebox断点看看反汇编代码:
```
0041197B 6A 00 push 0x0
0041197D 68 307B4100 push cm.00417B30 ; tip
00411982 8D45 A4 lea eax,dword ptr ss:
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 = -72;
Text = -90;
Text = -50;
Text = -77;
Text = -78;
Text = -56;
Text = -72;
Text = -89;
Text = 1;
```
```
for ( k = 0; k < 9; ++k )
Text ^= v10;
if ( !v10 )
{
for ( l = 0; l < 9; ++l )
Text = v11 ^ 1;
}
```
  5.提示文本有些晕,再看一下我们输入的字符串string,总得比较一下才知道我输入的对不对吧,如果对了不就自己弹出正确的提示了,就不用去想TEXT怎么运算才提示成功。
```
GetDlgItemTextA(hDlg, 1001, String, 9);
for ( j = 0; j < 9; ++j )
{
if ( String != v12 )
{
v10 = 0;
break;
}
v10 = 1;
}
```
GetDlgItemTextA就是获取我们输入的字符串,string存储的就是我们输入的字符串,if ( String != v12 )这一句就是比较的关键了。
  6.OD中对GetDlgItemTextA下断点:
```
004118CC 0FBE4C05 EC movsx ecx,byte ptr ss: ; 123456
004118D1 8B55 8C mov edx,dword ptr ss:
004118D4 0FBE4415 D8 movsx eax,byte ptr ss: ; haoshuai
004118D9 3BC8 cmp ecx,eax ; 比较
004118DB 74 09 je short cm.004118E6
```
  7.je直接改jmp,让v10等于1,即可完成爆破,所以正确的字符串是haoshuai。
!(https://s4.ax1x.com/2022/01/14/785Lbq.png)
## 0x3总结
  1.这个生成的好像是debug程序,带很多调试信息,IDA F5反编译很清晰。
  2.ida可以看到代码的大体结构,OD进行调试可以获取实时的参数,变量的值。
  3.study pe比较好用,可以固定基址,也可以探测是否使用公开的加密算法。
赤裸裸的炫耀,真不大敢回你的帖,担心某一天又被申请删了帖{:1_909:} 坚持就是胜利,加油 菜老板牛逼克拉斯 果然,正确的字符串,haoshuai 大佬可以写篇SCI发表了
厉害了,{:301_1003:} 学习很重要,一步小心落伍了。 恭喜楼主。有耐心一定会成功