1. 申请ID:854619267
2. 邮箱:854619267@qq.com
3.原创破解作品:飚王移动硬盘盒解密程序密码恢复
http://bbs.pediy.com/showthread.php?t=140424
IDA, lucida grande, arial, helvetica, sans-serif">
【软件大小】: 2.87M
【下载地址】: 自己搜索下载
【加壳方式】: 无壳
【保护方式】: 无保护
【编写语言】: MFC...VC6
【使用工具】: PEID,OD,LordPE
【软件介绍】: 飚王移动硬盘盒的配套程序,用来实现对硬盘加密存储功能。
【作者声明】: 只谈技术,共同提高,欢迎批评指正
原程序是飚王移动硬盘盒的配套程序。加密存储的原理是对硬盘的一个分区隐藏。
解密的时候,用户输入密码后,如果密码正确的话,就把隐藏的分区显示出来(原理只是猜想)。。
这里有个问题,时间长了一旦把密码忘记了,那就悲剧了,因为这个软件没有找回密码的功能。。这种情况下,对密码进行恢复就十分必要。
说明:
1 必须插上加密处理后的移动硬盘,再运行这个程序,按钮才有效,否者按钮是灰的
正文:
运行之,发现输入密码错误后有MessageBox提示,太好了,就从这里入手吧
运行后,随便输入个错误的密码,弹出对话框后,不要关闭,od附加之,
查看调用堆栈.找到调用messageBox的函数,分析之.
贴出关键汇编代码:
00401D30 6A FF PUSH -100401D32 68 C6116000 PUSH DiskLock.006011C600401D37 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]00401D3D 50 PUSH EAX00401D3E 64:8925 0000000>MOV DWORD PTR FS:[0],ESP00401D45 81EC F4010000 SUB ESP,1F400401D4B 55 PUSH EBP00401D4C 56 PUSH ESI00401D4D 8BF1 MOV ESI,ECX00401D4F 57 PUSH EDI00401D50 33ED XOR EBP,EBP00401D52 B9 0A000000 MOV ECX,0A00401D57 33C0 XOR EAX,EAX00401D59 8D7C24 0E LEA EDI,DWORD PTR SS:[ESP+E]00401D5D 66:896C24 0C MOV WORD PTR SS:[ESP+C],BP00401D62 F3:AB REP STOS DWORD PTR ES:[EDI]00401D64 66:AB STOS WORD PTR ES:[EDI]00401D66 83BE 38100000 0>CMP DWORD PTR DS:[ESI+1038],100401D6D 0F84 08020000 JE DiskLock.00401F7B00401D73 6A 08 PUSH 800401D75 8BCE MOV ECX,ESI00401D77 E8 34060000 CALL DiskLock.004023B000401D7C 83BE 38100000 0>CMP DWORD PTR DS:[ESI+1038],300401D83 0F85 9B010000 JNZ DiskLock.00401F2400401D89 6A 03 PUSH 300401D8B 8BCE MOV ECX,ESI00401D8D E8 1E060000 CALL DiskLock.004023B000401D92 8D4424 0C LEA EAX,DWORD PTR SS:[ESP+C]00401D96 8DBE 58100000 LEA EDI,DWORD PTR DS:[ESI+1058]00401D9C 50 PUSH EAX00401D9D 57 PUSH EDI00401D9E FF15 80046200 CALL DWORD PTR DS:[<&uDiskTool.?uReadPas>;uDiskToo.?uReadPasswordinSectorEx@@YAHPAG0@Z 00401DA4 83C4 08 ADD ESP,800401DA7 85C0 TEST EAX,EAX00401DA9 0F84 76030000 JE DiskLock.0040212500401DAF 6A 05 PUSH 500401DB1 8BCE MOV ECX,ESI00401DB3 E8 F8050000 CALL DiskLock.004023B000401DB8 8D4C24 0C LEA ECX,DWORD PTR SS:[ESP+C]00401DBC 51 PUSH ECX00401DBD FF15 98006200 CALL DWORD PTR DS:[<&MSVCRT.wcslen>] ;msvcrt.wcslen00401DC3 83C4 04 ADD ESP,400401DC6 85C0 TEST EAX,EAX00401DC8 0F86 4A010000 JBE DiskLock.00401F1800401DCE 55 PUSH EBP00401DCF 8D8C24 20010000 LEA ECX,DWORD PTR SS:[ESP+120]00401DD6 E8 A5100000 CALL DiskLock.00402E8000401DDB 8D8C24 1C010000 LEA ECX,DWORD PTR SS:[ESP+11C]00401DE2 89AC24 08020000 MOV DWORD PTR SS:[ESP+208],EBP00401DE9 E8 90160000 CALL <JMP.&MFC42u.#2506>00401DEE 48 DEC EAX00401DEF 74 4C JE SHORT DiskLock.00401E3D00401DF1 48 DEC EAX00401DF2 75 7A JNZ SHORT DiskLock.00401E6E00401DF4 8D8C24 C0010000 LEA ECX,DWORD PTR SS:[ESP+1C0]00401DFB C78424 08020000>MOV DWORD PTR SS:[ESP+208],400401E06 E8 33170000 CALL <JMP.&MFC42u.#795>00401E0B 8D8C24 7C010000 LEA ECX,DWORD PTR SS:[ESP+17C]00401E12 C68424 08020000>MOV BYTE PTR SS:[ESP+208],300401E1A E8 A9170000 CALL <JMP.&MFC42u.#656>00401E1F 8D8C24 1C010000 LEA ECX,DWORD PTR SS:[ESP+11C]00401E26 C78424 08020000>MOV DWORD PTR SS:[ESP+208],-100401E31 E8 0E170000 CALL <JMP.&MFC42u.#641>00401E36 33C0 XOR EAX,EAX00401E38 E9 26010000 JMP DiskLock.00401F6300401E3D 6A 03 PUSH 300401E3F 8BCE MOV ECX,ESI00401E41 E8 6A050000 CALL DiskLock.004023B000401E46 55 PUSH EBP00401E47 57 PUSH EDI00401E48 8BCE MOV ECX,ESI00401E4A E8 01060000 CALL DiskLock.0040245000401E4F 83F8 01 CMP EAX,100401E52 75 61 JNZ SHORT DiskLock.00401EB500401E54 6A 02 PUSH 200401E56 8BCE MOV ECX,ESI00401E58 E8 53050000 CALL DiskLock.004023B000401E5D 57 PUSH EDI00401E5E 8BCE MOV ECX,ESI00401E60 E8 FB040000 CALL DiskLock.0040236000401E65 6A 05 PUSH 500401E67 8BCE MOV ECX,ESI00401E69 E8 42050000 CALL DiskLock.004023B000401E6E 8D8C24 C0010000 LEA ECX,DWORD PTR SS:[ESP+1C0]00401E75 C78424 08020000>MOV DWORD PTR SS:[ESP+208],600401E80 E8 B9160000 CALL <JMP.&MFC42u.#795>00401E85 8D8C24 7C010000 LEA ECX,DWORD PTR SS:[ESP+17C]00401E8C C68424 08020000>MOV BYTE PTR SS:[ESP+208],500401E94 E8 2F170000 CALL <JMP.&MFC42u.#656>00401E99 8D8C24 1C010000 LEA ECX,DWORD PTR SS:[ESP+11C]00401EA0 C78424 08020000>MOV DWORD PTR SS:[ESP+208],-100401EAB E8 94160000 CALL <JMP.&MFC42u.#641>00401EB0 E9 95000000 JMP DiskLock.00401F4A00401EB5 8B96 50100000 MOV EDX,DWORD PTR DS:[ESI+1050]00401EBB 6A 30 PUSH 3000401EBD 55 PUSH EBP00401EBE 8B42 0C MOV EAX,DWORD PTR DS:[EDX+C]00401EC1 50 PUSH EAX00401EC2 55 PUSH EBP00401EC3 FF15 A0036200 CALL DWORD PTR DS:[<&USER32.MessageBoxW>>;USER32.MessageBoxW00401EC9 6A 05 PUSH 5
发现00401D9E 处调用uDiskToo.?uReadPasswordinSectorEx@@YAHPAG0@Z,从函数名字上可以意会到这个是读密码的函数,这里F2下断点, Ctrl+F2,运行后,停在这里:
EAX=0012E168,在数据窗口看出这个地址的内容为0,是128大小的缓冲区,
EDI=0012FCB4, 也是缓冲区,内容是”//./PhysicalDrive1”.
单步走,走过这个函数,发现00401D9E这里正是存放的明文密码,
到这里,密码找到了。这里,密码虽然找到了,但是整个过程是在od调试器里完成的。我们可以额外的做一些工作,让程序直接把密码弹出来。
下面修改这个程序,目标是让这个程序自动弹出一个MessageBox,把密码显示出来.
还是原来的地方,密码是以明文字符串的形式存在的,我们只要把字符串首地址和其他一些参数压栈后调用MessageBoxW函数即可达到目的。
MessageBoxW函数在user32.dll里。要调用messagebox,就得知道这个函数的地址,幸好有工具可以查到函数的地址。
用lordpe打开这个程序, LordpePE editor,Directories->importTable,找到user32.dll(如果原来的程序的导入表里没有这个dll的话,lordpe可以手动把dll添加进去),在下面找MessageBoxW函数,勾上FirstTrunk,记下函数地址002203a0.
要完成目标,还要知道messagebox函数的参数
查msdn,
int MessageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType // style of message box
);
好了,有了上面的信息,下面开始修改程序,让它自动显示出密码.
观察00401DBC处,PUSH ECX CALL DWORD PTR DS:[<MSVCRT.wcslen>],这里ecx就是存放密码的缓冲区地址,用它作为messagebox的lpText参数即可
OK,下面开始修改,把光标移到00401dbc处,按空格键,依次输入以下代码:
Push 0 ;MB_OK宏的值就是0
Push 0; lpText
Push ecx ; lpCaption
Push 0 ; hWnd
CALL DWORD PTR DS:[6203A0]; 6203A0 = 002203a0加上基址00400000
CALL DWORD PTR DS:[6200B8];这个是msvcrt.dll中的exit函数.
显示完messagebox后就调用exit退出
大功告成,保存,运行,成功显示出密码
小弟现在还是个穷学生,期待在论坛里成长,希望能获得会员!!
| [tr][/tr]
|