ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:314.55KB ,
资源ID:14538819      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-14538819.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(课程设计简单程序的密码破解.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

课程设计简单程序的密码破解.docx

1、课程设计简单程序的密码破解目录1.题目要求 22.使用工具 23.破解正文 23.1查看程序 23.2查找关键点 33.3逆向主要函数 44.总结 156.参考文献 21简单程序的密码破解1.题目要求自己写一个简单的Windows程序,要求输入密码,在密码不正确时,提示“password error”。如果正确,则出现一个新的界面。对于生成的执行文件进行反汇编,阅读和跟踪执行,暴力破解(生成新版本的执行程序)或找出密码。2.使用工具Olldbg , IDA , PEid , RadASM , VC+3.破解正文3.1查看程序先使用PEid载入程序,如图3.1.1所示,显示界面为win32 GU

2、I,情况确实如此,此程序界面是用VC6+直接做出来的。有最下面那个Nothing found*可知程序并没有使用任何加壳手段。图3.3.1直接运行程序,输入任意字符如:123456,123456点击注册,查看是否有任何提示信息,如图3.1.2所示图3.1.23.2查找关键点首先用OD载入程序,这里使用三种方式查找关键点,第一种方式是查找关键字符串password error,右键 中文搜索引擎搜索ASCII码,即可查看所有字符串。中文搜索引擎地址 反汇编 文本字符串0040113F push KeShe.00402050 汇编00401144 push KeShe.00402038 passw

3、ord error00401172 push KeShe.00402050 汇编00401177 push KeShe.00402038 password error0040126F push KeShe.00402050 汇编00401274 push KeShe.00402047 注册正确004012FB call (Initial CPU selection)0040133A push KeShe.00402050 汇编0040133F push KeShe.00402038 password error这里有三处出现关键字符password error,而且字符串 注册正确肯定也很重要

4、。分别双击跟进去,即有可能找到关键代码段。第二种方式是给相关函数下断点,这里首先要输入字符串,则很有可能用到GetDlgItemText之类的API,所以给GetDlgItemText下断点,就能在输入用户名,密码后跟踪到程序,来分析关键代码。第三种方式是根据程序的类型结构,直接分析。004012FB call ; InitCommonControls00401300 push 0x0 ; /pModule = NULL00401302 call ; GetModuleHandleA00401307 mov dword ptr ds:0x40317C,eax0040130C push 0x0

5、; /pThreadId = NULL0040130E push 0x0 ; |CreationFlags = 000401310 push 0x0 ; |pThreadParm = NULL00401312 push KeShe.00401000 ; |ThreadFunction = KeShe.0040100000401317 push 0x0 ; |StackSize = 000401319 push 0x0 ; |pSecurity = NULL0040131B call ; CreateThread00401320 push 0x0 ; /lParam = NULL00401322

6、 push KeShe.0040128B ; |DlgProc = KeShe.0040128B00401327 push 0x0 ; |hOwner = NULL00401329 push 0x65 ; |pTemplate = 650040132B push dword ptr ds:0x40317C ; |hInst = NULL00401331 call ; DialogBoxParamA00401336 jmp XKeShe.0040134B00401338 push 0x0 ; /Style = MB_OK|MB_APPLMODAL0040133A push KeShe.00402

7、050 ; |汇编0040133F push KeShe.00402038 ; |password error00401344 push 0x0 ; |hOwner = NULL00401346 call ; MessageBoxA0040134B push 0x0 ; /ExitCode = 00040134D call ; ExitProcess这是OD中刚载入时的代码,左边为内存地址,中间是汇编代码,右边为注释。由上代码,很明显可以看出程序调用了GetModuleHandleA,DialogBoxParamA,ExitProcess。则可以得出这里典型的win32 程序,用DialogB

8、oxParamA载入窗口资源,然后消息循环,ExitProcess为退出程序。因此由DialogBoxParamA即可找到消息处理函数。不过应注意一下这里使用了CreateThread函数来创建线程,肯定有什么目的需要关注一下。3.3逆向主要函数3.3.1逆向消息处理函数由3.1的第三种方式中,DialogBoxParamA的第四个参数就可以找到消息处理函数的地址。00401322 push KeShe.0040128B ; |DlgProc = KeShe.0040128B则消息处理函数的地址为0040128B,用OD来到此地址。0040128B /. 55 push ebp0040128C

9、 |. 8BEC mov ebp,esp0040128E |. 53 push ebx0040128F |. 57 push edi00401290 |. 56 push esi00401291 |. 8B45 0C mov eax,arg.200401294 |. 83F8 10 cmp eax,0x10 ; Switch (cases 10.111)00401297 |. 75 0C jnz XKeShe.004012A500401299 |. 6A 00 push 0x0 ; /Result = 0; Case 10 (WM_CLOSE) of switch 00401294004012

10、9B |. FF75 08 push arg.1 ; |hWnd0040129E |. E8 B5000000 call ; EndDialog004012A3 |. EB 4A jmp XKeShe.004012EF004012A5 | 3D 10010000 cmp eax,0x110004012AA |. 75 02 jnz XKeShe.004012AE004012AC |. EB 41 jmp XKeShe.004012EF ; Case 110 (WM_INITDIALOG) of switch 00401294004012AE | 3D 11010000 cmp eax,0x11

11、1004012B3 |. 75 2E jnz XKeShe.004012E3004012B5 |. 8B45 10 mov eax,arg.3 ; Case 111 (WM_COMMAND) of switch 00401294004012B8 |. 3D E8030000 cmp eax,0x3E8004012BD |. 75 13 jnz XKeShe.004012D2004012BF |. FF75 14 push arg.4004012C2 |. FF75 10 push arg.3004012C5 |. FF75 0C push arg.2004012C8 |. FF75 08 pu

12、sh arg.1004012CB |. E8 4CFEFFFF call KeShe.0040111C ;关键注册响应函数004012D0 |. EB 1D jmp XKeShe.004012EF004012D2 | 83F8 64 cmp eax,0x64004012D5 |. 75 18 jnz XKeShe.004012EF004012D7 |. 6A 00 push 0x0 ; /Result = 0004012D9 |. FF75 08 push arg.1 ; |hWnd004012DC |. E8 77000000 call ; EndDialog004012E1 |. EB 0

13、C jmp XKeShe.004012EF004012E3 | B8 00000000 mov eax,0x0 ; Default case of switch 00401294004012E8 |. 5E pop esi004012E9 |. 5F pop edi004012EA |. 5B pop ebx004012EB |. C9 leave004012EC |. C2 1000 retn 0x10004012EF | B8 01000000 mov eax,0x1004012F4 |. 5E pop esi004012F5 |. 5F pop edi004012F6 |. 5B pop

14、 ebx004012F7 |. C9 leave004012F8 . C2 1000 retn 0x10观察上面这个典型的消息处理函数,并有程序界面可以看出,这里使用了两次EndDialog,一次为点程序的叉的消息处理,还有一次为点取消键的消息处理。则在两次EndDialog之间004012CB |. E8 4CFEFFFF call KeShe.0040111C即是点注册键的消息处理函数。3.3.2逆向线程函数使用OD来到内存地址0040111C处,按F2设下断点如图3.3.2(A)图3.3.2(A)然后,按F9直接让程序运行,输入123456,123456,如下图:不过,这里还没有输入用户

15、名和注册码,就弹出了password error消息框,确定后就结束程序了。没输入用户名和对话框就弹出了错误消息,是因为程序检测出了程序正在被调试器动态调试。观察关于线程的窗口,如下图:除了主线程,还有别的线程,这就和开始的CreateThread相对应,其中一个线程地址为00401000,在CreateThread函数中创建的线程函数也为该地址,用OD来到此处。00401000 mov dword ptr ds:0x4032D7,KeShe.004011; 入口地址0040100A mov dword ptr ds:0x4032DB,KeShe.00401200401014 mov ebx,

16、dword ptr ds:0x4032D70040101A xor edx,edx0040101C movzx eax,byte ptr cs:ebx00401020 add edx,eax ;累加00401022 inc ebx00401023 cmp ebx,dword ptr ds:0x4032DB00401029 jnz XKeShe.0040101C0040102B cmp edx,0x777D ;关键对比00401031 jnz XKeShe.0040104900401033 push 0x0 ; /pThreadId = NULL00401035 push 0x0 ; |Crea

17、tionFlags = 000401037 push 0x0 ; |pThreadParm = NULL00401039 push KeShe.00401000 ; |ThreadFunction = KeShe.004010000040103E push 0x0 ; |StackSize = 000401040 push 0x0 ; |pSecurity = NULL00401042 call ; CreateThread00401047 jmp XKeShe.0040104E00401049 jmp KeShe.004013380040104E retn分析这段程序的算法,作用为将地址0x

18、40111C到地址0x40128B之间的机器码进行累加到EDX中 ,最后让EDX与0x777D比较,若不相等则跳转到00401249处,在401049处再跳转到401338h处,即弹出错误消息框然后结束程序。如果不在40111C到40128B中设断点,测试得EDX刚好为777Dh,在线程结束之前又调用了CreateThread函数来创建线程继续进行校验和来防止设断点。在动态调试下,设断点会改变机器码,即可检测出有调试器加载。这里采用了多线程反动态调试技术,若不下断点,当输入用户名和注册码后,点注册程序会直接跑掉。3.3.3分析注册函数由于使用了多线程反调试技术,当然可以将线程挂起再调试,不过这

19、里我使用静态分析这部分代码,使用IDA静态分析。直接来到0x40111C处。这里调用了GetDlgItemTextA函数,返回值为eax与6比较,如下图相等则跳转,不相等这出现错误提示信息,则用户名的长度必须为6。在401157h处调用了第二个GetDlgItemTextA函数,返回值与0Bh比较,则密码长度必须为11,否则会显示失败,如下图:当检验长度成功后,跳转到401188h处,这里压栈了五个参数,然后调用了sub_40104F函数,0040104F处不在地址0x40111C到地址0x40128B之间,因此可以下断点,这里现有OD调试这个函数,分析加密算法。在0040104F处下断点,F

20、9运行,用户名输:123456 密码:12345678911成功在此处断下,查看堆栈,如下图:最上一行为返回地址,下面5行为参数,分别为 1.2.3.4.5,这里用户名的第6个参数没有传进来。0040104F push ebp00401050 mov ebp,esp00401052 push KeShe.0040328C ; /pSystemInfo = KeShe.0040328C00401057 call ; GetSystemInfo这里调用了GetSystemInfo函数,查MSDN得获取系统信息的结构体为typedef struct _SYSTEM_INFO union DWORD

21、dwOemId; struct WORD wProcessorArchitecture; WORD wReserved; ; DWORD dwPageSize; LPVOID lpMinimumApplicationAddress; LPVOID lpMaximumApplicationAddress; DWORD dwActiveProcessorMask; DWORD dwNumberOfProcessors; DWORD dwProcessorType; DWORD dwAllocationGranularity; WORD wProcessorLevel; WORD wProcesso

22、rRevision; SYSTEM_INFO, *LPSYSTEM_INFO;则内存地址0040328C返回的是该结构体,如下图0040105C mov ebx,dword ptr ds:0x403290这里的403290刚好偏移4个字节,则是把DWORD dwPageSize给ebx,本电脑为00001000.00401062 or bl,byte ptr ss:ebp+0x8Ebp+8为第一个参数,与bl异或。00401065 and ebx,0xFF0040106B mov al,byte ptr ds:ebx+0x403000这里ebx的值为31h,查看403000处发现填充了大量数据

23、,如下图,这里将0x403000+31h处的字符给al,为O。00401071 cmp al,byte ptr ds:0x403180将0x403180处的字符与al做比对,查看该处的数据如下图,发现为密码数据,这里即为100401077 jnz KeShe.00401338 ;不相等则跳转的结束,这里修改标志寄存器不让跳转0040107D mov ebx,dword ptr ds:0x4032A0这里偏移14h个字节,为dwNumberOfProcessors,本电脑为400401083 or bl,byte ptr ss:ebp+0xC与第二个参数异或,的ebx为36h00401086 m

24、ov al,byte ptr ds:ebx+0x4030000040108C cmp al,byte ptr ds:0x403181403000h+36h处的字符这里为F,与密码的第二个字符2作比对00401092 jnz KeShe.0040133800401098 push KeShe.004032B0 ; /pSystemTime = KeShe.004032B00040109D call ; GetSystemTime获取系统时间,由MSDN,该结构为typedef struct _SYSTEMTIME WORD wYear; /07DD WORD wMonth; /0006 WORD

25、 wDayOfWeek; /0006 WORD wDay; /000F WORD wHour; /000F WORD wMinute; /0002 WORD wSecond; /0009 WORD wMilliseconds; /0238 SYSTEMTIME, *PSYSTEMTIME;返回的数据地址为004032B0h如下图,这为此时的系统时间:004010A2 mov bx,word ptr ds:0x4032B8这里相对于SYSTEMTIME偏移8字节,为wHour,即000F004010A9 or bl,byte ptr ss:ebp+0x10004010AC mov al,byte

26、 ptr ds:ebx+0x403000004010B2 cmp al,byte ptr ds:0x403182Bl与第三个参数异或,则ebx为3Fh,将403000h+3Fh处的字符h给al,并与第三个密码字符3比对。004010B8 jnz KeShe.00401338004010BE mov bx,word ptr ds:0x4032BA004010C5 or bl,byte ptr ss:ebp+0x14004010C8 mov al,byte ptr ds:ebx+0x403000004010CE cmp al,byte ptr ds:0x403183这里相对于SYSTEMTIME偏

27、移10字节,为wMinute,即0002,Bl与第四个参数异或,则ebx为36h,将403000h+36h处的字符F给al,并与第四个密码字符4比对。004010D4 jnz KeShe.00401338004010DA push KeShe.004032C0 ; /pSystemTime = KeShe.004032C0004010DF call ; GetSystemTime这里又一次获取系统时间,wMinute; wSecond; wMilliseconds发生变化004010E4 mov ax,word ptr ds:0x4032BC004010EA mov bx,word ptr d

28、s:0x4032CC004010F1 cmp ax,bx004010F4 jnz KeShe.00401338比较两次的wSecond,若不调试应该是同一个值,但这里调试了,所以时间不一样,所以跳转到结束,显示失败。不过这里仍然要改变标志寄存器不使其跳转,这里根据时间差来反调试。004010FA xor ebx,ebx004010FC mov bx,word ptr ds:0x4032C400401103 or bl,byte ptr ss:ebp+0x1800401106 mov al,byte ptr ds:ebx+0x4030000040110C cmp al,byte ptr ds:0

29、x403184这里相对于SYSTEMTIME偏移4字节,为wDayOfWeek,即0006,Bl与第五个参数异或,则ebx为37h,将403000h+37h处的字符E给al,并与第五个密码字符5比对。00401112 jnz KeShe.0040133800401118 leave00401119 retn 0x14现在继续用IDA静态分析注册函数的代码:Eax为3的平方9,将403000h+9的字符这里为O,赋值给String1Eax为4的立方40h,将403000h+40h的字符4,赋值给String1_1Eax为5的立方7Dh,将403000h+7Dh的字符s,赋值给String1_2Eax为6的立方D8h,将403000h+D8h的字符i,赋值给String1_3Eax为7的平方31h,将403000h+31h的字符O,赋值给String1_4,将用户名的第六个字符给bl,这里输入的是6,则ebx为36h,则403000h+36h处的字符为F比对密码的后六个字符,成功则显示成功。则若用户名为:123456 密码为:OF*O4siOF 其中三个星号要根据具体的小时,分钟,所在星期的天数来觉得,具体看上

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2