百度空间 | 百度首页 
 
查看文章
 
对程序安装文件(PPC)的一次逆向分析
2008-06-30 23:15

    刚才找不到事搞,无聊的很,随便在硬盘里乱翻,看到了个安装文件,随便用PEID查了下(纯粹乱点),加

壳 .   上次买了个PDA, 这个安装文件刚好就是PDA上的程序安装文件,随便分析了下(很久没逆向分析过程序了)...   如图:

                

这类程序很常见吧,就是一般的安装程序...

Peid查看结果...

就2个节,了解PE格式的都知道,一般根据程序默认编译选项来将, .text节为程序代码段. .rsrc为程序资源段.

懒的开IDA分析了,直接用PEID上带的反汇编功能搞定他.

.text段开始汇编代码如下:

00401000: 6416                     PUSH SS
00401002: 0000                     ADD [EAX], AL
00401004: 90                       NOP
00401005: 150000A015               ADC EAX, 15A00000
0040100A: 0000                     ADD [EAX], AL
0040100C: B215                     MOV DL, 15
0040100E: 0000                     ADD [EAX], AL
00401010: C21500                   RETN 0015
00401013: 00D0                     ADD AL, DL
00401015: 150000DC15               ADC EAX, 15DC0000
0040101A: 0000                     ADD [EAX], AL
0040101C: EA150000FE1500           JMP FAR 0015:FE000015
00401023: 000C16                   ADD [ESI+EDX], CL
00401026: 0000                     ADD [EAX], AL
00401028: 1416                     ADC AL, 16
0040102A: 0000                     ADD [EAX], AL
0040102C: 2A16                     SUB DL, [ESI]

..........下面的省略

我们的主要目的只是了解,开始的那些加载之类的信息可以跳过.

从这开始认真看下:

004010EE: 0FB7442404               MOVZX EAX, WORD PTR [ESP+04]
004010F3: 56                       PUSH ESI
004010F4: 6A63                     PUSH 00000063
004010F6: 50                       PUSH EAX
004010F7: 6A00                     PUSH 00000000
004010F9: FF150C104000             CALL [0040100C] ; FindResourceA   //查找资源
004010FF: 8BF0                     MOV ESI, EAX
00401101: 85F6                     TEST ESI, ESI
00401103: 7502                     JNZ 401107
00401105: 5E                       POP ESI
00401106: C3                       RET
00401107: 56                       PUSH ESI
00401108: 6A00                     PUSH 00000000
0040110A: FF1508104000             CALL [00401008] ; SizeofResource   //获得资源的大小
00401110: 8B4C240C                 MOV ECX, [ESP+0C]
00401114: 56                       PUSH ESI
00401115: 6A00                     PUSH 00000000
00401117: 8901                     MOV [ECX], EAX
00401119: FF1504104000             CALL [00401004] ; LoadResource //载入资源
0040111F: 50                       PUSH EAX
00401120: FF1538104000             CALL [00401038] ; LockResource   //锁定资源
00401126: 5E                       POP ESI
00401127: C3                       RET

上面的几个重要的API的功能我都给了注释,      通过上面的代码可以分析到, 安装文件里的程序(实际上和解压一个概念) 是以资源的方式加载到安装文件里的(写过木马生成器的人都应该晓得).

当安装程序运行的时候当然先要开始定位程序里的资源的文件里的位置....

接着往下看.

00401128: 55                       PUSH EBP
00401129: 8BEC                     MOV EBP, ESP
0040112B: 56                       PUSH ESI
0040112C: 33F6                     XOR ESI, ESI
0040112E: 57                       PUSH EDI
0040112F: 56                       PUSH ESI
00401130: 6880000000               PUSH 00000080
00401135: 6A02                     PUSH 00000002
00401137: 56                       PUSH ESI
00401138: 56                       PUSH ESI
00401139: 6800000040               PUSH 40000000
0040113E: FF7510                   PUSH [EBP+10]
00401141: FF1518104000             CALL [00401018] ; CreateFileA //创建文件
00401147: 8BF8                     MOV EDI, EAX
00401149: 83FFFF                   CMP EDI, FFFFFFFF
0040114C: 742A                     JZ 401178
0040114E: 897510                   MOV [EBP+10], ESI
00401151: 56                       PUSH ESI
00401152: 8B750C                   MOV ESI, [EBP+0C]
00401155: 8D4510                   LEA EAX, [EBP+10]
00401158: 50                       PUSH EAX
00401159: 56                       PUSH ESI
0040115A: FF7508                   PUSH [EBP+08]
0040115D: 57                       PUSH EDI
0040115E: FF1514104000             CALL [00401014] ; WriteFile //写入数据
00401164: 85C0                     TEST EAX, EAX
00401166: 7410                     JZ 401178
00401168: 3B7510                   CMP ESI, [EBP+10]
0040116B: 750B                     JNZ 401178
0040116D: 57                       PUSH EDI
0040116E: FF1510104000             CALL [00401010] ; CloseHandle
00401174: B001                     MOV AL, 01
00401176: EB02                     JMP 40117A
00401178: 32C0                     XOR AL, AL
0040117A: 5F                       POP EDI
0040117B: 5E                       POP ESI
0040117C: 5D                       POP EBP
0040117D: C3                       RET

当程序里的资源锁定后,当然开始创建文件, 程序的指针保存在EAX里(PUSH EAX), 然后把资源用WriteFile写入创建的文件里. 文件写入后是些收尾工作!

