-
-
[分享]菜鸟第一篇破文,请指教谢谢
-
发表于:
2005-1-24 16:23
7342
-
【目标】《加密与解密》第二版第四章TraceMe ASCII版的那个
【目的】 用菜鸟的语言讲述OD的使用与最基础的思路
【等级】 只要是想入门的都能看明白:原始社会拉 呵呵!
【工具】 OD1.10
【开始】 套用前辈们的总结,先试运行目标拉。
用户名要求大于4个字,随意了‘qqqqq’,密码‘11111’点check提示说“密码错误,再来一次!”Oh, God! 中文提示的?!还好了,OD可以显示得出拉!用OD导入,运行:由于使用中文字符提示,通过查找字符串的形式定位到关键跳转几乎不可能拉(如果可能请告知啊!)
那么该怎么办呢?向传说中的那样先随便下个读文本中字符的函数断点?不急!按Ctrl+N调出当前应用程序输入表,上下看一看:USER32.GetDlgItemTextA!这个好眼熟哦!!原来它是用的这个函数啊!!下断:怎么下呢?点击这一行,按回车,在活动窗口上选那唯一的一个,按下令程序闻风丧胆的F2!断点下了。或者按Alt+F1,在命令行窗口中输入bp GetDlgItemTextA回车一下,同样下了断点了呵呵!(函数名区分大小写的哦)
好,填写用户名 qqqqq密码 11111点击check,断了!
77D6ACO6 XXXXXXXXXXXXX 怎么回事????
抬头,看看哦!原来这家伙是USER32,好按Alt+F9执行程序直到用户程序,系统的over掉,再看什么来了???抬头,对是这个:(按几次F8就跳了一次,抬头:又出来了,再按Alt+F9到了0011CA了如下:)
004011B6 . 8D8C24 9C00000>LEA ECX,DWORD PTR SS:[ESP+9C]
004011BD . 6A 65 PUSH 65 ; /Count = 65 (101.)
004011BF . 51 PUSH ECX ; |Buffer
004011C0 . 68 E8030000 PUSH 3E8 ; |ControlID = 3E8 (1000.)
004011C5 . 56 PUSH ESI ; |hWnd
004011C6 . 8BD8 MOV EBX,EAX ; |
004011C8 . FFD7 CALL EDI ; \GetDlgItemTextA
004011CA . 8A4424 4C MOV AL,BYTE PTR SS:[ESP+4C]
004011CE . 84C0 TEST AL,AL
004011D0 . 74 76 JE SHORT TraceMe.00401248
004011D2 . 83FB 05 CMP EBX,5
004011D5 . 7C 71 JL SHORT TraceMe.00401248
004011D7 . 8D5424 4C LEA EDX,DWORD PTR SS:[ESP+4C]
004011DB . 53 PUSH EBX====>此时EBX 字符个数
004011DC . 8D8424 A000000>LEA EAX,DWORD PTR SS:[ESP+A0]
004011E3 . 52 PUSH EDX===>看看寄存器:EDX中是什么?!
004011E4 . 50 PUSH EAX===>全出来了啊!!
004011E5 . E8 56010000 CALL TraceMe.00401340
004011EA . 8B3D BC404000 MOV EDI,DWORD PTR DS:[<&USER32.GetDlgIte>; USER32.GetDlgItem===>这个时候看看堆栈中??!!第一行也就是栈顶“1111”下一行“2486”难道?对了!!哈哈可指到您了!!记下记下
004011F0 . 83C4 0C ADD ESP,0C
004011F3 . 85C0 TEST EAX,EAX
004011F5 . 74 37 JE SHORT TraceMe.0040122E==>跳就死!
004011F7 . 8D4C24 0C LEA ECX,DWORD PTR SS:[ESP+C]
004011FB . 51 PUSH ECX ; /String2="成功的字符串大伙都认识的哦!"
004011FC . 68 E4544000 PUSH TraceMe.004054E4 ; |String1 = TraceMe.004054E4
00401201 . FF15 60404000 CALL DWORD PTR DS:[<&KERNEL32.lstrcpyA>] ; \lstrcpyA
00401207 . 6A 00 PUSH 0 ; /Enable = FALSE
00401209 . 6A 6E PUSH 6E ; |/ControlID = 6E (110.)
0040120B . 56 PUSH ESI ; ||hWnd
0040120C . FFD7 CALL EDI ; |\GetDlgItem
0040120E . 8B1D A4404000 MOV EBX,DWORD PTR DS:[<&USER32.EnableWin>; |USER32.EnableWindow
00401214 . 50 PUSH EAX ; |hWnd
00401215 . FFD3 CALL EBX ; \EnableWindow
00401217 . 6A 00 PUSH 0 ; /Enable = FALSE
00401219 . 68 E8030000 PUSH 3E8 ; |/ControlID = 3E8 (1000.)
0040121E . 56 PUSH ESI ; ||hWnd
0040121F . FFD7 CALL EDI ; |\GetDlgItem
00401221 . 50 PUSH EAX ; |hWnd
00401222 . FFD3 CALL EBX ; \EnableWindow
00401224 . 68 E8030000 PUSH 3E8 ; /ControlID = 3E8 (1000.)
00401229 . 56 PUSH ESI ; |hWnd
0040122A . FFD7 CALL EDI ; \GetDlgItem
0040122C . EB 33 JMP SHORT TraceMe.00401261
0040122E > 8D5424 34 LEA EDX,DWORD PTR SS:[ESP+34]
00401232 . 52 PUSH EDX ; /String2 = "序列号错误,再来一次!"(如果刚刚执行到这里时可以看见:String2=?!!!挂了,点上一行,谁跳来的?!看汇编下的小提示JUMP FROM xxxxxxx 把那74 37 NOP掉,试试,爆掉了Yes!!!)
00401233 . 68 E4544000 PUSH TraceMe.004054E4 ; |String1 = TraceMe.004054E4
到这里,基本上这个程序可以说是解决了(算法?我是菜鸟啊,我现在还在打基础练内功能找到这个注册码已经不容易了,等内功达到了再说吧!哎哎这么多鸡蛋啊!还臭的???)
没想到写篇菜鸟级的破文都这么累啊,向所有写破文的前辈同辈和晚辈(没有?将来会有的哦嘿嘿!!)致敬!!!
【总结】1。 OD实在太好了!感谢作者!!
2。 下断前可以先看一下该断什么函数!这样也许可以少浪费许多时间哦,关键是信心会随着时间增加而减少哦!!!
3。 密切注意寄存器窗口和提示窗口,堆栈也不能忘啊,也许呵呵
4。 对了,OD的标题也别忘了哦,也许断在了系统进程里面拉!!哈哈
另外,好象通过命令提示符输入的断点在重新启动目标程序后就失效了不知是否是这样的?
怎么样?OD真的是好用的吧,而且 嘿嘿佩上这个简单一点的 信心+10!Yeah!我的目的到了
这是我的第一篇破文,菜鸟级的!谢谢大家!请指教哦
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!