近日不知道咋的,想起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代码质量如何?   大家见笑了!