004013A1: 57                       PUSH EDI
004013A2: 50                       PUSH EAX
004013A3: 57                       PUSH EDI
004013A4: FF1530104000             CALL [00401030] ; CreateProcessA
004013AA: 85C0                     TEST EAX, EAX
004013AC: 750D                     JNZ 4013BB
004013AE: 8D859CFCFFFF             LEA EAX, [EBP-00000364]
004013B4: 50                       PUSH EAX
004013B5: FFD3                     CALL EBX
004013B7: 32C0                     XOR AL, AL
004013B9: EB44                     JMP 4013FF
004013BB: FF75F0                   PUSH [EBP-10]
004013BE: 8B3510104000             MOV ESI, [00401010]
004013C4: FFD6                     CALL ESI
004013C6: 6AFF                     PUSH FFFFFFFF
004013C8: FF75EC                   PUSH [EBP-14]
004013CB: FF152C104000             CALL [0040102C] ; WaitForSingleObject

程序运行到这后,用CreateProcessA函数创建进程,WaitForSingleObject为消息等待模式.

0040141D: FF1554104000             CALL [00401054] ; GetModuleFileNameA
00401423: 8A8DF8FEFFFF             MOV CL, [EBP-00000108]
00401429: 33D2                     XOR EDX, EDX
0040142B: 84C9                     TEST CL, CL
0040142D: 8D85F8FEFFFF             LEA EAX, [EBP-00000108]
00401433: 7416                     JZ 40144B
00401435: 80F95C                   CMP CL, 5C
00401438: 7503                     JNZ 40143D
0040143A: 8D5001                   LEA EDX, [EAX+01]
0040143D: 8A4801                   MOV CL, [EAX+01]
00401440: 40                       INC EAX
00401441: 84C9                     TEST CL, CL
00401443: 75F0                     JNZ 401435
00401445: 85D2                     TEST EDX, EDX
00401447: 7402                     JZ 40144B
00401449: 200A                     AND [EDX], CL
0040144B: 8D45FC                   LEA EAX, [EBP-04]
0040144E: 50                       PUSH EAX
0040144F: 8D85F8FEFFFF             LEA EAX, [EBP-00000108]
00401455: 50                       PUSH EAX
00401456: E8D0FDFFFF               CALL 0040122B
0040145B: 59                       POP ECX
0040145C: 84C0                     TEST AL, AL
0040145E: 59                       POP ECX
0040145F: 7528                     JNZ 401489
00401461: 8D85F4FDFFFF             LEA EAX, [EBP-0000020C]
00401467: 56                       PUSH ESI
00401468: 50                       PUSH EAX
00401469: FF1550104000             CALL [00401050] ; 0040141D: FF1554104000             CALL [00401054] ; GetModuleFileNameA
00401423: 8A8DF8FEFFFF             MOV CL, [EBP-00000108]
00401429: 33D2                     XOR EDX, EDX
0040142B: 84C9                     TEST CL, CL
0040142D: 8D85F8FEFFFF             LEA EAX, [EBP-00000108]
00401433: 7416                     JZ 40144B
00401435: 80F95C                   CMP CL, 5C
00401438: 7503                     JNZ 40143D
0040143A: 8D5001                   LEA EDX, [EAX+01]
0040143D: 8A4801                   MOV CL, [EAX+01]
00401440: 40                       INC EAX
00401441: 84C9                     TEST CL, CL
00401443: 75F0                     JNZ 401435
00401445: 85D2                     TEST EDX, EDX
00401447: 7402                     JZ 40144B
00401449: 200A                     AND [EDX], CL
0040144B: 8D45FC                   LEA EAX, [EBP-04]
0040144E: 50                       PUSH EAX
0040144F: 8D85F8FEFFFF             LEA EAX, [EBP-00000108]
00401455: 50                       PUSH EAX
00401456: E8D0FDFFFF               CALL 0040122B
0040145B: 59                       POP ECX
0040145C: 84C0                     TEST AL, AL
0040145E: 59                       POP ECX
0040145F: 7528                     JNZ 401489
00401461: 8D85F4FDFFFF             LEA EAX, [EBP-0000020C]
00401467: 56                       PUSH ESI
00401468: 50                       PUSH EAX
00401469: FF1550104000             CALL [00401050] ; GetWindowsDirectoryA
0040146F: 85C0                     TEST EAX, EAX
00401471: 741B                     JZ 40148E

0040146F: 85C0                     TEST EAX, EAX
00401471: 741B                     JZ 40148E

获得系统目录和程序根目录,在这句 00401471: 741B                     JZ 40148E

可以看到当GetWindowsDirectoryA
函数调用失败,程序跳至 40148E处,去那看看...

0040148E: 6A00                     PUSH 00000000
00401490: 68E8104000               PUSH 004010E8 -> Error
00401495: 688C104000               PUSH 0040108C -> An error has occured while executing this program. Free up harddrive space and try again.
0040149A: 6A00                     PUSH 00000000
0040149C: FF156C104000             CALL [0040106C] ; MessageBoxA

0040148E出连续PUSH进去了几个出错信息,通过MessageBoxA弹出错错对话框.

程序的大致流程就是这样,了解方法后就可以自己也编写一般安装程序了,这大概就是逆向的迷人之处吧.

当然本文纯熟自己无聊的时候写的,顺便在温热下技术, 很长时间没捣鼓这了,有点生疏了, 看来技术只有在不断的测试中才能得到升华.........

By:Shminow





                           


类别:默认分类 | 添加到搜藏 | 浏览() | 评论 (5)
 
最近读者:
 
网友评论:
1
2008-07-01 08:25 | 回复
文章难度大了
 
2
2008-07-02 12:52 | 回复
汇编代码搞的人好晕哦
 
3
2008-07-04 11:54 | 回复
看的我晕头转向,功底还是不够呀
 
4
2008-07-12 21:40 | 回复
好文,希望说明能再详细点
 
5
2008-07-14 12:47 | 回复
不懂
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu