- UID
- 2198
注册时间2005-6-29
阅读权限255
最后登录1970-1-1
副坛主
该用户从未签到
|
几年前的帖子,顺手转过来: http://bbs.pediy.com/showthread.php?t=115901
1. 申请空间并用Aplib将LAZM模块解码至此
2. 用LAZM解码代码段
3. 处理 E9 指令的偏移值
4. 恢复输入表
5. 恢复各区段的属性
6. JMP 到OEP
写脱壳机的时遇到的一些小东东: 北斗壳有一些小手法 一个是关键数据的偏移值是变量 需要通过OEP偏移来求取 一个是处理输入表的时候API addr 中间有 thunk值的特殊处理
更详细的分析 有时间送大家个视频好了 权当PE结构浅析的视频 o(∩_∩)o...
壳代码太多的通过EBP来求偏移的数据,直接用OD分析了,更方便些。
有两点疑惑:
一个是Nspack直接舍去了原程序的.reloc段,当然壳自己实现了LoadPE也无须该节了,还没想明白为啥他就理直气壮的给我拿掉了。
第二个是原程序的资源段的数据,NsPack首先填充了解码IAT的关键数据,故此原程序的资源势必造成相对偏移值增加,这里不清楚壳是如何处理好对资源的调用OK的。
刚接触壳,挑个简单的捏吧,有分析不当之处还望老大们多多指正。
- 0043298A > 9C PUSHFD
- 0043298B 60 PUSHAD
- 0043298C E8 00000000 CALL 复件_Sdk.00432991
- 00432991 5D POP EBP
- 00432992 83ED 07 SUB EBP,7 ; 求得程序入口地址,将壳段入口作为偏移 保存到EBP中
- 00432995 8D8D 96FEFFFF LEA ECX,DWORD PTR SS:[EBP-16A] ; 类似标志位
- 0043299B 8039 01 CMP BYTE PTR DS:[ECX],1
- 0043299E 0F84 42020000 JE 复件_Sdk.00432BE6
- 004329A4 C601 01 MOV BYTE PTR DS:[ECX],1
- 004329A7 8BC5 MOV EAX,EBP
- 004329A9 2B85 2AFEFFFF SUB EAX,DWORD PTR SS:[EBP-1D6] ; AddressOfEntryPoint
- 004329AF 8985 2AFEFFFF MOV DWORD PTR SS:[EBP-1D6],EAX ; BaseAddr
- 004329B5 0185 5AFEFFFF ADD DWORD PTR SS:[EBP-1A6],EAX ; SizeOfHeaders+ BaseAddr = CodeSection Addr
- 004329BB 8DB5 9EFEFFFF LEA ESI,DWORD PTR SS:[EBP-162] ; SectionAlignment
- 004329C1 0106 ADD DWORD PTR DS:[ESI],EAX ; SizeOfHeaders + BaseAddr = CodeSection Addr
- 004329C3 55 PUSH EBP ; 程序入口点
- 004329C4 56 PUSH ESI
- 004329C5 6A 40 PUSH 40
- 004329C7 68 00100000 PUSH 1000
- 004329CC 68 00100000 PUSH 1000 ; Size
- 004329D1 6A 00 PUSH 0
- 004329D3 FF95 D2FEFFFF CALL DWORD PTR SS:[EBP-12E] ; VirtualAlloc return = 3F0000
- 004329D9 85C0 TEST EAX,EAX
- 004329DB 0F84 69030000 JE 复件_Sdk.00432D4A
- 004329E1 8985 52FEFFFF MOV DWORD PTR SS:[EBP-1AE],EAX ; NewAddr size = 1000
- 004329E7 E8 00000000 CALL 复件_Sdk.004329EC
- 004329EC 5B POP EBX ; 求出该代码的EIP 004329EC
- 004329ED B9 67030000 MOV ECX,367 ; 固定数值
- 004329F2 03D9 ADD EBX,ECX ; 求出偏移地址 00432D53
- 004329F4 50 PUSH EAX ; NewAddr
- 004329F5 53 PUSH EBX ; 程序待解码的数据地址
- 004329F6 E8 B0020000 CALL 复件_Sdk.00432CAB ; 疑似APLIB解码出LZMA的代码
- 004329FB 5E POP ESI
- 004329FC 5D POP EBP ; 这两句平衡堆栈
- 004329FD 8B36 MOV ESI,DWORD PTR DS:[ESI]
- 004329FF 8BFD MOV EDI,EBP ; 入口点
- 00432A01 03BD 1AFEFFFF ADD EDI,DWORD PTR SS:[EBP-1E6] ; 第二个偏移值 : 0x906
- 00432A07 8BDF MOV EBX,EDI ; EBX = EDI = 00433290
- 00432A09 833F 00 CMP DWORD PTR DS:[EDI],0
- 00432A0C 75 0A JNZ SHORT 复件_Sdk.00432A18
- 00432A0E 83C7 04 ADD EDI,4
- 00432A11 B9 00000000 MOV ECX,0
- 00432A16 EB 16 JMP SHORT 复件_Sdk.00432A2E
- 00432A18 B9 01000000 MOV ECX,1
- 00432A1D 033B ADD EDI,DWORD PTR DS:[EBX]
- 00432A1F 83C3 04 ADD EBX,4
- 00432A22 833B 00 CMP DWORD PTR DS:[EBX],0
- 00432A25 74 34 JE SHORT 复件_Sdk.00432A5B
- 00432A27 0113 ADD DWORD PTR DS:[EBX],EDX
- 00432A29 8B33 MOV ESI,DWORD PTR DS:[EBX]
- 00432A2B 037B 04 ADD EDI,DWORD PTR DS:[EBX+4]
- 00432A2E 57 PUSH EDI
- 00432A2F 51 PUSH ECX
- 00432A30 53 PUSH EBX
- 00432A31 FFB5 D6FEFFFF PUSH DWORD PTR SS:[EBP-12A] ; 参数一:VirtualFree
- 00432A37 FFB5 D2FEFFFF PUSH DWORD PTR SS:[EBP-12E] ; 参数二:VitrualAlloc
- 00432A3D 8BD6 MOV EDX,ESI ; 参数三:EDX 401000
- 00432A3F 8BCF MOV ECX,EDI ; 参数四:ECX 433294
- 00432A41 8B85 52FEFFFF MOV EAX,DWORD PTR SS:[EBP-1AE] ; NewAddr
- 00432A47 05 AA050000 ADD EAX,5AA ; 求得新空间某API的地址
- 00432A4C FFD0 CALL EAX ; 解码了Code段
- 00432A4E 5B POP EBX
- 00432A4F 59 POP ECX
- 00432A50 5F POP EDI
- 00432A51 83F9 00 CMP ECX,0
- 00432A54 74 05 JE SHORT 复件_Sdk.00432A5B
- 00432A56 83C3 08 ADD EBX,8
- 00432A59 ^ EB C7 JMP SHORT 复件_Sdk.00432A22
- 00432A5B 68 00800000 PUSH 8000
- 00432A60 6A 00 PUSH 0
- 00432A62 FFB5 52FEFFFF PUSH DWORD PTR SS:[EBP-1AE]
- 00432A68 FF95 D6FEFFFF CALL DWORD PTR SS:[EBP-12A] ; VirtualFree 释放LZMA的代码
- 00432A6E 8DB5 5AFEFFFF LEA ESI,DWORD PTR SS:[EBP-1A6] ; EBP 43298A
- 00432A74 8B4E 08 MOV ECX,DWORD PTR DS:[ESI+8] ; ECX = 391
- 00432A77 8D56 10 LEA EDX,DWORD PTR DS:[ESI+10] ; 这行代码有啥用呢 下边做比较判断用
- 00432A7A 8B36 MOV ESI,DWORD PTR DS:[ESI] ; 一下一个循环要处理 CALL 的重定位表
- 00432A7C 8BFE MOV EDI,ESI
- 00432A7E 83F9 00 CMP ECX,0
- 00432A81 74 3F JE SHORT 复件_Sdk.00432AC2
- 00432A83 8A07 MOV AL,BYTE PTR DS:[EDI]
- 00432A85 47 INC EDI
- 00432A86 2C E8 SUB AL,0E8
- 00432A88 3C 01 CMP AL,1 ; 处理 Call 的重定位表
- 00432A8A ^ 77 F7 JA SHORT 复件_Sdk.00432A83 ; 处理E9 找到E9
- 00432A8C 8B07 MOV EAX,DWORD PTR DS:[EDI] ; COPY 出 CALL的偏移值
- 00432A8E 807A 01 00 CMP BYTE PTR DS:[EDX+1],0
- 00432A92 74 14 JE SHORT 复件_Sdk.00432AA8
- 00432A94 8A1A MOV BL,BYTE PTR DS:[EDX] ; EDX 这里做判断用
- 00432A96 381F CMP BYTE PTR DS:[EDI],BL
- 00432A98 ^ 75 E9 JNZ SHORT 复件_Sdk.00432A83
- 00432A9A 8A5F 04 MOV BL,BYTE PTR DS:[EDI+4]
- 00432A9D 66:C1E8 08 SHR AX,8 ; 算法 解密偏移
- 00432AA1 C1C0 10 ROL EAX,10
- 00432AA4 86C4 XCHG AH,AL
- 00432AA6 EB 0A JMP SHORT 复件_Sdk.00432AB2
- 00432AA8 8A5F 04 MOV BL,BYTE PTR DS:[EDI+4] ; 第二种解法
- 00432AAB 86C4 XCHG AH,AL
- 00432AAD C1C0 10 ROL EAX,10
- 00432AB0 86C4 XCHG AH,AL
- 00432AB2 2BC7 SUB EAX,EDI ; 计算的结果 - 自身的偏移
- 00432AB4 03C6 ADD EAX,ESI ; + Code 的起始地址
- 00432AB6 8907 MOV DWORD PTR DS:[EDI],EAX
- 00432AB8 83C7 05 ADD EDI,5
- 00432ABB 80EB E8 SUB BL,0E8
- 00432ABE 8BC3 MOV EAX,EBX
- 00432AC0 ^ E2 C6 LOOPD SHORT 复件_Sdk.00432A88
- 00432AC2 E8 3A010000 CALL 复件_Sdk.00432C01 ; Fix IAT
- 00432AC7 8D8D 6EFEFFFF LEA ECX,DWORD PTR SS:[EBP-192]
- 00432ACD 8B41 08 MOV EAX,DWORD PTR DS:[ECX+8]
- 00432AD0 83F8 00 CMP EAX,0
- 00432AD3 0F84 81000000 JE 复件_Sdk.00432B5A ; JMP 没看懂这里比较的是什么
- 00432AD9 8BF2 MOV ESI,EDX
- 00432ADB 2B71 10 SUB ESI,DWORD PTR DS:[ECX+10]
- 00432ADE 74 7A JE SHORT 复件_Sdk.00432B5A
- 00432AE0 8971 10 MOV DWORD PTR DS:[ECX+10],ESI
- 00432AE3 8DB5 9EFEFFFF LEA ESI,DWORD PTR SS:[EBP-162]
- 00432AE9 8B36 MOV ESI,DWORD PTR DS:[ESI]
- 00432AEB 8D5E FC LEA EBX,DWORD PTR DS:[ESI-4]
- 00432AEE 8B01 MOV EAX,DWORD PTR DS:[ECX]
- 00432AF0 83F8 01 CMP EAX,1
- 00432AF3 74 0A JE SHORT 复件_Sdk.00432AFF
- 00432AF5 8BFA MOV EDI,EDX
- 00432AF7 0379 08 ADD EDI,DWORD PTR DS:[ECX+8]
- 00432AFA 8B49 10 MOV ECX,DWORD PTR DS:[ECX+10]
- 00432AFD EB 08 JMP SHORT 复件_Sdk.00432B07
- 00432AFF 8BFE MOV EDI,ESI
- 00432B01 0379 08 ADD EDI,DWORD PTR DS:[ECX+8]
- 00432B04 8B49 10 MOV ECX,DWORD PTR DS:[ECX+10]
- 00432B07 33C0 XOR EAX,EAX
- 00432B09 8A07 MOV AL,BYTE PTR DS:[EDI]
- 00432B0B 47 INC EDI
- 00432B0C 0BC0 OR EAX,EAX
- 00432B0E 74 20 JE SHORT 复件_Sdk.00432B30
- 00432B10 3C EF CMP AL,0EF
- 00432B12 77 06 JA SHORT 复件_Sdk.00432B1A
- 00432B14 03D8 ADD EBX,EAX
- 00432B16 010B ADD DWORD PTR DS:[EBX],ECX
- 00432B18 ^ EB ED JMP SHORT 复件_Sdk.00432B07
- 00432B1A 24 0F AND AL,0F
- 00432B1C C1E0 10 SHL EAX,10
- 00432B1F 66:8B07 MOV AX,WORD PTR DS:[EDI]
- 00432B22 83C7 02 ADD EDI,2
- 00432B25 0BC0 OR EAX,EAX
- 00432B27 ^ 75 EB JNZ SHORT 复件_Sdk.00432B14
- 00432B29 8B07 MOV EAX,DWORD PTR DS:[EDI]
- 00432B2B 83C7 04 ADD EDI,4
- 00432B2E ^ EB E4 JMP SHORT 复件_Sdk.00432B14
- 00432B30 33DB XOR EBX,EBX
- 00432B32 87FE XCHG ESI,EDI
- 00432B34 8B06 MOV EAX,DWORD PTR DS:[ESI]
- 00432B36 83F8 00 CMP EAX,0
- 00432B39 74 1F JE SHORT 复件_Sdk.00432B5A
- 00432B3B AD LODS DWORD PTR DS:[ESI]
- 00432B3C 0BC0 OR EAX,EAX
- 00432B3E 74 08 JE SHORT 复件_Sdk.00432B48
- 00432B40 03D8 ADD EBX,EAX
- 00432B42 66:010C1F ADD WORD PTR DS:[EDI+EBX],CX
- 00432B46 ^ EB F3 JMP SHORT 复件_Sdk.00432B3B
- 00432B48 33DB XOR EBX,EBX
- 00432B4A C1E9 10 SHR ECX,10
- 00432B4D AD LODS DWORD PTR DS:[ESI]
- 00432B4E 0BC0 OR EAX,EAX
- 00432B50 74 08 JE SHORT 复件_Sdk.00432B5A
- 00432B52 03D8 ADD EBX,EAX
- 00432B54 66:010C1F ADD WORD PTR DS:[EDI+EBX],CX
- 00432B58 ^ EB F3 JMP SHORT 复件_Sdk.00432B4D
- 00432B5A 8DB5 2AFEFFFF LEA ESI,DWORD PTR SS:[EBP-1D6] ; jmp 到这里
- 00432B60 8B16 MOV EDX,DWORD PTR DS:[ESI] ; BaseAddr
- 00432B62 8DB5 86FEFFFF LEA ESI,DWORD PTR SS:[EBP-17A]
- 00432B68 8A06 MOV AL,BYTE PTR DS:[ESI]
- 00432B6A 3C 01 CMP AL,1 ; 这里有一个分支
- 00432B6C 75 3F JNZ SHORT 复件_Sdk.00432BAD ; 跳走
- 00432B6E 0356 04 ADD EDX,DWORD PTR DS:[ESI+4]
- 00432B71 56 PUSH ESI
- 00432B72 52 PUSH EDX
- 00432B73 56 PUSH ESI
- 00432B74 6A 04 PUSH 4
- 00432B76 68 00010000 PUSH 100
- 00432B7B 52 PUSH EDX
- 00432B7C FF95 CEFEFFFF CALL DWORD PTR SS:[EBP-132]
- 00432B82 5F POP EDI
- 00432B83 5E POP ESI
- 00432B84 83F8 01 CMP EAX,1
- 00432B87 0F85 BD010000 JNZ 复件_Sdk.00432D4A
- 00432B8D 83C6 08 ADD ESI,8
- 00432B90 B9 08000000 MOV ECX,8
- 00432B95 F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
- 00432B97 83EE 0C SUB ESI,0C
- 00432B9A 83EF 08 SUB EDI,8
- 00432B9D 56 PUSH ESI
- 00432B9E FF76 FC PUSH DWORD PTR DS:[ESI-4]
- 00432BA1 68 00010000 PUSH 100
- 00432BA6 57 PUSH EDI
- 00432BA7 FF95 CEFEFFFF CALL DWORD PTR SS:[EBP-132]
- 00432BAD 55 PUSH EBP
- 00432BAE 5B POP EBX
- 00432BAF 81EB 21000000 SUB EBX,21
- 00432BB5 33C9 XOR ECX,ECX
- 00432BB7 8A0B MOV CL,BYTE PTR DS:[EBX] ; 当前程序的区段数
- 00432BB9 80F9 00 CMP CL,0
- 00432BBC 74 28 JE SHORT 复件_Sdk.00432BE6
- 00432BBE 43 INC EBX
- 00432BBF 8DB5 2AFEFFFF LEA ESI,DWORD PTR SS:[EBP-1D6]
- 00432BC5 8B16 MOV EDX,DWORD PTR DS:[ESI]
- 00432BC7 56 PUSH ESI
- 00432BC8 51 PUSH ECX
- 00432BC9 53 PUSH EBX
- 00432BCA 52 PUSH EDX
- 00432BCB 56 PUSH ESI
- 00432BCC FF33 PUSH DWORD PTR DS:[EBX]
- 00432BCE FF73 04 PUSH DWORD PTR DS:[EBX+4]
- 00432BD1 8B43 08 MOV EAX,DWORD PTR DS:[EBX+8]
- 00432BD4 03C2 ADD EAX,EDX
- 00432BD6 50 PUSH EAX
- 00432BD7 FF95 CEFEFFFF CALL DWORD PTR SS:[EBP-132] ; VirtualProtect 恢复各区段属性
- 00432BDD 5A POP EDX
- 00432BDE 5B POP EBX
- 00432BDF 59 POP ECX
- 00432BE0 5E POP ESI
- 00432BE1 83C3 0C ADD EBX,0C
- 00432BE4 ^ E2 E1 LOOPD SHORT 复件_Sdk.00432BC7
- 00432BE6 B8 00000000 MOV EAX,0
- 00432BEB 83F8 00 CMP EAX,0
- 00432BEE 74 0A JE SHORT 复件_Sdk.00432BFA
- 00432BF0 61 POPAD
- 00432BF1 9D POPFD
- 00432BF2 B8 01000000 MOV EAX,1
- 00432BF7 C2 0C00 RETN 0C
- 00432BFA 61 POPAD
- 00432BFB 9D POPFD
- 00432BFC - E9 DF07FDFF JMP 复件_Sdk.004033E0 ; JMP 到 OEP
- Fix IAT 函数的处理:
- 00432C01 8BB5 22FEFFFF MOV ESI,DWORD PTR SS:[EBP-1DE] ; 修复IAT表 EBP 永远是基地址
- 00432C07 0BF6 OR ESI,ESI
- 00432C09 0F84 97000000 JE 复件_Sdk.00432CA6
- 00432C0F 8B95 2AFEFFFF MOV EDX,DWORD PTR SS:[EBP-1D6] ; 400000
- 00432C15 03F2 ADD ESI,EDX ; 430000
- 00432C17 833E 00 CMP DWORD PTR DS:[ESI],0
- 00432C1A 75 0E JNZ SHORT 复件_Sdk.00432C2A
- 00432C1C 837E 04 00 CMP DWORD PTR DS:[ESI+4],0
- 00432C20 75 08 JNZ SHORT 复件_Sdk.00432C2A
- 00432C22 837E 08 00 CMP DWORD PTR DS:[ESI+8],0
- 00432C26 75 02 JNZ SHORT 复件_Sdk.00432C2A
- 00432C28 EB 7A JMP SHORT 复件_Sdk.00432CA4
- 00432C2A 8B5E 08 MOV EBX,DWORD PTR DS:[ESI+8] ; IAT TABLE ADDR
- 00432C2D 03DA ADD EBX,EDX
- 00432C2F 53 PUSH EBX ; 保存表
- 00432C30 52 PUSH EDX
- 00432C31 56 PUSH ESI ; 保存ESI
- 00432C32 8DBD 42FFFFFF LEA EDI,DWORD PTR SS:[EBP-BE] ; KERNEL32.DLL
- 00432C38 037E 04 ADD EDI,DWORD PTR DS:[ESI+4]
- 00432C3B 83C6 0C ADD ESI,0C ; ADD
- 00432C3E 57 PUSH EDI
- 00432C3F FF95 C6FEFFFF CALL DWORD PTR SS:[EBP-13A] ; LoadLibraryA
- 00432C45 5F POP EDI ; 恢复ESI到EDI
- 00432C46 5A POP EDX
- 00432C47 5B POP EBX
- 00432C48 83F8 00 CMP EAX,0 ; hHandle
- 00432C4B 74 59 JE SHORT 复件_Sdk.00432CA6
- 00432C4D 8985 32FEFFFF MOV DWORD PTR SS:[EBP-1CE],EAX ; EBX 是IAT ADDR 的表
- 00432C53 033E ADD EDI,DWORD PTR DS:[ESI] ; EDI + IAT STRING 的相对偏移
- 00432C55 83C6 04 ADD ESI,4
- 00432C58 33C9 XOR ECX,ECX ; DO
- 00432C5A 8A0E MOV CL,BYTE PTR DS:[ESI] ; 这里又是一张表 对应每个API的长度
- 00432C5C 83F9 00 CMP ECX,0
- 00432C5F 75 03 JNZ SHORT 复件_Sdk.00432C64
- 00432C61 46 INC ESI
- 00432C62 ^ EB B3 JMP SHORT 复件_Sdk.00432C17
- 00432C64 8BC7 MOV EAX,EDI ; 保存字符串地址
- 00432C66 03F9 ADD EDI,ECX ; EDI = NEXT API String
- 00432C68 52 PUSH EDX
- 00432C69 53 PUSH EBX
- 00432C6A 50 PUSH EAX
- 00432C6B 8038 FF CMP BYTE PTR DS:[EAX],0FF ; 比较 API first Char if OFF
- 00432C6E 75 08 JNZ SHORT 复件_Sdk.00432C78
- 00432C70 40 INC EAX
- 00432C71 8B00 MOV EAX,DWORD PTR DS:[EAX]
- 00432C73 25 FFFFFF7F AND EAX,7FFFFFFF
- 00432C78 8A0F MOV CL,BYTE PTR DS:[EDI] ; 先保存
- 00432C7A C607 00 MOV BYTE PTR DS:[EDI],0 ; 在至零
- 00432C7D 51 PUSH ECX ; 保存临时值 CL
- 00432C7E 50 PUSH EAX ; API String
- 00432C7F FFB5 32FEFFFF PUSH DWORD PTR SS:[EBP-1CE] ; DLL Handle
- 00432C85 FF95 CAFEFFFF CALL DWORD PTR SS:[EBP-136] ; GetProcAddress
- 00432C8B 59 POP ECX
- 00432C8C 5A POP EDX ; mov edx,eax // 不影响 API addr
- 00432C8D 5B POP EBX
- 00432C8E 5A POP EDX
- 00432C8F 83F8 00 CMP EAX,0
- 00432C92 74 12 JE SHORT 复件_Sdk.00432CA6
- 00432C94 880F MOV BYTE PTR DS:[EDI],CL ; 还原API STRING
- 00432C96 8946 FC MOV DWORD PTR DS:[ESI-4],EAX ; 临时空间
- 00432C99 FF76 FC PUSH DWORD PTR DS:[ESI-4]
- 00432C9C 8F03 POP DWORD PTR DS:[EBX] ; EBX 存放Import Table
- 00432C9E 83C3 04 ADD EBX,4
- 00432CA1 46 INC ESI ; API STRING LENTABLE ++
- 00432CA2 ^ EB B4 JMP SHORT 复件_Sdk.00432C58
- 00432CA4 F8 CLC
- 00432CA5 C3 RETN
复制代码
对Fix Iat 函数中的一些笔记注释:
原程序输入表部分的信息:
00400158 00F00200 DD 0002F000 ; Import Table address = 2F000 // 5 DWORD Tables
0040015C 50000000 DD 00000050 ; Import Table size = 50 (80.)
004001B0 78F20200 DD 0002F278 ; Import Address Table address = 2F278 // IATs
004001B4 28020000 DD 00000228 ; Import Address Table size = 228 (552.)
[ebp-0be] 是DLL名称表,其对应了一个SIZE表[ESI+4]
004328CC 4B 45 52 4E 45 4C 33 32 2E 44 4C 4C 00 55 53 45 KERNEL32.DLL.USE
004328DC 52 33 32 2E 44 4C 4C 00 47 44 49 33 32 2E 44 4C R32.DLL.GDI32.DL
004328EC 4C 00 00 00
全局数据:
MOV ESI,DWORD PTR SS:[EBP-1DE] // 30000 这个应该是VirtualAddress 数据在资源段中
00400270 2E 72 73 72>ASCII ".rsrc" ; SECTION
00400278 8C190000 DD 0000198C ; VirtualSize = 198C (6540.)
0040027C 00000300 DD 00030000 ; VirtualAddress = 30000
00400280 00200000 DD 00002000 ; SizeOfRawData = 2000 (8192.)
00400284 00E00200 DD 0002E000 ; PointerToRawData = 2E000
MOV EDX,DWORD PTR SS:[EBP-1D6] 400000 // BaseAddr
求出VirtualAddr的内容数据:
处理DLL名称表的偏移
OffSet IAT Addr API STRINGS
00430000 4A 00 00 00 00 00 00 00 B4 F2 02 00 9C 00 00 00 J.......打.?..
00430010 0E 0C 0E 0C 0C 0E 0E 13 08 06 09 0E 0C 0C 0B 09 .......
00430020 09 0B 08 0A 0B 0D 17 0B 17 10 0B 15 0C 16 0D 0C ......
00430030 10 0F 0F 0A 0B 0D 0C 0C 0A 09 14 12 0E 0C 14 12 .......
00430040 10 11 18 17 17 13 15 16 0E 00 2D 00 00 00 0D 00 .-.....
00430050 00 00 F0 F3 02 00 88 03 00 00 09 0F 0D 0E 0A 08 ..痼.?.....
00430060 08 0F 0F 0A 0C 0B 10 0B 11 0B 15 10 10 09 09 0B ....
00430070 0D 0E 08 08 05 09 00 15 00 00 00 18 00 00 00 78 .........x
00430080 F2 02 00 A9 04 00 00 0E 10 08 0A 00 00 00 00 00 ?.?........
00430090 00 00 00 00 00 00 00 00 00 00 00 00 43 6F 6D 70 ............Comp
简单说下00430000处的数据:
4A 00 00 00
00 00 00 00 计算中的相对偏移
B4 F2 02 00 IAT Table Addr
9C 00 00 00 API字符串的偏移 // 这里使用一次后做临时变量空间用
00430010:0E 0C 0E 0C 字符串中对应API Name的长度
填补输入表,只要拥有结构体中的 IAT TABLE Addr 和 API NAME、DLL NAME就OK了
IAT TABLE STRUCT:
1. OFFSET TABLE ADDR XX // 通过偏移找到对应的IAT名称
2. XXX
3. XXX
4. DLL STRING ADDR OK // 数据中已给出
5. IAT ADDR OK // 数据中已给出
接触壳不多,之前了解过PE格式,现学先用好了,这里分享一份IAT的复习笔记:
学习Import Address Table 和 Import Table 格式的时候不需要看什么资料,先拿最简单的MsgBox程序,OD载入后直接猜其输入表就OK了。大致能猜个差不多,然后再找一个复杂些的输入表验证一下猜测结果,基本上就八九不离十了。
如图,详细的资料见附件:
|
评分
-
查看全部评分
|