
就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