【文章标题】: 某通用更新程序的DIY

【文章作者】: 啊cr
【软件名称】: 通用更新程序
【下载地址】: 附件
【编写语言】: Borland Delphi v6.0 - v7.0
【使用工具】: OD,DEDE
【操作平台】: Win
【软件介绍】: 通用更新程序
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  
  这是一个自动更新程序,软件限制只更新三个文件,下面分析并修改,使其支持更多文件更新。
  
  读取第一个文件相关参数
  

代码:
  004F8174   > \C605 1C135000>MOV BYTE PTR DS:[50131C],7C              ;  参数分隔符“|”
  004F817B   .  B2 01         MOV DL,1
  004F817D   .  A1 EC684100   MOV EAX,DWORD PTR DS:[4168EC]
  004F8182   .  E8 D5B2F0FF   CALL 通用更新.0040345C
  004F8187   .  8903          MOV DWORD PTR DS:[EBX],EAX
  004F8189   .  8BCB          MOV ECX,EBX
  004F818B   .  8A15 1C135000 MOV DL,BYTE PTR DS:[50131C]              ;  参数分隔符“|”
  004F8191   .  A1 E4125000   MOV EAX,DWORD PTR DS:[5012E4]
  004F8196   .  E8 C5FEFFFF   CALL 通用更新.004F8060
  004F819B   .  8D4D F4       LEA ECX,DWORD PTR SS:[EBP-C]
  004F819E   .  33D2          XOR EDX,EDX                              ;  EDX=0,第一个参数 文件1-文件名
  004F81A0   .  8B03          MOV EAX,DWORD PTR DS:[EBX]
  004F81A2   .  8B38          MOV EDI,DWORD PTR DS:[EAX]
  004F81A4   .  FF57 0C       CALL DWORD PTR DS:[EDI+C]
  004F81A7   .  8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]
  004F81AA   .  B8 E8125000   MOV EAX,通用更新.005012E8                    ;  保存指针的地址  文件1-文件名
  004F81AF   .  E8 00C1F0FF   CALL 通用更新.004042B4
  004F81B4   .  8D4D F0       LEA ECX,DWORD PTR SS:[EBP-10]
  004F81B7   .  BA 01000000   MOV EDX,1                                ;  EDX=1,第二个参数 文件1-文件MD5
  004F81BC   .  8B03          MOV EAX,DWORD PTR DS:[EBX]
  004F81BE   .  8B38          MOV EDI,DWORD PTR DS:[EAX]
  004F81C0   .  FF57 0C       CALL DWORD PTR DS:[EDI+C]
  004F81C3   .  8B55 F0       MOV EDX,DWORD PTR SS:[EBP-10]
  004F81C6   .  B8 EC125000   MOV EAX,通用更新.005012EC                    ;  保存指针的地址  文件1-文件名
  004F81CB   .  E8 E4C0F0FF   CALL 通用更新.004042B4
  004F81D0   .  8D4D EC       LEA ECX,DWORD PTR SS:[EBP-14]
  004F81D3   .  BA 02000000   MOV EDX,2                                ;  EDX=2,第三个参数 文件1-文件LINK
  004F81D8   .  8B03          MOV EAX,DWORD PTR DS:[EBX]
  004F81DA   .  8B38          MOV EDI,DWORD PTR DS:[EAX]
  004F81DC   .  FF57 0C       CALL DWORD PTR DS:[EDI+C]
  004F81DF   .  8B55 EC       MOV EDX,DWORD PTR SS:[EBP-14]
  004F81E2   .  B8 F0125000   MOV EAX,通用更新.005012F0                    ;  保存指针的地址  文件1-文件名
  004F81E7   .  E8 C8C0F0FF   CALL 通用更新.004042B4
  004F81EC   .  8D4D E8       LEA ECX,DWORD PTR SS:[EBP-18]
  004F81EF   .  BA 03000000   MOV EDX,3                                ;  文件2……
  文件2
  文件3
  004F8294   .  8B03          MOV EAX,DWORD PTR DS:[EBX]               ;  参数读取完毕
  004F8296   .  E8 F1B1F0FF   CALL 通用更新.0040348C
  004F829B   .  8D55 CC       LEA EDX,DWORD PTR SS:[EBP-34]
  004F829E   .  A1 34F54F00   MOV EAX,DWORD PTR DS:[4FF534]
  004F82A3   .  8B00          MOV EAX,DWORD PTR DS:[EAX]
  004F82A5   .  E8 D2B4F6FF   CALL 通用更新.0046377C                       ;  获取当前程序名
  004F82AA   .  8B45 CC       MOV EAX,DWORD PTR SS:[EBP-34]
  004F82AD   .  8D55 D0       LEA EDX,DWORD PTR SS:[EBP-30]
  004F82B0   .  E8 C70FF1FF   CALL 通用更新.0040927C                       ;  获取程序路径
  004F82B5   .  8B55 D0       MOV EDX,DWORD PTR SS:[EBP-30]
  004F82B8   .  8BC6          MOV EAX,ESI                              ;  通用更新.005012E0
  004F82BA   .  E8 F5BFF0FF   CALL 通用更新.004042B4
  
  //释放取参数的内存对象,循环结束之前不执行
代码:
  004F8294   > \8B03          MOV EAX,DWORD PTR DS:[EBX]               ;  参数读取完毕
  004F8296   .  E8 F1B1F0FF   CALL 通用更新.0040348C
  
  
  
  
  下载第一个文件
代码:
  004F82BF   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  004F82C2   .  50            PUSH EAX                                 ;  通用更新.005012E8
  004F82C3   .  68 88804F00   PUSH 通用更新.004F8088
  004F82C8   .  FF36          PUSH DWORD PTR DS:[ESI]
  004F82CA   .  68 A8894F00   PUSH 通用更新.004F89A8
  004F82CF   .  FF35 E8125000 PUSH DWORD PTR DS:[5012E8]               ;  文件名
  004F82D5   .  8D45 B4       LEA EAX,DWORD PTR SS:[EBP-4C]
  004F82D8   .  BA 03000000   MOV EDX,3
  004F82DD   .  E8 FEC2F0FF   CALL 通用更新.004045E0
  004F82E2   .  8B45 B4       MOV EAX,DWORD PTR SS:[EBP-4C]
  004F82E5   .  8D55 B8       LEA EDX,DWORD PTR SS:[EBP-48]
  004F82E8   .  E8 8FF9FFFF   CALL 通用更新.004F7C7C
  004F82ED   .  8D45 B8       LEA EAX,DWORD PTR SS:[EBP-48]
  004F82F0   .  8D55 C8       LEA EDX,DWORD PTR SS:[EBP-38]
  004F82F3   .  E8 D8F8FFFF   CALL 通用更新.004F7BD0
  004F82F8   .  8B55 C8       MOV EDX,DWORD PTR SS:[EBP-38]
  004F82FB   .  B8 0C135000   MOV EAX,通用更新.0050130C
  004F8300   .  E8 AFBFF0FF   CALL 通用更新.004042B4
  004F8305   .  A1 0C135000   MOV EAX,DWORD PTR DS:[50130C]            ;  本地文件的md5
  004F830A   .  8B15 EC125000 MOV EDX,DWORD PTR DS:[5012EC]            ;  更新文件的md5
  004F8310   .  E8 57C3F0FF   CALL 通用更新.0040466C                       ;  比较
  004F8315   .  0F84 63010000 JE 通用更新.004F847E                         ;  相等不更新,更新下一个文件
  004F831B   .  8D45 B0       LEA EAX,DWORD PTR SS:[EBP-50]
  004F831E   .  8B0D E8125000 MOV ECX,DWORD PTR DS:[5012E8]
  004F8324   .  BA B4894F00   MOV EDX,通用更新.004F89B4
  004F8329   .  E8 3EC2F0FF   CALL 通用更新.0040456C
  004F832E   .  8B55 B0       MOV EDX,DWORD PTR SS:[EBP-50]
  004F8331   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  004F8334   .  8B80 F8020000 MOV EAX,DWORD PTR DS:[EAX+2F8]
  004F833A   .  8B80 20020000 MOV EAX,DWORD PTR DS:[EAX+220]
  004F8340   .  8B08          MOV ECX,DWORD PTR DS:[EAX]
  004F8342   .  FF51 38       CALL DWORD PTR DS:[ECX+38]
  004F8345   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  004F8348   .  8B80 0C030000 MOV EAX,DWORD PTR DS:[EAX+30C]
  004F834E   .  C640 38 00    MOV BYTE PTR DS:[EAX+38],0
  004F8352   .  B2 01         MOV DL,1
  004F8354   .  A1 006C4100   MOV EAX,DWORD PTR DS:[416C00]
  004F8359   .  E8 FEB0F0FF   CALL 通用更新.0040345C
  004F835E   .  A3 20135000   MOV DWORD PTR DS:[501320],EAX            ;  通用更新.005012E8
  004F8363   .  33C0          XOR EAX,EAX                              ;  通用更新.005012E8
  004F8365   .  55            PUSH EBP
  004F8366   .  68 C9834F00   PUSH 通用更新.004F83C9
  004F836B   .  64:FF30       PUSH DWORD PTR FS:[EAX]
  004F836E   .  64:8920       MOV DWORD PTR FS:[EAX],ESP
  004F8371   .  68 D4894F00   PUSH 通用更新.004F89D4
  004F8376   .  FF35 E8125000 PUSH DWORD PTR DS:[5012E8]               ;  文件名
  004F837C   .  68 F0894F00   PUSH 通用更新.004F89F0
  004F8381   .  8D45 AC       LEA EAX,DWORD PTR SS:[EBP-54]
  004F8384   .  BA 03000000   MOV EDX,3
  004F8389   .  E8 52C2F0FF   CALL 通用更新.004045E0
  004F838E   .  8B55 AC       MOV EDX,DWORD PTR SS:[EBP-54]
  004F8391   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  004F8394   .  8B80 F8020000 MOV EAX,DWORD PTR DS:[EAX+2F8]
  004F839A   .  8B80 20020000 MOV EAX,DWORD PTR DS:[EAX+220]
  004F83A0   .  8B08          MOV ECX,DWORD PTR DS:[EAX]
  004F83A2   .  FF51 38       CALL DWORD PTR DS:[ECX+38]
  004F83A5   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  004F83A8   .  8B80 08030000 MOV EAX,DWORD PTR DS:[EAX+308]
  004F83AE   .  8B0D 20135000 MOV ECX,DWORD PTR DS:[501320]
  004F83B4   .  8B15 F0125000 MOV EDX,DWORD PTR DS:[5012F0]            ;  远程地址
  004F83BA   .  E8 011DF8FF   CALL 通用更新.0047A0C0                       ;  下载
  004F83BF   .  33C0          XOR EAX,EAX                              ;  通用更新.005012E8
  004F83C1   .  5A            POP EDX                                  ;  0012F3F4
  004F83C2   .  59            POP ECX                                  ;  0012F3F4
  004F83C3   .  59            POP ECX                                  ;  0012F3F4
  004F83C4   .  64:8910       MOV DWORD PTR FS:[EAX],EDX
  004F83C7   .  EB 50         JMP SHORT 通用更新.004F8419
  004F83C9   .^ E9 5EB5F0FF   JMP 通用更新.0040392C
  004F83CE   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  004F83D1   .  8B80 F8020000 MOV EAX,DWORD PTR DS:[EAX+2F8]
  004F83D7   .  8B80 20020000 MOV EAX,DWORD PTR DS:[EAX+220]
  004F83DD   .  BA 048A4F00   MOV EDX,通用更新.004F8A04
  004F83E2   .  8B08          MOV ECX,DWORD PTR DS:[EAX]
  004F83E4   .  FF51 38       CALL DWORD PTR DS:[ECX+38]
  004F83E7   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  004F83EA   .  8B80 F8020000 MOV EAX,DWORD PTR DS:[EAX+2F8]
  004F83F0   .  8B80 20020000 MOV EAX,DWORD PTR DS:[EAX+220]
  004F83F6   .  BA 78894F00   MOV EDX,通用更新.004F8978
  004F83FB   .  8B08          MOV ECX,DWORD PTR DS:[EAX]
  004F83FD   .  FF51 38       CALL DWORD PTR DS:[ECX+38]
  004F8400   .  A1 20135000   MOV EAX,DWORD PTR DS:[501320]
  004F8405   .  E8 82B0F0FF   CALL 通用更新.0040348C
  004F840A   .  E8 85B8F0FF   CALL 通用更新.00403C94
  004F840F   .  E9 9F040000   JMP 通用更新.004F88B3
  004F8414   .  E8 7BB8F0FF   CALL 通用更新.00403C94
  004F8419   >  FF36          PUSH DWORD PTR DS:[ESI]
  004F841B   .  68 A8894F00   PUSH 通用更新.004F89A8
  004F8420   .  FF35 E8125000 PUSH DWORD PTR DS:[5012E8]               ;  文件名
  004F8426   .  8D45 A8       LEA EAX,DWORD PTR SS:[EBP-58]
  004F8429   .  BA 03000000   MOV EDX,3
  004F842E   .  E8 ADC1F0FF   CALL 通用更新.004045E0
  004F8433   .  8B55 A8       MOV EDX,DWORD PTR SS:[EBP-58]
  004F8436   .  A1 20135000   MOV EAX,DWORD PTR DS:[501320]
  004F843B   .  E8 B033F2FF   CALL 通用更新.0041B7F0
  004F8440   .  68 2C8A4F00   PUSH 通用更新.004F8A2C
  004F8445   .  FF35 E8125000 PUSH DWORD PTR DS:[5012E8]               ;  文件名
  004F844B   .  68 3C8A4F00   PUSH 通用更新.004F8A3C                       ;  ASCII " ...Ok!"
  004F8450   .  8D45 A4       LEA EAX,DWORD PTR SS:[EBP-5C]
  004F8453   .  BA 03000000   MOV EDX,3
  004F8458   .  E8 83C1F0FF   CALL 通用更新.004045E0
  004F845D   .  8B55 A4       MOV EDX,DWORD PTR SS:[EBP-5C]
  004F8460   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  004F8463   .  8B80 F8020000 MOV EAX,DWORD PTR DS:[EAX+2F8]
  004F8469   .  8B80 20020000 MOV EAX,DWORD PTR DS:[EAX+220]
  004F846F   .  8B08          MOV ECX,DWORD PTR DS:[EAX]
  004F8471   .  FF51 38       CALL DWORD PTR DS:[ECX+38]
  004F8474   .  A1 20135000   MOV EAX,DWORD PTR DS:[501320]
  004F8479   .  E8 0EB0F0FF   CALL 通用更新.0040348C                       ;  第一个文件下载结束
  
  不知出于什么原因,本程序只更新列表中的前三个文件,并且没有使用循环而使用顺序结构,1,2,3,给添加更新文件的个数带来麻烦,迫不得已,给他动个手术,把顺序结构改造成循环,使得多文件更新成为可能。
  
  检测一下找到代码段的是否正确,nop掉文件2-3相关的代码
