|
欢迎您注册加入!这里有您将更精采!
您需要 登录 才可以下载或查看,没有账号?注册
x
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了。大致能猜个差不多,然后再找一个复杂些的输入表验证一下猜测结果,基本上就八九不离十了。
如图,详细的资料见附件:
|
|