首页
社区
课程
招聘
[原创]Total Commander 自校验算法分析
发表于: 2012-3-27 21:26 15701

[原创]Total Commander 自校验算法分析

uuk 活跃值
3
2012-3-27 21:26
15701

【软件名称】: Total Commander
【软件版本】: 7.56a
【加壳方式】: 新版不加壳
【编写语言】: Borland Delphi 2.0 [Overlay]
【使用工具】: OD PEID IDA
【操作平台】: Windows XP
【软件介绍】: 一款挺不错的双栏文件管理软件
【作者声明】: 只是研究用,使用请购买正版

我们知道Total Commander是有自校验的,通过跟踪CreateFile和ReadFile函数,确定校验过程是在函数sub_47823C中进行的。

0047823C    push    ebp            ;  自校验函数
0047823D    mov    ebp, esp
0047823F    add    esp, -824
00478245    mov    dword ptr [ebp-4], -1    ;  初始化校验和为 CHECKSUM=-1
0047824C    lea    eax, dword ptr [ebp-814]
00478252    mov    dword ptr [ebp-18], eax
00478255    lea    eax, dword ptr [ebp-824]
0047825B    mov    edx, 3FF
00478260    call    006BE3AC            ;  GetModuleFileName()
00478265    lea    edx, dword ptr [ebp-1C]
00478268    mov    eax, dword ptr [6C7D58]
0047826D    mov    ecx, 4
00478272    call    004027B4
00478277    mov    eax, 8001
0047827C    call    00402684             ;  AllocateMem()
00478281    mov    dword ptr [ebp-C], eax
00478284    lea    eax, dword ptr [ebp-824]
0047828A    mov    ecx, 1
0047828F    xor    edx, edx
00478291    call    0041D70C            ;  CreateFile()
00478296    mov    dword ptr [ebp-10], eax
00478299    call    004035AC
0047829E    cmp    dword ptr [eax+C], 0
004782A5    je    short 004782BF
004782F7    xor    eax, eax
004782F9    mov    dword ptr [ebp-24], eax
004782FC    mov    eax, dword ptr [ebp-10]
004782FF    call    00419874            ;  计算文件大小
00478304    sub    eax, 18
00478307    sub    eax, 0C            ;  文件大小减去36字节
0047830A    mov    dword ptr [ebp-20], eax
0047830D    cmp    dword ptr [ebp-20], 8000
00478314    jle    short 0047831E
00478316    mov    word ptr [ebp-12], 8000
0047831C    jmp    short 00478326
0047831E    mov    ax, word ptr [ebp-20]
00478322    mov    word ptr [ebp-12], ax
00478326    lea    eax, dword ptr [ebp-14]
00478329    push    eax
0047832A    mov    edx, dword ptr [ebp-C]
0047832D    mov    cx, word ptr [ebp-12]
00478331    mov    eax, dword ptr [ebp-10]
00478334    call    0041DE4C    ;  ReadFile():从文件中读取0x8000大小的数据块
00478339    cmp    dword ptr [ebp-24], 0
0047833D    jnz    short 0047834A
0047833F    lea    edx, dword ptr [ebp-20]
00478342    mov    eax, dword ptr [ebp-C]
00478345    call    00478054        ;  首次计算校验和前先清除Checksum和数字签名,并计算要校验的数据大小
0047834A    lea    ecx, dword ptr [ebp-4]
0047834D    movzx    edx, word ptr [ebp-14]
00478351    mov    eax, dword ptr [ebp-C]
00478354    call    0067FF10        ;  分块分片计算校验和
00478359    movzx    eax, word ptr [ebp-14]
0047835D    sub    dword ptr [ebp-20], eax
00478360    movzx    eax, word ptr [ebp-14]
00478364    add    dword ptr [ebp-24], eax
00478367    movzx    eax, word ptr [ebp-14]
0047836B    cmp    eax, 8000
00478370    jnz    short 00478378
00478372    cmp    dword ptr [ebp-20], 0
00478376    jnz    short 0047830D
00478378    mov    edx, 8001
0047837D    mov    eax, dword ptr [ebp-C]
00478380    call    0040269C        ;  FreeMem()
00478385    lea    eax, dword ptr [ebp-14]
00478388    push    eax
00478389    lea    edx, dword ptr [ebp-824]
0047838F    mov    cx, 24
00478393    mov    eax, dword ptr [ebp-10]
00478396    call    0041DE4C        ;  读取最后36的字节,校验和存储在第16~20字节里面
0047839B    mov    eax, dword ptr [ebp-10]
0047839E    call    0041DDE4        ;  CloseHandle()
004783A3    mov    eax, dword ptr [ebp-18]
004783A6    mov    eax, dword ptr [eax]
004783A8    xor    eax, 2A67BE65        ;  对存储的校验和进行异或
004783AD    mov    dword ptr [ebp-8], eax
004783B0    push    ebp
004783B1    call    004781E4        ;  比较异或后的两个校验和,并利用两个校验和计算其它数据

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (22)
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
2
沙发!感谢楼主的分享,努力学习中。
2012-3-27 21:29
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
不错……
12345
2012-3-27 21:44
0
雪    币: 6051
活跃值: (1441)
能力值: ( LV15,RANK:1473 )
在线值:
发帖
回帖
粉丝
4
这个不错,分析的很详细
一直在用TC,不过一直没想起来去分析一下它的算法,汗一个
2012-3-27 22:21
0
雪    币: 546
活跃值: (1605)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
不错,之前用 Explorer++ (http://www.explorerplusplus.com),目录内容多的时候延迟几秒。后来发现了TC,转用TC,不过TC工具栏的图片大的蛋疼
2012-3-27 22:39
0
雪    币: 8150
活跃值: (3301)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
XYplorer 很不错的啊,推荐
2012-3-27 22:50
0
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
TC现在不常用了
2012-3-28 00:16
0
雪    币: 506
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢楼主。

感觉汇编行数多,脑子不够用啊。
2012-3-28 07:45
0
雪    币: 2271
活跃值: (2160)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
9
工具栏图标大小可以调的。。。
2012-3-28 13:08
0
雪    币:
能力值: (RANK: )
在线值:
发帖
回帖
粉丝
10
按LZ的描述, 校验用的不是CRC-32, 是Adler-32.
2012-3-28 19:37
0
雪    币: 246
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
什得借签,顶一下,呵呵。
2012-3-28 22:16
0
雪    币: 209
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习一下,收藏。
2012-3-29 01:10
0
雪    币: 506
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
试试,用Emacs哈。
2012-3-29 07:20
0
雪    币: 161
活跃值: (261)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
感謝分享去校驗教學
2012-3-29 07:30
0
雪    币: 546
活跃值: (1605)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
15
果然是好东西。感觉比TC实用啊。
查壳发现竟然是VB的产物
2012-3-29 11:47
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
谢谢楼主!
汇编行数多,脑子不够用啊。
2012-4-1 18:48
0
雪    币: 255
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
TC是好东西,今年团购买了正版。
2012-4-1 20:53
0
雪    币: 129
活跃值: (333)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
xed
18
进来学习了、
2012-4-2 10:27
0
雪    币: 95
活跃值: (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
19
谢谢分享谢谢分享谢谢分享
2012-4-2 10:28
0
雪    币: 379
活跃值: (233)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
20
高手啊,我还以为是作者自己写的呢。又多学了一个算法!
2012-4-7 16:34
0
雪    币: 1301
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
很不错的文章,学习了
2012-4-12 11:27
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
太厉害了
2020-10-10 16:58
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
mark,如果能够将find files文件查找界面直接后台调用Everything再返回就好了;如果目录图标能够自动加字就更好了;https://bbs.csdn.net/topics/390804559
2021-1-12 15:48
0
游客
登录 | 注册 方可回帖
返回
//