代码:
  参数读取2-3
  004F81EC      90            NOP
  004F8293      90            NOP
  
  文件下载2-3
  004F847E      90            NOP
  004F8826      90            NOP
  
  保存运行一下,第一个文件下载正常,未出现异常。
  保存刚才的修改,将nop省下的空间写补丁代码。
  
  改成循环要注意不能破坏堆栈平衡,要能自动退出循环。
  
  FIX1:
代码:
  004F81EC     /E9 AA000000   JMP 通用更新.004F829B
  说明:取参数之后直接下载
  
  
  FIX2:
代码:
  004F847E    ^\E9 18FDFFFF   JMP 通用更新.004F819B
  说明:下载完成一个文件继续读取参数
  
  FIX3:
代码:
  004F8315    ^\0F84 80FEFFFF JE 通用更新.004F819B                         ;  相等不更新,更新下一个文件
  说明:某文件不需要更新继续读取参数
  
  修改后运行,程序反复下载第一个文件,哈哈 初步成功了
  
代码:
  004F819E   .  33D2          XOR EDX,EDX                              ;  EDX=0,第一个参数 文件1-文件名
  004F81B7   .  BA 01000000   MOV EDX,1                                ;  EDX=1,第二个参数 文件1-文件MD5
  004F81D3   .  BA 02000000   MOV EDX,2                                ;  EDX=2,第三个参数 文件1-文件LINK
  
  以上三个地址只要EDX加3就是下一个文件的参数了。
  
代码:
  004F81FE   B8F4125000             mov     eax, 005012F4
  004F821A   B8F8125000             mov     eax, 005012F8
  [005012F4]、[005012F8]这个本来是保存第二个文件的相关指针的,不过相第二个文件的关代码被nop掉了…… 这个空间不要浪费,[005012F4]正好存储正下下载文件的序号,用于计算参数序号,[005012F8]存储文件总数,用于判断自动退出循环。
  
  
  
代码:
  
  004F810D   .  BA 18894F00   MOV EDX,通用更新.004F8918                    ;  ASCII "http://117.40.255.189/Update/D6__1A__2B.txt"
  004F8112   .  E8 0120F8FF   CALL 通用更新.0047A118                       ;  获得更新列表
  004F8117   .  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
  004F811A   .  B8 E4125000   MOV EAX,通用更新.005012E4
  004F811F   .  E8 90C1F0FF   CALL 通用更新.004042B4
  005012E4存储的是list文件的数据指针。
  
代码:
  004F819E   .  33D2          XOR EDX,EDX                              ;  EDX=0,第一个参数 文件1-文件名
  004F819E     /EB 53         JMP SHORT 通用更新.004F81F3                  ;  EDX=0,第一个参数 文件1-文件名
  第一次执行自己数一下文件数。比较文件序号,[005012F4]、[005012F8]如果相等则退出循环,记录文件序号,edx=0+(3*序号)
  
 
