【文章标题】: 某通用更新程序的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
代码:
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
代码:
004F819E . 33D2 XOR EDX,EDX ; EDX=0,第一个参数 文件1-文件名 004F819E /EB 53 JMP SHORT 通用更新.004F81F3 ; EDX=0,第一个参数 文件1-文件名
代码:
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