近日不知道咋的,想起N久以前的事,就是Internet Download Manager下载工具的打开文件夹的功能,让我很不爽,以前发过EMAIL给作者加强下载后打开文件夹定位的功能,还给了它源码,升级了几个版本还是没加,有点让我失望!! 而是有了下文!
文章本来不写的,看了NISY这几天狂发破文,让我有点坐不处了,然后就发吧,其实过程还一直在我脑子里,决定发来上也作个记录,方便以后修改用吧,每次都能记录这么多代码,其实我的一个技巧就是每学习到一点东西就记录在本子上,比如今天学习到一个函数,就把它记录起来,养成一个好的学习方法,有利以提高自己的学习成绩!
还有一事,就是偶想要在下月初辞职了,不知道回家后有没有ADSL装!
好了不说这么多了,开始吧!
经多年使用电脑经念,发现迅雷有打开文件夹定位文件功能! 调试迅雷要用附加的方法,取代码
直接bp ShellExecuteExA
004B2A93 /$ 55 PUSH EBP
004B2A94 |. 8BEC MOV EBP,ESP
004B2A96 |. 81EC 80010000 SUB ESP,180
004B2A9C |. 80A5 80FEFFFF>AND BYTE PTR SS:[EBP-180],0
004B2AA3 |. 57 PUSH EDI
004B2AA4 |. 6A 50 PUSH 50
004B2AA6 |. 33C0 XOR EAX,EAX
004B2AA8 |. 59 POP ECX
004B2AA9 |. 8DBD 81FEFFFF LEA EDI,DWORD PTR SS:[EBP-17F]
004B2AAF |. F3:AB REP STOS DWORD PTR ES:[EDI]
004B2AB1 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; /<%s> 下载文件地址
004B2AB4 |. 66:AB STOS WORD PTR ES:[EDI] ; |
004B2AB6 |. AA STOS BYTE PTR ES:[EDI] ; |
004B2AB7 |. 8D85 80FEFFFF LEA EAX,DWORD PTR SS:[EBP-180] ; |
004B2ABD |. 68 BC625000 PUSH Thunder5.005062BC ; |format = "/n,/select,"%s""
004B2AC2 |. 50 PUSH EAX ; |s
004B2AC3 |. FF15 B42D4D00 CALL DWORD PTR DS:[<&MSVCRT.sprintf>; \sprintf 这函数功能是拼接字串!
004B2AC9 6A 3C PUSH 3C
004B2ACB 8D45 C4 LEA EAX,DWORD PTR SS:[EBP-3C]
004B2ACE 6A 00 PUSH 0
004B2AD0 50 PUSH EAX
004B2AD1 E8 90CB0000 CALL <JMP.&MSVCRT.memset> 这函数功能是功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作.(好像没啥用啊!)
004B2AD6 8365 CC 00 AND DWORD PTR SS:[EBP-34],0
004B2ADA 8365 DC 00 AND DWORD PTR SS:[EBP-24],0
004B2ADE 8D85 80FEFFFF LEA EAX,DWORD PTR SS:[EBP-180] ; 压入地址
004B2AE4 83C4 18 ADD ESP,18
004B2AE7 8945 D8 MOV DWORD PTR SS:[EBP-28],EAX
004B2AEA 8D45 C4 LEA EAX,DWORD PTR SS:[EBP-3C] ; 开始格式字串地址
004B2AED |. 50 PUSH EAX
004B2AEE |. C745 C4 3C000>MOV DWORD PTR SS:[EBP-3C],3C
004B2AF5 |. C745 C8 00040>MOV DWORD PTR SS:[EBP-38],400
004B2AFC |. C745 D0 243A5>MOV DWORD PTR SS:[EBP-30],Thunder5.>; ASCII "open" 参数:打开字串
004B2B03 |. C745 D4 B0625>MOV DWORD PTR SS:[EBP-2C],Thunder5.>; ASCII "explorer" 参数:资源管理器打开
004B2B0A |. C745 E0 01000>MOV DWORD PTR SS:[EBP-20],1
004B2B11 |. FF15 602E4D00 CALL DWORD PTR DS:[<&SHELL32.ShellE>; SHELL32.ShellExecuteExA 打开文件定位
004B2B17 |. 5F POP EDI
004B2B18 |. C9 LEAVE
004B2B19 \. C3 RETN
呵呵,大家懂汇编,看懂了吗? 我看了好一会儿呢,要是不懂时,OD多跑几遍,一定要把移值代码完全搞懂才能去移植
好,代码有了,也搞清楚了,要住IDM写代码了
讲下,移值代码成功的关健,保证堆栈平衡是一件很重要的事,才不会出现一些BUG之类的东西,我DIY三处,我这里只讲一处吧,其它2处都一样
004FFF46 |. 85C0 TEST EAX,EAX
004FFF48 |. 74 1A JE SHORT 复件_IDM.004FFF64 ; 是否要打开文件夹比较
004FFF4A |. C600 00 MOV BYTE PTR DS:[EAX],0 ; 这里JMP去我的代码
004FFF4D |. 8B55 EC MOV EDX,DWORD PTR SS:[EBP-14]
004FFF50 |. 6A 01 PUSH 1 ; /IsShown = 1
004FFF52 |. 6A 00 PUSH 0 ; |DefDir = NULL
004FFF54 |. 6A 00 PUSH 0 ; |Parameters = NULL
004FFF56 |. 52 PUSH EDX ; |FileName
004FFF57 |. 68 D40D5A00 PUSH 复件_IDM.005A0DD4 ; |Operation = "open"
004FFF5C |. 6A 00 PUSH 0 ; |hWnd = NULL
004FFF5E |. FF15 98545600 CALL DWORD PTR DS:[<&SHELL32.ShellExecut>; \ShellExecuteA 呵呵,不一样吧!!
004FFF64 |> C645 FC 02 MOV BYTE PTR SS:[EBP-4],2 ; 最后完成后要回来这里
004FFF68 |. 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
找一块空白区,要修改为可读可写可执行,这不用我说了吧,004FFF4A JMP 到 00564D24 要用的几个字串自己要先写好
00564D24 60 PUSHAD ; 保存1
00564D25 60 PUSHAD ; 保存2
00564D26 60 PUSHAD ; 保存3,来3次,为了给堆栈顶出些空间
00564D27 36:FF76 54 PUSH DWORD PTR SS:[ESI+54] ; 文件地址
00564D2B 8D05 BE4E5600 LEA EAX,DWORD PTR DS:[564EBE] ; 偶找一块空白地LEA到EAX
00564D31 68 9C4C5600 PUSH IDMan.00564C9C ; ASCII "/n,/select,"%s""
00564D36 50 PUSH EAX ; 压入,函数处理后的就保存在这地址啦
00564D37 FF15 15E06700 CALL DWORD PTR DS:[<&MSVCRT.sprintf>; msvcrt.sprintf
00564D3D 68 244E5600 PUSH IDMan.00564E24 ; 压入这个是为了修改EBP
00564D42 5D POP EBP ; 又弹出去了,呵呵,好玩吗?
00564D43 8365 CC 00 AND DWORD PTR SS:[EBP-34],0 ; EBP 已在我的控制之下了,呵呵
00564D47 8365 DC 00 AND DWORD PTR SS:[EBP-24],0
00564D4B 8D05 BE4E5600 LEA EAX,DWORD PTR DS:[564EBE] ; 这又是偶找的一块空白LEA到EAX,这很关健哦
00564D51 83C4 14 ADD ESP,14 ; 这加多少就看你了啰,反正就搞了3次PUSHAD,为O的地方就行啦
00564D54 8945 D8 MOV DWORD PTR SS:[EBP-28],EAX ; EBP是偶的啊,我们不会破坏原来的,代码照搬
00564D57 B8 E84D5600 MOV EAX,IDMan.00564DE8 ; EAX,函数执行的开始,一定要我们给出
00564D5C 50 PUSH EAX ; 压入
00564D5D C745 C4 3C00000>MOV DWORD PTR SS:[EBP-3C],3C ; 照搬
00564D64 C745 C8 0004000>MOV DWORD PTR SS:[EBP-38],400 ; 照搬
00564D6B C745 D0 D40D5A0>MOV DWORD PTR SS:[EBP-30],IDMan.005>; ASCII "open"
00564D72 C745 D4 AF4C560>MOV DWORD PTR SS:[EBP-2C],IDMan.005>; ASCII "explorer"
00564D79 C745 E0 0100000>MOV DWORD PTR SS:[EBP-20],1 ; 照搬
00564D80 FF15 88545600 CALL DWORD PTR DS:[<&SHELL32.ShellE>; SHELL32.ShellExecuteExA
00564D86 83C4 38 ADD ESP,38 ; 这句堆栈平衡的重点
00564D89 61 POPAD ; 呵呵,减后,就它有用,弹出去
00564D8A C600 00 MOV BYTE PTR DS:[EAX],0 ; 原代码,我恢复下哦
00564D8D 8B55 EC MOV EDX,DWORD PTR SS:[EBP-14] ; 原代码,我恢复下哦
00564D90 ^ E9 CFB1F9FF JMP IDMan.004FFF64 ; 回去啦
00564D95 90 NOP
执行后成功率%100,呵呵,效果不错!! 放出偶修改的版本,你们可定位代码看下,我没用OD插件写代码,有点乱,呵呵,希望你搞明白了
没啥技术含量,偶还省了一个函数调用,不知道偶的ASM代码质量如何? 大家见笑了!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!