代码:
 004F81F3   > \56                       PUSH ESI
  004F81F4   .  833D F8125000 00         CMP DWORD PTR DS:[5012F8],0              ;  文件计数
  004F81FB   .  75 24                    JNZ SHORT 通用更新.004F8221
  004F81FD   .  8B35 E4125000            MOV ESI,DWORD PTR DS:[5012E4]            ;  列表文件流
  004F8203   >  803E 00                  CMP BYTE PTR DS:[ESI],0
  004F8206   .  74 19                    JE SHORT 通用更新.004F8221
  004F8208   .  813E 703A2F2F            CMP DWORD PTR DS:[ESI],2F2F3A70          ;  p://
  004F820E   .  74 08                    JE SHORT 通用更新.004F8218
  004F8210   .  813E 503A2F2F            CMP DWORD PTR DS:[ESI],2F2F3A50          ;  P://
  004F8216   .  75 06                    JNZ SHORT 通用更新.004F821E
  004F8218   >  FF05 F8125000            INC DWORD PTR DS:[5012F8]                ;  文件计数
  004F821E   >  46                       INC ESI
  004F821F   .^ EB E2                    JMP SHORT 通用更新.004F8203
  004F8221   >  90                       NOP
  004F8222   .  90                       NOP
  004F8223   .  33D2                     XOR EDX,EDX                              ;  ntdll.KiFastSystemCallRet
  004F8225   .  8B35 F4125000            MOV ESI,DWORD PTR DS:[5012F4]
  004F822B   .  3B35 F8125000            CMP ESI,DWORD PTR DS:[5012F8]            ;  是否文件全部下载完毕
  004F8231   .  74 11                    JE SHORT 通用更新.004F8244
  004F8233   >  83FE 00                  CMP ESI,0
  004F8236   .  74 06                    JE SHORT 通用更新.004F823E
  004F8238   .  4E                       DEC ESI
  004F8239   .  83C2 03                  ADD EDX,3
  004F823C   .^ EB F5                    JMP SHORT 通用更新.004F8233
  004F823E   >  5E                       POP ESI                                  ;  kernel32.7C817077
  004F823F   .^ E9 5CFFFFFF              JMP 通用更新.004F81A0
  004F8244   >  5E                       POP ESI                                  ;  kernel32.7C817077
  004F8245   .  8B03                     MOV EAX,DWORD PTR DS:[EBX]
  004F8247      E8 40B2F0FF              CALL 通用更新.0040348C
  004F824C   .  E9 07060000              JMP 通用更新.004F8858
  
  
  
  
  
代码:
  004F81B7     /E9 96000000              JMP 通用更新.004F8252                        ;  EDX=1,第二个参数 文件1-文件MD5
  edx=1+(3*序号)
  004F8252      56                       PUSH ESI                                 ;  通用更新.005012E0
  004F8253      BA 01000000              MOV EDX,1
  004F8258      8B35 F4125000            MOV ESI,DWORD PTR DS:[5012F4]            ;  当前文件序号-1
  004F825E      83FE 00                  CMP ESI,0
  004F8261      74 06                    JE SHORT 通用更新.004F8269
  004F8263      4E                       DEC ESI                                  ;  通用更新.005012E0
  004F8264      83C2 03                  ADD EDX,3
  004F8267    ^ EB F5                    JMP SHORT 通用更新.004F825E
  004F8269      5E                       POP ESI                                  ;  0012F3F4
  004F826A    ^ E9 4DFFFFFF              JMP 通用更新.004F81BC
  
  
  
  
  
  
代码:
004F81D3     /E9 99000000              JMP 通用更新.004F8271                        ;  EDX=2,第三个参数 文件1-文件LINK
  edx=2+(3*序号)
    
  004F8271      56                       PUSH ESI                                 ;  通用更新.005012E0
  004F8272      BA 02000000              MOV EDX,2
  004F8277      8B35 F4125000            MOV ESI,DWORD PTR DS:[5012F4]
  004F827D      83FE 00                  CMP ESI,0
  004F8280      74 06                    JE SHORT 通用更新.004F8288
  004F8282      4E                       DEC ESI                                  ;  通用更新.005012E0
  004F8283      83C2 03                  ADD EDX,3
  004F8286    ^ EB F5                    JMP SHORT 通用更新.004F827D
  004F8288      5E                       POP ESI                                  ;  0012F3F4
  004F8289      FF05 F4125000            INC DWORD PTR DS:[5012F4]                ;  当前文件序号-1
  004F828F    ^ E9 44FFFFFF              JMP 通用更新.004F81D8
  
  原程序会运行第三个文件,这里改成最后个下载到的文件。
  
代码:
004F8865   .  FF35 E8125000 PUSH DWORD PTR DS:[5012E8](其实就是原程序的第一个文件)
  
  
  
  测试一下,列表中的文件都会被下载了,修修补补 差不多了 呜呜 太辛苦了
  
  功能正常,退出时释放内存的时候有一处异常,懒得找了,将退出
 
代码:
 004F91D4    E8 13AFF0FF                CALL 通用更新.004040EC
  改掉
  
代码:
  004040EC      FF35 00225000            PUSH DWORD PTR DS:[<&KERNEL32.ExitProces>;  kernel32.ExitProcess
  004040F2      C3                       RETN
  
  收工
  
--------------------------------------------------------------------------------
【经验总结】
  dede 使分析Delphi程序成为乐趣。
  
--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢!

                                                       2009年06月04日 0:15:37
上传的附件 通用更新程序.rar [附件请到论坛下载:http://bbs.pediy.com/showthread.php?t=90664 ]