附件:dump.zip
上次时间紧, 第八部分没有分析仔细. 不好意思.
实际上是第八部分是处理资源的. 壳对资源特别照顾, 去掉了资源的头, 只保留了数据.
然后 HOOK 了处理资源的函数, 为主程序提供资源.
目前好象没有工具可以自动建立资源头, 我是手动组装的, 如果熟悉资源格式的话, 花一个小时就够了.
接下来, 就到了比较有特色的 IAT 处理部分.
大致思路是 为每一个 DLL 建立一个线程, 为每一个 API 建立一段代码, 但并不求出地址.
每个线程每过 2ms 扫描一次 53B8C48 的对列.
到了主程序, 每遇到一个 API, API的代码就往 53B8C48 队列插入一个成员(APIAddress=0)
然后就等待 2ms. 这时线程扫描队列, 根据 DLLNameHash 决定是否由本线程处理,
如果是, 对APIaddress=0 的成员计算地址.
2ms 后, 主程序得到了 API 地址, 继续执行.
Structure 成员
{
DWORD DLLNameHash;
DWORD APINameHash;
DWORD APIAddress( 0 表示没计算好)
}
从上面的分析知道, 每遇到一个新 API, 程序就要等待 2ms, 所以程序启动有点慢.
如果缩小这个时间, 扫描线程又会和主线程抢 CPU 资源.
并且知道了原理, IAT 的修复是非常容易的, 见脱壳文件. 附件中还有全文.
九. 解出部分加壳前的 PE 信息 ( 原来的 ImageBase, OEP, baseofcode )
053BECBD 8B45 D8 MOV EAX,DWORD PTR SS:[EBP-28] ; StolenOEP + code 压缩的大小
053BECEB 56 PUSH ESI
053BED71 6A 04 PUSH 4 ; 读 4 字节
053BECD8 8D3C08 LEA EDI,DWORD PTR DS:[EAX+ECX]
053BED91 8D45 E4 LEA EAX,DWORD PTR SS:[EBP-1C]
053BED54 50 PUSH EAX
053BEDA2 A1 88A03B05 MOV EAX,DWORD PTR DS:[53BA088]
053BED31 57 PUSH EDI ; EXERe.053D2736
053BE5F4 FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8]
053BED22 F7D0 NOT EAX
053BEBA5 FFD0 CALL EAX ; ReadProcessMemory ( 4 byte)
053BED84 56 PUSH ESI
053BEBD2 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
053BEBC4 6A 04 PUSH 4
053BEC0E 50 PUSH EAX
053BEC24 8D47 04 LEA EAX,DWORD PTR DS:[EDI+4]
053BEA05 50 PUSH EAX ; EXERe.053D273A
053BEBF8 A1 88A03B05 MOV EAX,DWORD PTR DS:[53BA088]
053BEB5C FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8]
053BEBE0 F7D0 NOT EAX
053BEB90 FFD0 CALL EAX ; ReadProcessMemory
053BEB3A FF75 E4 PUSH DWORD PTR SS:[EBP-1C] ; uncompressed size
053BEB73 A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053BEB81 F7D0 NOT EAX
053BEA5E 6A 08 PUSH 8
053BEA36 FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053BEA1E FFD0 CALL EAX ; ntdll.RtlAllocateHeap
053BEAA4 FF75 F0 PUSH DWORD PTR SS:[EBP-10] ; compressed size
053BEA4E 8BF0 MOV ESI,EAX
053BEA83 A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053BEAD7 6A 08 PUSH 8
053BEABF FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053BEA6C F7D0 NOT EAX
053BEAF2 FFD0 CALL EAX ; ntdll.RtlAllocateHeap
053BEB14 6A 00 PUSH 0
053BEA74 8BD8 MOV EBX,EAX
053BE798 FF75 F0 PUSH DWORD PTR SS:[EBP-10]
053BEB28 A1 88A03B05 MOV EAX,DWORD PTR DS:[53BA088]
053BE636 83C7 08 ADD EDI,8 ; 跳过 8 字节
053BE628 53 PUSH EBX
053BE60D 57 PUSH EDI ; EXERe.053D273E
053BE6FA FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8]
053BE71C F7D0 NOT EAX
053BE730 FFD0 CALL EAX ; ReadProcessMemory
050BE70D 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10] ; 压缩的大小
053BE760 33FF XOR EDI,EDI
053BE76D 0145 D8 ADD DWORD PTR SS:[EBP-28],EAX ; 累加已读入的大小, 为下一个处理做准备
053BE780 83C0 F8 ADD EAX,-8
053BE744 85C0 TEST EAX,EAX
053BE789 897D EC MOV DWORD PTR SS:[EBP-14],EDI
053BE6A6 /0F86 9F010000 JBE EXERe.053BE84B ; 小于 8 字节不用处理
053BE751 8B041F MOV EAX,DWORD PTR DS:[EDI+EBX] ; 循环解压
053BE6BD 8B543B 04 MOV EDX,DWORD PTR DS:[EBX+EDI+4]
053BE6B1 83C7 08 ADD EDI,8
053BE6E6 3BC2 CMP EAX,EDX
053BE6D4 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX
053BE6CA 8955 FC MOV DWORD PTR SS:[EBP-4],EDX
053BE673 /0F85 B3450000 JNZ EXERe.053C2C2C
053C2C2C 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
053C2C40 FF75 E8 PUSH DWORD PTR SS:[EBP-18]
053C2C4E 03C6 ADD EAX,ESI
053C2C12 B9 70083B05 MOV ECX,EXERe.053B0870
053C2BF2 50 PUSH EAX
053C2C04 8D041F LEA EAX,DWORD PTR DS:[EDI+EBX]
053C2CB2 FF75 FC PUSH DWORD PTR SS:[EBP-4]
053C2C76 50 PUSH EAX
053C2C8A FF15 262C3C05 CALL DWORD PTR DS:[53C2C26] ; EXERe.053A53E1 ( 解压函数 )
053BE820 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
053BE88E 037D FC ADD EDI,DWORD PTR SS:[EBP-4]
053BE867 0145 EC ADD DWORD PTR SS:[EBP-14],EAX
053BE872 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
053BE87D 83C0 F8 ADD EAX,-8
053BE89D 3BF8 CMP EDI,EAX
053BE857 ^\0F82 F4FEFFFF JB EXERe.053BE751
00168DE8 00 00 40 00 00 10 00 00 2F BF 40 00 00 90 05 00 ..@...../.@..... ; imgagebase = 400000, baseofcode=1000, oep=40bf2f, 59000 是 ImageSize ?
00168DF8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ ; 0 是 TLS 大小
....
00168ED8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
053BE84B 8B06 MOV EAX,DWORD PTR DS:[ESI]
053BE840 A3 E4A03B05 MOV DWORD PTR DS:[53BA0E4],EAX ; imagebase
053BE939 8B46 04 MOV EAX,DWORD PTR DS:[ESI+4]
053BE8D0 8945 C0 MOV DWORD PTR SS:[EBP-40],EAX ; baseofcode
053BE8F7 8B46 10 MOV EAX,DWORD PTR DS:[ESI+10] ; tls size
053BE922 50 PUSH EAX
053BE909 A3 DCA03B05 MOV DWORD PTR DS:[53BA0DC],EAX
053BE8E1 A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053BE94D 6A 08 PUSH 8
053BE9AE FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053BE9E6 F7D0 NOT EAX
053BE9D7 FFD0 CALL EAX ; ntdll.RtlAllocateHeap (0 byte)
053BE976 6A 04 PUSH 4 ; 4 byte
053BE98F 8BF8 MOV EDI,EAX ; tls 空间
053BE9F3 A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053BE960 6A 08 PUSH 8
053BE2E7 FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053BE9C8 F7D0 NOT EAX
053BE4EC FFD0 CALL EAX ; ntdll.RtlAllocateHeap
053BE544 8945 D0 MOV DWORD PTR SS:[EBP-30],EAX
053BE526 8938 MOV DWORD PTR DS:[EAX],EDI
053BE50E 50 PUSH EAX
053BE913 8B45 D0 MOV EAX,DWORD PTR SS:[EBP-30]
053BE536 64:A3 2C000000 MOV DWORD PTR FS:[2C],EAX ; ThreadLocalStoragePointer ************************************************
053BE57F 58 POP EAX
053BE4FA A1 90A03B05 MOV EAX,DWORD PTR DS:[53BA090]
053BE8D9 33FF XOR EDI,EDI
053BE55E 56 PUSH ESI
053BE5A6 57 PUSH EDI
053BE5D3 FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053BE571 F7D0 NOT EAX
053BE5BE FFD0 CALL EAX ; ntdll.RtlFreeHeap
053BE58F A1 90A03B05 MOV EAX,DWORD PTR DS:[53BA090]
053BE366 53 PUSH EBX
053BE318 57 PUSH EDI
053BE2FE FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053BE340 F7D0 NOT EAX
053BE32A FFD0 CALL EAX ; ntdll.RtlFreeHeap
053BE357 8D45 E0 LEA EAX,DWORD PTR SS:[EBP-20]
053BE431 6A 01 PUSH 1
053BE45C 50 PUSH EAX
053BE442 A1 74A03B05 MOV EAX,DWORD PTR DS:[53BA074]
053BE44C F7D0 NOT EAX
053BE4C6 50 PUSH EAX ; KERNEL32.WriteProcessMemory
053BE478 A1 60A03B05 MOV EAX,DWORD PTR DS:[53BA060]
053BE4D9 F7D0 NOT EAX
053BE496 50 PUSH EAX ; KERNEL32.7C570000
053BE4AE FF15 6FE43B05 CALL DWORD PTR DS:[53BE46F] ; EXERe.053A102C, ret= 52ec08
053BE3EC F7D0 NOT EAX
053BE3FB A3 74A03B05 MOV DWORD PTR DS:[53BA074],EAX ; 替换原来的入口, SKIP **************************************************************
053BE41B 8D45 E0 LEA EAX,DWORD PTR SS:[EBP-20]
053BE387 6A 01 PUSH 1
053BE3A5 50 PUSH EAX
053BE40C A1 78A03B05 MOV EAX,DWORD PTR DS:[53BA078]
053BE3F3 F7D0 NOT EAX
053BE3C2 50 PUSH EAX ; KERNEL32.VirtualProtect
053BE3B1 A1 60A03B05 MOV EAX,DWORD PTR DS:[53BA060]
053BE397 F7D0 NOT EAX
053BE012 50 PUSH EAX ; KERNEL32.7C570000
053BDF74 FF15 E3E33B05 CALL DWORD PTR DS:[53BE3E3] ; EXERe.053A102C, ret= 1477f0
053BE3D5 F7D0 NOT EAX
053BDF9F 83C4 20 ADD ESP,20
053BDFB6 A3 78A03B05 MOV DWORD PTR DS:[53BA078],EAX ; 替换原来的入口, SKIP **************************************************************
十.
开始 Hook 20个 API
053AB5C5 46 69 6E 64 52 65 73 6F 75 72 63 65 45 78 57 FindResourceExW ; Jmp 53A31EA
053AB6E5 46 69 6E 64 52 65 73 6F 75 72 63 65 45 78 41 FindResourceExA ; Jmp 53A3264
053AB805 46 69 6E 64 52 65 73 6F 75 72 63 65 57 FindResourceW
053AB925 46 69 6E 64 52 65 73 6F 75 72 63 65 41 FindResourceA
053ABA45 4C 6F 61 64 52 65 73 6F 75 72 63 65 LoadResource
053ABB65 53 69 7A 65 6F 66 52 65 73 6F 75 72 63 65 SizeofResource
053ABC85 4C 6F 61 64 49 63 6F 6E 41 LoadIconA
053ABDA5 4C 6F 61 64 49 63 6F 6E 57 LoadIconW
053ABEC5 4C 6F 61 64 41 63 63 65 6C 65 72 61 74 6F 72 73 LoadAcceleratorsA
053ABFE5 4C 6F 61 64 41 63 63 65 6C 65 72 61 74 6F 72 73 LoadAcceleratorsW
053AC105 4C 6F 61 64 42 69 74 6D 61 70 41 LoadBitmapA
053AC225 4C 6F 61 64 42 69 74 6D 61 70 57 LoadBitmapW
053AC345 4C 6F 61 64 43 75 72 73 6F 72 41 LoadCursorA
053AC465 4C 6F 61 64 43 75 72 73 6F 72 57 LoadCursorW
053AC585 4C 6F 61 64 4D 65 6E 75 41 LoadMenuA
053AC6A5 4C 6F 61 64 4D 65 6E 75 57 LoadMenuW
053AC7C5 4C 6F 61 64 53 74 72 69 6E 67 41 LoadStringA
053AC8E5 4C 6F 61 64 53 74 72 69 6E 67 57 LoadStringW
053ACA05 45 78 69 74 50 72 6F 63 65 73 73 ExitProcess ; Jmp 53A33D8
053ACB25 43 72 65 61 74 65 54 68 72 65 61 64 CreateThread ; Jmp 53A33E8
053BDFAD 33DB XOR EBX,EBX
053BDFF1 8D83 C5B53A05 LEA EAX,DWORD PTR DS:[EBX+53AB5C5]
053BDFCF 50 PUSH EAX ; EXERe.053AB5C5
053BE000 A1 60A03B05 MOV EAX,DWORD PTR DS:[53BA060]
053BDFE5 F7D0 NOT EAX
053BDE94 50 PUSH EAX ; KERNEL32.7C570000
053BDF4E A1 B0A03B05 MOV EAX,DWORD PTR DS:[53BA0B0]
053BDF62 F7D0 NOT EAX
053BDEFF FFD0 CALL EAX ; KERNEL32.GetProcAddress *********************************************************
053BDF0F 8BF0 MOV ESI,EAX ; KERNEL32.FindResourceExW
053BDF44 8D45 D0 LEA EAX,DWORD PTR SS:[EBP-30]
053BDF35 6A 02 PUSH 2 ; 2, HOOK 标志
053BDF1C 50 PUSH EAX
053BDEAD A1 60A03B05 MOV EAX,DWORD PTR DS:[53BA060]
053BDEBE 56 PUSH ESI ; KERNEL32.FindResourceExW
053BDEA1 F7D0 NOT EAX
053BDED9 50 PUSH EAX ; KERNEL32.7C570000
053BDEEC 8975 F4 MOV DWORD PTR SS:[EBP-C],ESI ; KERNEL32.FindResourceExW
053BE0AF FF15 F4DE3B05 CALL DWORD PTR DS:[53BDEF4] ; EXERe.053A102C
053BE074 8B45 D0 MOV EAX,DWORD PTR SS:[EBP-30] ; size = 5
053BE08E 83C4 10 ADD ESP,10
053BE09D 8983 DCB63A05 MOV DWORD PTR DS:[EBX+53AB6DC],EAX
053BE05F 8B83 C0B53A05 MOV EAX,DWORD PTR DS:[EBX+53AB5C0] ; EXERe.053A31EA
053BE06C 2BC6 SUB EAX,ESI ; KERNEL32.FindResourceExW
053BE029 89B3 D8B63A05 MOV DWORD PTR DS:[EBX+53AB6D8],ESI ; KERNEL32.FindResourceExW
053BDECA 83E8 05 SUB EAX,5
053BE055 C645 B4 E9 MOV BYTE PTR SS:[EBP-4C],0E9
053BE03E 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
053BE04C 8D45 B5 LEA EAX,DWORD PTR SS:[EBP-4B]
053BE036 85C0 TEST EAX,EAX
053BE0FB /0F84 99010000 JE EXERe.053BE29A
053BE0F2 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
053BE0C0 85C0 TEST EAX,EAX
053BE0DF /0F84 B5010000 JE EXERe.053BE29A
053BE0CF 8D75 F8 LEA ESI,DWORD PTR SS:[EBP-8]
053BE26C 8D7D B5 LEA EDI,DWORD PTR SS:[EBP-4B]
053BE0EA A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ES>
053BE2D3 8B75 F4 MOV ESI,DWORD PTR SS:[EBP-C] ; KERNEL32.FindResourceExW
053BE0C7 33FF XOR EDI,EDI
053BE29A 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
053BE2AE 50 PUSH EAX
053BE2C8 A1 78A03B05 MOV EAX,DWORD PTR DS:[53BA078]
053BE287 6A 04 PUSH 4
053BE228 FFB3 DCB63A05 PUSH DWORD PTR DS:[EBX+53AB6DC]
053BE2BD F7D0 NOT EAX
053BE247 56 PUSH ESI ; KERNEL32.FindResourceExW
053BE1BA FFD0 CALL EAX ; VirtualProtect
053BE25F 57 PUSH EDI
053BE1F4 8D83 C4B63A05 LEA EAX,DWORD PTR DS:[EBX+53AB6C4]
053BE210 FFB3 DCB63A05 PUSH DWORD PTR DS:[EBX+53AB6DC] ; size = 5
053BE1E7 50 PUSH EAX ; EXERe.053AB6C4
053BE1D4 A1 88A03B05 MOV EAX,DWORD PTR DS:[53BA088]
053BE123 56 PUSH ESI ; KERNEL32.FindResourceExW
053BE183 FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8]
053BE239 F7D0 NOT EAX
053BE1A2 FFD0 CALL EAX ; ReadProcessMemory
053BE108 8B83 DCB63A05 MOV EAX,DWORD PTR DS:[EBX+53AB6DC]
053BE12F C68403 C4B63A05>MOV BYTE PTR DS:[EBX+EAX+53AB6C4],0E9
053BE156 8BC6 MOV EAX,ESI ; KERNEL32.FindResourceExW
053BE163 2BC3 SUB EAX,EBX
053BE172 2D C4B63A05 SUB EAX,EXERe.053AB6C4
053BE13E 83E8 05 SUB EAX,5
053C2DFE 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
053C2E0C 8B83 DCB63A05 MOV EAX,DWORD PTR DS:[EBX+53AB6DC]
053C2F9D 8D8403 C5B63A05 LEA EAX,DWORD PTR DS:[EBX+EAX+53AB6C5]
053C2FAC 3BC7 CMP EAX,EDI
053C3043 ^\0F84 C8FFFFFF JE EXERe.053C3011
053C3052 8D4D F8 LEA ECX,DWORD PTR SS:[EBP-8]
053C305A 85C9 TEST ECX,ECX
053C3029 ^\0F84 E2FFFFFF JE EXERe.053C3011
053C303A 8D75 F8 LEA ESI,DWORD PTR SS:[EBP-8]
053C2FD4 8BF8 MOV EDI,EAX ; EXERe.053AB6CA
053C2FC2 A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ES>
053C2FCA 8B75 F4 MOV ESI,DWORD PTR SS:[EBP-C] ; KERNEL32.FindResourceExW
053C2FB5 33FF XOR EDI,EDI ; EXERe.053AB6CE
053C3017 57 PUSH EDI
053C2FF5 8D45 B4 LEA EAX,DWORD PTR SS:[EBP-4C]
053C3003 6A 05 PUSH 5
053C2FE3 50 PUSH EAX
053C2E29 A1 74A03B05 MOV EAX,DWORD PTR DS:[53BA074]
053C2F73 56 PUSH ESI ; KERNEL32.FindResourceExW
053C2F8B FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8]
053C2E21 F7D0 NOT EAX
053C2F3C FFD0 CALL EAX ; WriteProcessMemory
7C591786 >- E9 5F1AE188 JMP EXERe.053A31EA , 将 FindResourceExW 开头 5 字节改掉
053C2F4F 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
053C2F5F 50 PUSH EAX
053C2ECC A1 78A03B05 MOV EAX,DWORD PTR DS:[53BA078]
053C2F06 FF75 E8 PUSH DWORD PTR SS:[EBP-18]
053C2F23 F7D0 NOT EAX
053C2EDF 6A 05 PUSH 5
053C2EF2 56 PUSH ESI ; KERNEL32.FindResourceExW
053C2E53 FFD0 CALL EAX ; VirtualProtect
053C2F2A 81C3 20010000 ADD EBX,120
053C2F16 81FB 80160000 CMP EBX,1680 ; 1680/120=14h 个 API
053C2E3C ^\0F82 AFB1FFFF JB EXERe.053BDFF1
十一. 解压代码到原来的 400000 段
053C2E33 8B45 DC MOV EAX,DWORD PTR SS:[EBP-24] ; EXERe.053C4100
053C2E96 8B4D D8 MOV ECX,DWORD PTR SS:[EBP-28] ; 前面已处理的字节长度
053C2EAA 57 PUSH EDI
053C2EBC 6A 04 PUSH 4
053C2E7A 8D3401 LEA ESI,DWORD PTR DS:[ECX+EAX]
053C2E88 8D45 E4 LEA EAX,DWORD PTR SS:[EBP-1C]
053C2E68 50 PUSH EAX
053C348D A1 88A03B05 MOV EAX,DWORD PTR DS:[53BA088]
053C33D3 56 PUSH ESI ; EXERe.053D2762
053C3460 FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8]
053C3477 F7D0 NOT EAX
053C3437 FFD0 CALL EAX ; ReadProcessMemory ( 4 byte )
053C344C 57 PUSH EDI
053C3484 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
053C33EB 6A 04 PUSH 4
053C341C 50 PUSH EAX
053C3428 8D46 04 LEA EAX,DWORD PTR DS:[ESI+4]
053C3404 50 PUSH EAX ; EXERe.053D2766
053C31A1 A1 88A03B05 MOV EAX,DWORD PTR DS:[53BA088]
053C30F1 FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8]
053C30CF F7D0 NOT EAX
053C30DC FFD0 CALL EAX ; ReadProcessMemory ( 4 byte)
053C3073 FF75 E4 PUSH DWORD PTR SS:[EBP-1C] ; uncompressed size = 03c000
053C30AF A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053C30C2 F7D0 NOT EAX
053C3096 6A 08 PUSH 8
053C317A FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053C3191 FFD0 CALL EAX ; ntdll.RtlAllocateHeap
053C3130 FF75 F0 PUSH DWORD PTR SS:[EBP-10] ; compressed size = 0188b2
053C30B9 8945 FC MOV DWORD PTR SS:[EBP-4],EAX ; umcompressed buffer
053C30A3 A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053C3166 6A 08 PUSH 8
053C3145 FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053C3156 F7D0 NOT EAX
053C310E FFD0 CALL EAX ; ntdll.RtlAllocateHeap
053C3283 57 PUSH EDI
053C311D 8BD8 MOV EBX,EAX
053C31B5 FF75 F0 PUSH DWORD PTR SS:[EBP-10] ; compressed size = 0188B2
053C3085 A1 88A03B05 MOV EAX,DWORD PTR DS:[53BA088]
053C320B 83C6 08 ADD ESI,8 ; 跳过 8 字节
053C31F3 53 PUSH EBX
053C31CF 56 PUSH ESI ; EXERe.053D276A
053C325F FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8]
053C3270 F7D0 NOT EAX
053C3225 FFD0 CALL EAX ; ReadProcessMemory
053C3215 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
053C3203 33F6 XOR ESI,ESI ; EXERe.053D276A
053C31E3 0145 D8 ADD DWORD PTR SS:[EBP-28],EAX ; 累加已读入的大小, 为下一个处理做准备
053C3242 83C0 F8 ADD EAX,-8
053C324C 85C0 TEST EAX,EAX
053C3234 897D EC MOV DWORD PTR SS:[EBP-14],EDI
053C32D9 /0F86 E5010000 JBE EXERe.053C34C4 ; 小于 8 字节不用处理
053C329B 8B041E MOV EAX,DWORD PTR DS:[ESI+EBX] ; 循环解压
053C328F 8B4C33 04 MOV ECX,DWORD PTR DS:[EBX+ESI+4]
053C32BD 83C6 08 ADD ESI,8
053C32C9 3BC1 CMP EAX,ECX
053C32D0 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX
053C32A9 894D F8 MOV DWORD PTR SS:[EBP-8],ECX
053C32B1 ^\0F85 C0F8FFFF JNZ EXERe.053C2B77
053C2B77 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
053C2B47 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
053C2B55 FF75 E8 PUSH DWORD PTR SS:[EBP-18]
053C2B20 03C1 ADD EAX,ECX
053C2B33 B9 70083B05 MOV ECX,EXERe.053B0870
053C2AFC 50 PUSH EAX
053C2B3D 8D041E LEA EAX,DWORD PTR DS:[ESI+EBX]
053C2AE5 FF75 F8 PUSH DWORD PTR SS:[EBP-8]
053C2C5E 50 PUSH EAX
053C2BCD FF15 0E2B3C05 CALL DWORD PTR DS:[53C2B0E] ; EXERe.053A53E1 (解压代码) ************************************************
053C34EA 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
053C34CD 0375 F8 ADD ESI,DWORD PTR SS:[EBP-8]
053C34D9 0145 EC ADD DWORD PTR SS:[EBP-14],EAX
053C34E1 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
053C34B1 83C0 F8 ADD EAX,-8
053C34BD 3BF0 CMP ESI,EAX
053C34A0 ^\0F82 F5FDFFFF JB EXERe.053C329B
053C34C4 8B75 C0 MOV ESI,DWORD PTR SS:[EBP-40] ; 修改 401000 读写属性
053C3497 8D45 D4 LEA EAX,DWORD PTR SS:[EBP-2C]
053C380E 50 PUSH EAX
053C3780 A1 E4A03B05 MOV EAX,DWORD PTR DS:[53BA0E4]
053C37B0 6A 04 PUSH 4
053C378E 03C6 ADD EAX,ESI
053C379B FF75 E4 PUSH DWORD PTR SS:[EBP-1C]
053C37D5 50 PUSH EAX
053C37C3 A1 78A03B05 MOV EAX,DWORD PTR DS:[53BA078]
053C37E3 F7D0 NOT EAX
053C37F1 FFD0 CALL EAX ; VirtualProtect(401000, 3c000, 4, ...) Page_ReadWrite
053C3568 A1 E4A03B05 MOV EAX,DWORD PTR DS:[53BA0E4] ; 还原代码
053C352E 57 PUSH EDI
053C3544 FF75 E4 PUSH DWORD PTR SS:[EBP-1C] ; 原来的代码空间 401000
053C37FE 03C6 ADD EAX,ESI
053C34FE FF75 FC PUSH DWORD PTR SS:[EBP-4] ; uncompressed buffer
053C355A 50 PUSH EAX
053C3518 A1 74A03B05 MOV EAX,DWORD PTR DS:[53BA074]
053C3722 FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8]
053C373B F7D0 NOT EAX
053C3755 FFD0 CALL EAX ; WriteProcessMemory(530008->401000, size=3c000) ************************************
053C3746 8D45 D4 LEA EAX,DWORD PTR SS:[EBP-2C] ; 恢复 401000 属性
053C376E 50 PUSH EAX
053C3694 A1 E4A03B05 MOV EAX,DWORD PTR DS:[53BA0E4]
053C36DE FF75 D4 PUSH DWORD PTR SS:[EBP-2C]
053C36F9 03F0 ADD ESI,EAX
053C36EC A1 78A03B05 MOV EAX,DWORD PTR DS:[53BA078]
053C3706 FF75 E4 PUSH DWORD PTR SS:[EBP-1C]
053C36AA F7D0 NOT EAX
053C36BD 56 PUSH ESI
053C3617 FFD0 CALL EAX ; VirtualProtect(Page_Execute_ReadWrite Page_guard)
053C3644 FF75 FC PUSH DWORD PTR SS:[EBP-4]
053C36CD A1 90A03B05 MOV EAX,DWORD PTR DS:[53BA090]
053C36A2 F7D0 NOT EAX
053C362C 57 PUSH EDI
053C3679 FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053C365E FFD0 CALL EAX ; ntdll.RtlFreeHeap
053C35FA A1 90A03B05 MOV EAX,DWORD PTR DS:[53BA090]
053C35CA 53 PUSH EBX
053C35E2 57 PUSH EDI
053C358F FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053C366B F7D0 NOT EAX
053C35A7 FFD0 CALL EAX ; ntdll.RtlFreeHeap
十二. 读入 IAT 信息
053C3608 8B45 D8 MOV EAX,DWORD PTR SS:[EBP-28] ; 已处理的长度
053C35F0 8B4D DC MOV ECX,DWORD PTR SS:[EBP-24] ; EXERe.053C4100
053C357C 57 PUSH EDI
053C3A48 6A 04 PUSH 4
053C35BA 8D3408 LEA ESI,DWORD PTR DS:[EAX+ECX]
053C3B0E 8D45 E4 LEA EAX,DWORD PTR SS:[EBP-1C]
053C3B62 50 PUSH EAX
053C3B4C A1 88A03B05 MOV EAX,DWORD PTR DS:[53BA088]
053C3B22 56 PUSH ESI ; EXERe.053EB014
053C3B3A FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8]
053C3AE3 F7D0 NOT EAX
053C3AF7 FFD0 CALL EAX ; ReadProcessMemory(4 byte)
053C3AA9 57 PUSH EDI
053C3B04 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
053C3ACA 6A 04 PUSH 4
053C3A91 50 PUSH EAX
053C3AB5 8D46 04 LEA EAX,DWORD PTR DS:[ESI+4]
053C3A61 50 PUSH EAX ; EXERe.053EB018
053C3AD7 A1 88A03B05 MOV EAX,DWORD PTR DS:[53BA088]
053C3A79 FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8]
053C3986 F7D0 NOT EAX
053C39B1 FFD0 CALL EAX ; ReadProcessMemory (4 byte)
053C3997 FF75 E4 PUSH DWORD PTR SS:[EBP-1C] ; uncompressed size = 0F54
053C39FE A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053C3A14 F7D0 NOT EAX
053C3A2F 6A 08 PUSH 8
053C39CA FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053C39EB FFD0 CALL EAX ; ntdll.RtlAllocateHeap
053C395A FF75 F0 PUSH DWORD PTR SS:[EBP-10] ; compressed size = 095F
053C3A1B 8945 EC MOV DWORD PTR SS:[EBP-14],EAX
053C3A08 A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053C3972 6A 08 PUSH 8
053C38A4 FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053C3882 F7D0 NOT EAX
053C388F FFD0 CALL EAX ; ntdll.RtlAllocateHeap
053C383D 8BD8 MOV EBX,EAX
053C382C 57 PUSH EDI
053C381C 895D B4 MOV DWORD PTR SS:[EBP-4C],EBX
053C3850 FF75 F0 PUSH DWORD PTR SS:[EBP-10] ; 095F size
053C3862 A1 88A03B05 MOV EAX,DWORD PTR DS:[53BA088]
053C386E 83C6 08 ADD ESI,8 ; 跳过 8 字节
053C3912 53 PUSH EBX
053C392A 56 PUSH ESI ; EXERe.053EB01C
053C393C FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8]
053C38D7 F7D0 NOT EAX
053C38F3 FFD0 CALL EAX ; ReadProcessMemory
053C3902 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
053C38E0 33F6 XOR ESI,ESI ; EXERe.053EB01C
053C38B9 83C0 F8 ADD EAX,-8
053C38C3 897D DC MOV DWORD PTR SS:[EBP-24],EDI
053BFDC3 85C0 TEST EAX,EAX
053BFDE3 /0F86 31010000 JBE EXERe.053BFF1A
053BFDCB 8B041E MOV EAX,DWORD PTR DS:[ESI+EBX] ; 循环解压
053BFE2F 8B4C33 04 MOV ECX,DWORD PTR DS:[EBX+ESI+4]
053BFDD9 83C6 08 ADD ESI,8
053BFDEE 3BC1 CMP EAX,ECX
053BFDF9 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX
053BFE05 894D F8 MOV DWORD PTR SS:[EBP-8],ECX
053BFE13 /0F85 6F2B0000 JNZ EXERe.053C2988
053C2988 8B45 DC MOV EAX,DWORD PTR SS:[EBP-24]
053C2953 8B4D EC MOV ECX,DWORD PTR SS:[EBP-14]
053C2D9C FF75 E8 PUSH DWORD PTR SS:[EBP-18]
053C2DD0 03C1 ADD EAX,ECX
053C2DDA B9 70083B05 MOV ECX,EXERe.053B0870
053C2DEC 50 PUSH EAX
053C2DB2 8D041E LEA EAX,DWORD PTR DS:[ESI+EBX]
053C2DC0 FF75 F8 PUSH DWORD PTR SS:[EBP-8]
053C2BA7 50 PUSH EAX
053C2B8C FF15 A0283C05 CALL DWORD PTR DS:[53C28A0] ; EXERe.053A53E1 解压( compressed, size1, uncompress, size2) ************************
053BFFC7 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
053BFFBE 0375 F8 ADD ESI,DWORD PTR SS:[EBP-8]
053BFF0C 0145 DC ADD DWORD PTR SS:[EBP-24],EAX
053BFEE3 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
053BFED8 83C0 F8 ADD EAX,-8
053BFF02 3BF0 CMP ESI,EAX
053BFF3F ^\0F82 86FEFFFF JB EXERe.053BFDCB
十三.
处理 IAT
053BFF20 FF75 EC PUSH DWORD PTR SS:[EBP-14] ; 解压后的 IAT 信息
053BFF2E 8D4D 8C LEA ECX,DWORD PTR SS:[EBP-74] ; 12FF4C
053BFF70 FF15 F9333C05 CALL DWORD PTR DS:[53C33F9] ; EXERe.053A486D, 初步解密
0012FF4C 00000007 .... ; 7 个 DLL
0012FF50 00146240 .).. ; 开始地址, 每个DLL 4 + 4 + 40h*4 + 4 + 4 + 4 byte { A, B, C, D, E, F }
0012FF54 001469cc T1.. ; 结束地址
其中 A = 该 DLL 中 API 个数
B = 加壳前 FirstThunk 位置 (RVA)
C = DLL Name
D = 指向 A 个 API 信息(每个API8字节)
E = D+8
F = A
053BFF36 8D45 E0 LEA EAX,DWORD PTR SS:[EBP-20]
053BFF96 6A 01 PUSH 1
053BFF57 50 PUSH EAX
053BFEF3 A1 ACA03B05 MOV EAX,DWORD PTR DS:[53BA0AC]
053C0266 F7D0 NOT EAX
053C002D 50 PUSH EAX ; KERNEL32.CreateThread
053C001A A1 60A03B05 MOV EAX,DWORD PTR DS:[53BA060]
053C000A F7D0 NOT EAX
053C0232 50 PUSH EAX ; KERNEL32.7C570000
053C0253 FF15 E4323C05 CALL DWORD PTR DS:[53C32E4] ; EXERe.053A102C, ret = 510db0
053C023F F7D0 NOT EAX
053C00BD A3 ACA03B05 MOV DWORD PTR DS:[53BA0AC],EAX ;替换原来的入口, SKIP, **********************************************************
053C005C A1 94A03B05 MOV EAX,DWORD PTR DS:[53BA094]
053C003F 83C4 10 ADD ESP,10
053C0054 F7D0 NOT EAX
053C009D FFD0 CALL EAX ; GetTickCount ************************************************************************
053C00AC 397D 8C CMP DWORD PTR SS:[EBP-74],EDI ; DLL 个数 == 0 ?
053C0087 A3 E0A03B05 MOV DWORD PTR DS:[53BA0E0],EAX ; 时间标志, ***********************************************************************
053BFF87 897D F4 MOV DWORD PTR SS:[EBP-C],EDI ; 外循环变量
053C006B /0F8E E4250000 JLE EXERe.053C2655
053C007C 897D E8 MOV DWORD PTR SS:[EBP-18],EDI
; 处理 IAT 的外循环 ***************************************************************
053C0155 8B45 90 MOV EAX,DWORD PTR SS:[EBP-70] ; 开始地址
053C010C 8B4D E8 MOV ECX,DWORD PTR SS:[EBP-18]
053C013B 03C1 ADD EAX,ECX
053C0129 6A 40 PUSH 40
053C0143 8DBD 7CFEFFFF LEA EDI,DWORD PTR SS:[EBP-184] ; buffer1 in stack(100h byte)
053C011B 8B08 MOV ECX,DWORD PTR DS:[EAX]
053C00EA 8D70 08 LEA ESI,DWORD PTR DS:[EAX+8]
053C00F2 898D 74FEFFFF MOV DWORD PTR SS:[EBP-18C],ECX ; A
053C0103 8B48 04 MOV ECX,DWORD PTR DS:[EAX+4]
053C00DC 898D 78FEFFFF MOV DWORD PTR SS:[EBP-188],ECX ; B
053C01C3 59 POP ECX ; 40h
053C00D0 F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; C, DLL name 复制到buffer1
053C01FA 05 08010000 ADD EAX,108 ; D
053C020A 8D8D 7CFFFFFF LEA ECX,DWORD PTR SS:[EBP-84] ; buffer2 in stack
053C01E2 50 PUSH EAX
053C0177 FF15 34303C05 CALL DWORD PTR DS:[53C3034] ; EXERe.053A4A58, 把 D 所指内容复制到 buffer2
053C021B 8D45 D0 LEA EAX,DWORD PTR SS:[EBP-30]
053C01EE 8B8D 78FEFFFF MOV ECX,DWORD PTR SS:[EBP-188] ; B, FirstThunk
053C0164 50 PUSH EAX
053C0191 8B85 74FEFFFF MOV EAX,DWORD PTR SS:[EBP-18C] ; A, API 个数
053C01AA C1E0 02 SHL EAX,2 ; *4
053C074C 6A 04 PUSH 4
053C0334 50 PUSH EAX
053C0303 A1 E4A03B05 MOV EAX,DWORD PTR DS:[53BA0E4] ; ImageBase(未加壳的)
053C0224 03C8 ADD ECX,EAX
053C0313 A1 78A03B05 MOV EAX,DWORD PTR DS:[53BA078]
053C0282 51 PUSH ECX
053C031E F7D0 NOT EAX
053C029D FFD0 CALL EAX ; VirtualProtect( 420080, size=1F4, ReadWrite)
053C02CB 8D85 7CFEFFFF LEA EAX,DWORD PTR SS:[EBP-184] ; buffer1, DLL name
053C02ED 6A 00 PUSH 0
053C02BC 50 PUSH EAX
053C049F FF15 4A2F3C05 CALL DWORD PTR DS:[53C2F4A] ; EXERe.053A46A7, uppercase
053C0448 59 POP ECX ;
053C0469 50 PUSH EAX
053C0482 FF15 902E3C05 CALL DWORD PTR DS:[53C2E90] ; EXERe.053A7509(arg1, arg2)
; 对 string 做 Hash 变换 arg2=0 or 4
; arg2=4 则只取 arg1 前 4 字节, 否则 arg1 null 结束
053C03BE 59 POP ECX
053C0459 8945 D4 MOV DWORD PTR SS:[EBP-2C],EAX ; Hash 变换的结果
053C03E2 59 POP ECX
053C03CF 8D85 7CFEFFFF LEA EAX,DWORD PTR SS:[EBP-184] ; Dll Name
053C03F4 50 PUSH EAX
053C02DB B9 188C3B05 MOV ECX,EXERe.053B8C18 ; 关键全局变量
053C0422 FF15 752E3C05 CALL DWORD PTR DS:[53C2E75] ; EXERe.053A5514, MyLoadLibrary, 见 十五 **************************************
053C040D 8B85 74FEFFFF MOV EAX,DWORD PTR SS:[EBP-18C] ; A, API 个数
053C0439 33C9 XOR ECX,ECX
053C02AA 85C0 TEST EAX,EAX
053C0380 894D FC MOV DWORD PTR SS:[EBP-4],ECX ; 循环变量
053C03A4 /0F8E F6210000 JLE EXERe.053C25A0 ; =0 不用处理
; 处理 DLL 的内循环开始 **********************************************************
00145150 21 33 1A 5D 00 E1 5D 01 53 96 96 70 00 E1 5D 01 ; buffer2 ( 每个 API 8字节){ G, H }
00145160 6B A8 3C 3E 00 E1 5D 01 B4 11 B1 14 00 E1 5D 01 ; G = 053A7509(API Name, 0)
; H = 0 API name 导入
; H = 1 API ordinal 导入? 猜测, 没遇到这种情况
053C038E 8B85 7CFFFFFF MOV EAX,DWORD PTR SS:[EBP-84] ; buffer2
053C0370 807CC8 04 00 CMP BYTE PTR DS:[EAX+ECX*8+4],0 ; API 序号的循环变量
053C0352 8B1CC8 MOV EBX,DWORD PTR DS:[EAX+ECX*8] ; G
053C0360 /0F85 F5260000 JNZ EXERe.053C2A5B ; 没遇到这种情况
053C061C 53 PUSH EBX ; G
053C064C FF15 CA033C05 CALL DWORD PTR DS:[53C03CA] ; EXERe.053A4848, 查表 x -> y
查表 根据 x 找 y
053A4848 . 33C9 XOR ECX,ECX
053A484A . B8 40CC3A05 MOV EAX,EXERe.053ACC40 ; 表头
053A484F > 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4] ; x
053A4853 . 3B10 CMP EDX,DWORD PTR DS:[EAX]
053A4855 . 74 0E JE SHORT EXERe.053A4865
053A4857 . 83C0 08 ADD EAX,8 ; 每项 8 字节 (x, y)
053A485A . 41 INC ECX
053A485B . 3D E0CC3A05 CMP EAX,EXERe.053ACCE0 ; 表尾
053A4860 .^ 72 ED JB SHORT EXERe.053A484F
053A4862 . 33C0 XOR EAX,EAX ; 没找到, 返回 0
053A4864 . C3 RETN
053A4865 > 8B04CD 44CC3A>MOV EAX,DWORD PTR DS:[ECX*8+53ACC44] ; 找到, 返回 y
053A486C . C3 RETN
053ACC40 96 FD 5E AA EA 31 3A 05 6F 4B 11 7D 64 32 3A 05 ; { M, N }, 20 个被 HOOK 的 API
053ACC50 62 A8 23 1F FA 30 3A 05 FF 90 B7 1F 72 31 3A 05
053ACC60 E2 EF 3B 16 A7 27 3A 05 FF 42 13 8F E9 28 3A 05
053ACC70 33 39 41 0F 72 29 3A 05 FB FE 29 D3 5C 2A 3A 05
053ACC80 85 B1 18 A3 46 2B 3A 05 16 F4 1A 95 67 2C 3A 05
053ACC90 B8 B4 02 41 88 2D 3A 05 B1 AF 72 41 60 2E 3A 05
053ACCA0 11 2F 36 89 38 2F 3A 05 E3 E3 C4 F0 80 2F 3A 05
053ACCB0 23 40 A1 5E C8 2F 3A 05 87 61 9A 2E DE 30 3A 05
053ACCC0 D0 00 31 EA DE 32 3A 05 3D 4C 8C 15 41 33 3A 05
053ACCD0 47 E2 B2 B1 D8 33 3A 05 E2 F9 E6 84 E8 33 3A 05
053C0634 59 POP ECX
053C03AF 85C0 TEST EAX,EAX
053C028E 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
053C0340 /0F85 38080000 JNZ EXERe.053C0B7E ; 如果找到了, 直接去 53C0B7E ( 这是 20 个完全被偷到壳里的 API) ****************************
053C0273 8B45 D4 MOV EAX,DWORD PTR SS:[EBP-2C] ; Dll name Hash 变换的结果
053C072A 99 CDQ ; 符号扩展
053C0188 8BC8 MOV ECX,EAX
053C0736 8BF2 MOV ESI,EDX
053C00C7 8BC3 MOV EAX,EBX ; G
053C0697 56 PUSH ESI
053C01D5 99 CDQ
053C066F 51 PUSH ECX
053C06D6 56 PUSH ESI
053C06AF 51 PUSH ECX
053C06C6 8945 C8 MOV DWORD PTR SS:[EBP-38],EAX
053C0681 8955 CC MOV DWORD PTR SS:[EBP-34],EDX
053C06F4 FF15 B1023C05 CALL DWORD PTR DS:[53C02B1] ; EXERe.053A74D2( 32位带符号乘法) Hash * Hash
053C070C FF75 CC PUSH DWORD PTR SS:[EBP-34]
053C071D 8BF8 MOV EDI,EAX ; 结果 ESI:EDI
053C0552 8BF2 MOV ESI,EDX
053C0534 FF75 C8 PUSH DWORD PTR SS:[EBP-38]
053C04EA FF75 CC PUSH DWORD PTR SS:[EBP-34]
053C0510 FF75 C8 PUSH DWORD PTR SS:[EBP-38]
053C04BD FF15 B8013C05 CALL DWORD PTR DS:[53C01B8] ; EXERe.053A74D2( 32位带符号乘法) G * G
; 结果 EDX:EAX
053C0595 8365 AC 00 AND DWORD PTR SS:[EBP-54],0 ; [12FF6C]=0
053C06E2 8945 A0 MOV DWORD PTR SS:[EBP-60],EAX ; G*G 结果低位
053C065D 8BC6 MOV EAX,ESI
053C0577 83C4 20 ADD ESP,20
053C055F C1F8 1F SAR EAX,1F ; 取符号位
053C0542 8BC2 MOV EAX,EDX
053C05B4 6A 02 PUSH 2
053C051E 8975 A4 MOV DWORD PTR SS:[EBP-5C],ESI ; Hash * Hash 结果高位
053C04D4 897D 9C MOV DWORD PTR SS:[EBP-64],EDI ; Hash * Hash 结果低位
053C05C7 C1F8 1F SAR EAX,1F
053C05E5 8365 B0 00 AND DWORD PTR SS:[EBP-50],0 ; [12FF70]=0
053C0606 8955 A8 MOV DWORD PTR SS:[EBP-58],EDX ; G*G 结果高位
053C1126 5E POP ESI ; ESI = 2
0012FF5C 3302ED49
0012FF60 66EA2A41
0012FF64 1052C68C
0012FF68 21DC0BD4
0012FF6C 00000000
0012FF70 00000000
053C10E3 A1 94A03B05 MOV EAX,DWORD PTR DS:[53BA094] ; 打乱上面 6 个数顺序
053C10FB F7D0 NOT EAX
053C0896 FFD0 CALL EAX ; GetTickCount ***************************************************************
053C1108 8945 DC MOV DWORD PTR SS:[EBP-24],EAX ; 时间
053C07ED 8D4E FF LEA ECX,DWORD PTR DS:[ESI-1] ; ECX=ESI-1
053C081D 99 CDQ
053C080B F7F9 IDIV ECX
053C0857 6A 06 PUSH 6
053C0872 59 POP ECX ; ECX=6
053C0833 6A 06 PUSH 6
053C07C1 5F POP EDI ; EDI=6
053C07FB 99 CDQ
053C07D4 F7F9 IDIV ECX
053C0787 8B45 DC MOV EAX,DWORD PTR SS:[EBP-24] ; 时间
053C07A3 8BCA MOV ECX,EDX ; /ESI-1 /6 余数
053C0795 99 CDQ
053C0778 F7FE IDIV ESI
053C0760 99 CDQ
053C0568 F7FF IDIV EDI
053C1014 8BFA MOV EDI,EDX ; /ESI /6 余数
053C0502 3BCF CMP ECX,EDI ; 这两个余数比较
053C1088 ^\0F84 FEEDFFFF JE EXERe.053BFE8C
053C109D 8B548D 9C MOV EDX,DWORD PTR SS:[EBP+ECX*4-64] ; 将 12FF5C 6 个数中 第ECX个 和 第EDI个 交换顺序
053C1093 8D448D 9C LEA EAX,DWORD PTR SS:[EBP+ECX*4-64]
053C10CE 8D4CBD 9C LEA ECX,DWORD PTR SS:[EBP+EDI*4-64]
053C10D8 8B7CBD 9C MOV EDI,DWORD PTR SS:[EBP+EDI*4-64]
053C10BC 8938 MOV DWORD PTR DS:[EAX],EDI
053C10C3 8911 MOV DWORD PTR DS:[ECX],EDX
053BFE8C 46 INC ESI
053BFDBC 46 INC ESI
053C10A8 83FE 16 CMP ESI,16
053C10B0 /0F8C 2D000000 JL EXERe.053C10E3
0012FF5C 21DC0BD4 ; 最终的结果
0012FF60 00000000
0012FF64 66EA2A41
0012FF68 3302ED49
0012FF6C 1052C68C
0012FF70 00000000
053C1037 6A 05 PUSH 5 ; 找出 2 个零
053C1028 33FF XOR EDI,EDI
053C106E 33C9 XOR ECX,ECX
053C107B 58 POP EAX ; EAX = 5
053C105A 8D55 B0 LEA EDX,DWORD PTR SS:[EBP-50] ; 6 个数中最后一个
053C1062 8D75 9C LEA ESI,DWORD PTR SS:[EBP-64] ; 6 个数中最前一个
053C1048 393E CMP DWORD PTR DS:[ESI],EDI
053C0CB5 /0F84 13030000 JE EXERe.053C0FCE
053C1053 41 INC ECX
053C0EE4 83C6 04 ADD ESI,4
053C0FCE 393A CMP DWORD PTR DS:[EDX],EDI
053C0FFD ^\0F84 E8FFFFFF JE EXERe.053C0FEB
053C1021 48 DEC EAX
053C1008 83EA 04 SUB EDX,4
053C0FEB 393E CMP DWORD PTR DS:[ESI],EDI
053C0FD5 /0F85 78000000 JNZ EXERe.053C1053
053C0FF2 393A CMP DWORD PTR DS:[EDX],EDI
053C0F59 /0F85 E9000000 JNZ EXERe.053C1048
; 最终到这里, [ESI]=[EDX]=0, ECX=1, EAX=5 表示序号
053C0FE1 8B55 D4 MOV EDX,DWORD PTR SS:[EBP-2C] ; DLL name hash 结果
053C0F74 6A 20 PUSH 20
053C0F64 89548D 9C MOV DWORD PTR SS:[EBP+ECX*4-64],EDX ; Hash, DLL Name Hash 在前, 这个很重要
053C0FB9 895C85 9C MOV DWORD PTR SS:[EBP+EAX*4-64],EBX ; G
0012FF5C 21DC0BD4
0012FF60 BF5B46E3 Hash
0012FF64 66EA2A41
0012FF68 3302ED49
0012FF6C 1052C68C
0012FF70 5D1A3321 G
053C0FC2 8B45 DC MOV EAX,DWORD PTR SS:[EBP-24] ; 上面最后一次循环的时间
053C0F98 59 POP ECX ; ecx = 20h
053C0FAB 99 CDQ
053C0FB1 F7F9 IDIV ECX ; 时间/20h
053C0F86 A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053C0FA4 42 INC EDX ; 余数+1
053C0F05 F7D0 NOT EAX
053C0EF4 C1E2 0A SHL EDX,0A ; * 1024
053C0F36 52 PUSH EDX ; 字节数 (1-20h) Kbyte
053C0F4B 6A 08 PUSH 8
053C0F16 FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053C0D8E FFD0 CALL EAX ; ntdll.RtlAllocateHeap (用时间生产垃圾空间, 确报下面的地址每次都不一样)
053C0D3B 6A 32 PUSH 32
053C0F28 8BF0 MOV ESI,EAX ; temp1
053C0D61 A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053C0D7A 6A 08 PUSH 8
053C0CF5 FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053C0D55 F7D0 NOT EAX
053C0D21 FFD0 CALL EAX ; ntdll.RtlAllocateHeap (32h byte)
053C0CD3 56 PUSH ESI ; temp1
053C0D0C 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX ; 有用的空间 buffer1
053C0CE0 A1 90A03B05 MOV EAX,DWORD PTR DS:[53BA090]
053C0E70 6A 00 PUSH 0
053C0E92 FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053C0ECE F7D0 NOT EAX
053C0EB0 FFD0 CALL EAX ; ntdll.RtlFreeHeap (释放垃圾空间 temp1 )
; 准备工作都做好了, 为这个 API 生成一段代码
053C0EBE 8B5D F8 MOV EBX,DWORD PTR SS:[EBP-8] ; buffer1
053C0E34 6A 02 PUSH 2
053C0E4F 5E POP ESI ; esi = 2
053C0E61 8D4D 9C LEA ECX,DWORD PTR SS:[EBP-64] ; 12FF5C
053C0DCE 6A 06 PUSH 6
053C0CC2 C603 60 MOV BYTE PTR DS:[EBX],60 ; pushad
053C0DB8 C643 01 9C MOV BYTE PTR DS:[EBX+1],9C ; pushfd
053C0DAA 8D43 02 LEA EAX,DWORD PTR DS:[EBX+2]
053C0E0B 5A POP EDX ; edx =6 个数
053C0E18 C600 68 MOV BYTE PTR DS:[EAX],68 ; push xxxxxxxx
053C0E27 46 INC ESI ; 目前代码长度
053C0DE8 40 INC EAX
053C0DF5 8975 D8 MOV DWORD PTR SS:[EBP-28],ESI
053C0934 ^\0F84 83FFFFFF JE EXERe.053C08BD
053C0907 85C9 TEST ECX,ECX ; 12FF5C
053C090F ^\0F84 A8FFFFFF JE EXERe.053C08BD
053C0927 8BF1 MOV ESI,ECX
053C08E3 8BF8 MOV EDI,EAX
053C0920 A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; 复制
053C08F1 8B75 D8 MOV ESI,DWORD PTR SS:[EBP-28]
053C08BD 83C6 04 ADD ESI,4
053C08C7 83C0 04 ADD EAX,4
053C0A3B 83C1 04 ADD ECX,4
053C08DC 4A DEC EDX
053C09DB /0F85 37040000 JNZ EXERe.053C0E18 ; 循环 6 次
053C0A2C A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053C0A14 6A 04 PUSH 4
053C09ED 6A 08 PUSH 8
053C097E FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053C09FB F7D0 NOT EAX
053C095D FFD0 CALL EAX ; ntdll.RtlAllocateHeap ( 4byte)
053C096A C60433 68 MOV BYTE PTR DS:[EBX+ESI],68
053C0949 46 INC ESI
053C09CD 8945 DC MOV DWORD PTR SS:[EBP-24],EAX ; buffer2
053C09B1 8975 D8 MOV DWORD PTR SS:[EBP-28],ESI
053C09C3 8D3C33 LEA EDI,DWORD PTR DS:[EBX+ESI]
053C0990 85FF TEST EDI,EDI
053C09A1 /0F84 4A010000 JE EXERe.053C0AF1
053C0B43 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24]
053C0A77 85C0 TEST EAX,EAX
053C0A58 /0F84 93000000 JE EXERe.053C0AF1
053C0A6D 8D75 DC LEA ESI,DWORD PTR SS:[EBP-24]
053C0A65 A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; 复制
053C0A4A 8B75 D8 MOV ESI,DWORD PTR SS:[EBP-28]
053C0AF1 83C6 04 ADD ESI,4 ; 目前代码长度
053C0B09 B8 B7473A05 MOV EAX,EXERe.053A47B7 ; 计算 API 真正地址的关键 CALL, 见 十五 *******************************************************
053C0AF9 C60433 E8 MOV BYTE PTR DS:[EBX+ESI],0E8
053C0B38 2B45 F8 SUB EAX,DWORD PTR SS:[EBP-8] ; 计算到 CALL 的偏移
053C0B2B 46 INC ESI
053C0A9B 83E8 2A SUB EAX,2A
053C0A8B 8975 D8 MOV DWORD PTR SS:[EBP-28],ESI
053C0B21 8D3C33 LEA EDI,DWORD PTR DS:[EBX+ESI]
053C0ABE 8945 C0 MOV DWORD PTR SS:[EBP-40],EAX
053C0AB4 85FF TEST EDI,EDI
053C0ADB /0F84 47010000 JE EXERe.053C0C28
053C0AE7 8D45 C0 LEA EAX,DWORD PTR SS:[EBP-40]
053C0AAA 85C0 TEST EAX,EAX
053C0AC9 /0F84 59010000 JE EXERe.053C0C28
053C0C12 8D75 C0 LEA ESI,DWORD PTR SS:[EBP-40]
053C0AD4 A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; 复制成 CALL 53A47B7
053C0C33 8B75 D8 MOV ESI,DWORD PTR SS:[EBP-28]
053C0C28 83C6 04 ADD ESI,4 ; 目前代码长度
053C0C1D C60433 9D MOV BYTE PTR DS:[EBX+ESI],9D ; POPFD
053C0C88 46 INC ESI
053C0C9B C60433 61 MOV BYTE PTR DS:[EBX+ESI],61 ; POPAD
053C0CA8 804C33 01 FF OR BYTE PTR DS:[EBX+ESI+1],0FF ; *********************************************************
053C0C92 46 INC ESI
053C0C7C 8D5C33 01 LEA EBX,DWORD PTR DS:[EBX+ESI+1]
053C0C3F 8D7B 01 LEA EDI,DWORD PTR DS:[EBX+1]
053C0C72 C603 25 MOV BYTE PTR DS:[EBX],25 ; FF25 xxxx, jmp [xxxx]
053C0C60 85FF TEST EDI,EDI
053C0C52 ^\0F84 26FFFFFF JE EXERe.053C0B7E
053C0C68 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24]
053C0C48 85C0 TEST EAX,EAX
053C0C04 ^\0F84 74FFFFFF JE EXERe.053C0B7E
053C0BF4 8D75 DC LEA ESI,DWORD PTR SS:[EBP-24]
053C0BDF A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; 到这里 buffer1 如下
00163DB8 60 PUSHAD ; buffer1
00163DB9 9C PUSHFD
00163DBA 68 49ED0233 PUSH 3302ED49
00163DBF 68 D40BDC21 PUSH 21DC0BD4
00163DC4 68 8CC65210 PUSH 1052C68C
00163DC9 68 412AEA66 PUSH 66EA2A41
00163DCE 68 E3465BBF PUSH BF5B46E3
00163DD3 68 21331A5D PUSH 5D1A3321
00163DD8 68 88431400 PUSH 144388 ; buffer2
00163DDD E8 D5092405 CALL EXERe.053A47B7
00163DE2 9D POPFD
00163DE3 61 POPAD
00163DE4 FF25 88431400 JMP DWORD PTR DS:[144388] ; buffer2
053C0B7E 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] ; 循环变量, API 序号
053C0B59 6A 00 PUSH 0
053C0B88 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8] ; buffer1 保存在这
053C0BC5 6A 04 PUSH 4
053C0B9F 50 PUSH EAX
053C0BAD 8B85 78FEFFFF MOV EAX,DWORD PTR SS:[EBP-188] ; FirstThunk 位置 (RVA)
053C24D9 8D0488 LEA EAX,DWORD PTR DS:[EAX+ECX*4]
053C2822 0305 E4A03B05 ADD EAX,DWORD PTR DS:[53BA0E4] ; ImageBase (加壳前的)
053C25DF 50 PUSH EAX
053C2538 A1 74A03B05 MOV EAX,DWORD PTR DS:[53BA074]
053C2504 FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8]
053C2522 F7D0 NOT EAX
053C2565 FFD0 CALL EAX ; WriteProcessMemory ( 写 4 字节, 填充FirstThunk 指向 buffer1 )
053C2517 FF45 FC INC DWORD PTR SS:[EBP-4] ; 循环变量 ++
053C254D 8B85 74FEFFFF MOV EAX,DWORD PTR SS:[EBP-18C]
053C2544 3945 FC CMP DWORD PTR SS:[EBP-4],EAX ; API 个数
053C24EC /0F8C 22050000 JL EXERe.053C2A14 ; 循环出口
053C2A14 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
053C2A48 ^\E9 41D9FFFF JMP EXERe.053C038E ; 继续下一个 API
053C257E 8B5D B4 MOV EBX,DWORD PTR SS:[EBP-4C] ; 内循环结束到这里, EBX 下面清场用
053C25A0 8D4D D0 LEA ECX,DWORD PTR SS:[EBP-30]
053C25BC 51 PUSH ECX
053C2588 8B8D 78FEFFFF MOV ECX,DWORD PTR SS:[EBP-188]
053C2748 FF75 D0 PUSH DWORD PTR SS:[EBP-30]
053C278D C1E0 02 SHL EAX,2
053C275E 50 PUSH EAX
053C2771 A1 E4A03B05 MOV EAX,DWORD PTR DS:[53BA0E4]
053C25AE 03C8 ADD ECX,EAX
053C2595 A1 78A03B05 MOV EAX,DWORD PTR DS:[53BA078]
053C2800 51 PUSH ECX
053C2811 F7D0 NOT EAX
053C27E5 FFD0 CALL EAX ; VirtualProtect( 420080 ) 恢复
053C2818 FF45 F4 INC DWORD PTR SS:[EBP-C] ; 外循环变量 ++
053C27AF 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
053C279F 8145 E8 1401000>ADD DWORD PTR SS:[EBP-18],114 ; 每个 DLL 114h byte
053C27D3 3B45 8C CMP EAX,DWORD PTR SS:[EBP-74] ; DLL 个数
053C27BB ^\0F8C 94D9FFFF JL EXERe.053C0155 ; NL 外循环结束
053C27F2 33FF XOR EDI,EDI ; 清理现场
053C265B FF75 EC PUSH DWORD PTR SS:[EBP-14]
053C261D A1 90A03B05 MOV EAX,DWORD PTR DS:[53BA090]
053C263B F7D0 NOT EAX
053C25F5 57 PUSH EDI
053C270F FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053C272E FFD0 CALL EAX ; ntdll.RtlFreeHeap
053C2609 A1 90A03B05 MOV EAX,DWORD PTR DS:[53BA090]
053C2673 53 PUSH EBX
053C26CF 57 PUSH EDI
053C26EC FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053C262D F7D0 NOT EAX
053C26B2 FFD0 CALL EAX ; ntdll.RtlFreeHeap
十四. OEP
053C2698 8D45 BC LEA EAX,DWORD PTR SS:[EBP-44]
053C2ACD 50 PUSH EAX
053C2854 A1 78A03B05 MOV EAX,DWORD PTR DS:[53BA078]
053C283C 68 80000000 PUSH 80
053C2887 FF35 E8A03B05 PUSH DWORD PTR DS:[53BA0E8]
053C2871 F7D0 NOT EAX
053C29EF FF35 E4A03B05 PUSH DWORD PTR DS:[53BA0E4]
053C2A83 FFD0 CALL EAX ; VirtualProtect(400000, 10B000, Page_Exectue_writecopy)
053C2AA5 FF75 88 PUSH DWORD PTR SS:[EBP-78] ; 1461F8 注意这个地址不固定
053C2A2D C3 RETN ; Stolen oep
整理好的被偷代码
40BF2F-40C031
0040BF2F 55 PUSH EBP
0040BF30 8BEC MOV EBP,ESP
0040BF32 6A FF PUSH -1
0040BF34 68 78194200 PUSH 421978
0040BF39 68 54034100 PUSH 410354
0040BF3E 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
0040BF44 50 PUSH EAX
0040BF45 64:8925 0000000>MOV DWORD PTR FS:[0],ESP
0040BF4C 83EC 58 SUB ESP,58
0040BF4F 53 PUSH EBX
0040BF50 56 PUSH ESI
0040BF51 57 PUSH EDI
0040BF52 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP
0040BF55 FF15 D0014200 CALL DWORD PTR DS:[4201D0] ; KERNEL32.GetVersion
0040BF5B 33D2 XOR EDX,EDX
0040BF5D 8AD4 MOV DL,AH
0040BF5F 8915 4CB54300 MOV DWORD PTR DS:[43B54C],EDX
0040BF65 8BC8 MOV ECX,EAX
0040BF67 81E1 FF000000 AND ECX,0FF
0040BF6D 890D 48B54300 MOV DWORD PTR DS:[43B548],ECX
0040BF73 C1E1 08 SHL ECX,8
0040BF76 03CA ADD ECX,EDX
0040BF78 890D 44B54300 MOV DWORD PTR DS:[43B544],ECX
0040BF7E C1E8 10 SHR EAX,10
0040BF81 A3 40B54300 MOV DWORD PTR DS:[43B540],EAX
0040BF86 6A 01 PUSH 1
0040BF88 E8 60430000 CALL 004102ED
0040BF8D 59 POP ECX
0040BF8E 85C0 TEST EAX,EAX
0040BF90 75 08 JNZ SHORT 0040BF9A
0040BF92 6A 1C PUSH 1C
0040BF94 E8 C3000000 CALL 0040C05C
0040BF99 59 POP ECX
0040BF9A E8 ED220000 CALL 0040E28C
0040BF9F 85C0 TEST EAX,EAX
0040BFA1 75 08 JNZ SHORT 0040BFAB
0040BFA3 6A 10 PUSH 10
0040BFA5 E8 B2000000 CALL 0040C05C
0040BFAA 59 POP ECX
0040BFAB 33F6 XOR ESI,ESI
0040BFAD 8975 FC MOV DWORD PTR SS:[EBP-4],ESI
0040BFB0 E8 FF390000 CALL 0040F9B4
0040BFB5 FF15 C0004200 CALL DWORD PTR DS:[4200C0] ; KERNEL32.GetCommandLineA
0040BFBB A3 58CC4300 MOV DWORD PTR DS:[43CC58],EAX
0040BFC0 E8 81400000 CALL 00410046
0040BFC5 A3 30B54300 MOV DWORD PTR DS:[43B530],EAX
0040BFCA E8 2A3E0000 CALL 0040FDF9
0040BFCF E8 6C3D0000 CALL 0040FD40
0040BFD4 E8 39010000 CALL 0040C112
0040BFD9 8975 D0 MOV DWORD PTR SS:[EBP-30],ESI
0040BFDC 8D45 A4 LEA EAX,DWORD PTR SS:[EBP-5C]
0040BFDF 50 PUSH EAX
0040BFE0 FF15 BC004200 CALL DWORD PTR DS:[4200BC] ; KERNEL32.GetStartupInfoA
0040BFE6 E8 FD3C0000 CALL 0040FCE8
0040BFEB 8945 9C MOV DWORD PTR SS:[EBP-64],EAX
0040BFEE F645 D0 01 TEST BYTE PTR SS:[EBP-30],1
0040BFF2 74 06 JE SHORT 0040BFFA
0040BFF4 0FB745 D4 MOVZX EAX,WORD PTR SS:[EBP-2C]
0040BFF8 EB 03 JMP SHORT 0040BFFD
0040BFFA 6A 0A PUSH 0A
0040BFFC 58 POP EAX
0040BFFD 50 PUSH EAX
0040BFFE FF75 9C PUSH DWORD PTR SS:[EBP-64]
0040C001 56 PUSH ESI
0040C002 56 PUSH ESI
0040C003 FF15 58024200 CALL DWORD PTR DS:[420258] ; KERNEL32.GetModuleHandleA
0040C009 50 PUSH EAX
0040C00A E8 21920000 CALL 00415230
0040C00F 8945 A0 MOV DWORD PTR SS:[EBP-60],EAX
0040C012 50 PUSH EAX
0040C013 E8 27010000 CALL 0040C13F
0040C018 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
0040C01B 8B08 MOV ECX,DWORD PTR DS:[EAX]
0040C01D 8B09 MOV ECX,DWORD PTR DS:[ECX]
0040C01F 894D 98 MOV DWORD PTR SS:[EBP-68],ECX
0040C022 50 PUSH EAX
0040C023 51 PUSH ECX
0040C024 E8 473B0000 CALL 0040FB70
0040C029 59 POP ECX
0040C02A 59 POP ECX
0040C02B C3 RETN
十五. 计算 API Address 的关键 CALL ( 以 kernel32.dll 的 GetVersion 为例
几个重要的线程函数
001487E4 FF15 D0014200 CALL DWORD PTR DS:[4201D0]
00144A78 60 PUSHAD
00144A79 9C PUSHFD
00144A7A 68 E3465BBF PUSH BF5B46E3 ; DLL Name Hash
00144A7F 68 0089DCBA PUSH BADC8900
00144A84 68 BB695C0C PUSH 0C5C69BB
00144A89 68 D033BFC7 PUSH C7BF33D0 ; API Name Hash
00144A8E 68 8CC65210 PUSH 1052C68C
00144A93 68 49ED0233 PUSH 3302ED49
00144A98 68 C84A1400 PUSH 144AC8
00144A9D E8 15FD2505 CALL EXERe.053A47B7
00144AA2 9D POPFD
00144AA3 61 POPAD
00144AA4 FF25 C84A1400 JMP DWORD PTR DS:[144AC8]
EXERe.053A47B7(arg0, arg1, arg2, arg3, arg4, arg5, arg6)
arg1 - arg6 其中两个数的平方是其他四个数
保存时 DLL Name Hash 在前
053A47B7 /. 55 PUSH EBP
053A47B8 |. 8BEC MOV EBP,ESP
053A47BA |. 83EC 24 SUB ESP,24 ; 9个var, var1- var6, 放参数 arg1-arg6
053A47BD |. 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
053A47C0 |. 8365 F8 00 AND DWORD PTR SS:[EBP-8],0 ; var8=0
053A47C4 |. 8945 DC MOV DWORD PTR SS:[EBP-24],EAX
053A47C7 |. 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
053A47CA |. 8945 E0 MOV DWORD PTR SS:[EBP-20],EAX
053A47CD |. 8B45 14 MOV EAX,DWORD PTR SS:[EBP+14]
053A47D0 |. 8945 E4 MOV DWORD PTR SS:[EBP-1C],EAX
053A47D3 |. 8B45 18 MOV EAX,DWORD PTR SS:[EBP+18]
053A47D6 |. 8365 FC 00 AND DWORD PTR SS:[EBP-4],0 ; var9=0
053A47DA |. 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX
053A47DD |. 8B45 1C MOV EAX,DWORD PTR SS:[EBP+1C]
053A47E0 |. 56 PUSH ESI
053A47E1 |. 8945 EC MOV DWORD PTR SS:[EBP-14],EAX
053A47E4 |. 8B45 20 MOV EAX,DWORD PTR SS:[EBP+20]
053A47E7 |. 57 PUSH EDI
053A47E8 |. 894D F4 MOV DWORD PTR SS:[EBP-C],ECX ; var7 = ecx = 57 ???
053A47EB |. 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
053A47EE |. 8D75 DC LEA ESI,DWORD PTR SS:[EBP-24] ; esi -> var1
053A47F1 |. C745 0C 06000>MOV DWORD PTR SS:[EBP+C],6 ; 循环 6 次, 找出两个原始数
053A47F8 |> 8B3E /MOV EDI,DWORD PTR DS:[ESI] ; var1
053A47FA |. 8BC7 |MOV EAX,EDI
053A47FC |. 99 |CDQ
053A47FD |. 52 |PUSH EDX
053A47FE |. 50 |PUSH EAX
053A47FF |. 52 |PUSH EDX
053A4800 |. 50 |PUSH EAX
053A4801 |. E8 CC2C0000 |CALL EXERe.053A74D2 ; EXERe.053A74D2( 32位带符号乘法)
053A4806 |. 83C4 10 |ADD ESP,10
053A4809 |. 8D4D DC |LEA ECX,DWORD PTR SS:[EBP-24] ; ecx -> var1
053A480C |. 6A 06 |PUSH 6
053A480E |. 5A |POP EDX ; edx =6
053A480F |> 3B01 |/CMP EAX,DWORD PTR DS:[ECX]
053A4811 |. 75 0E ||JNZ SHORT EXERe.053A4821
053A4813 |. 837D FC 00 ||CMP DWORD PTR SS:[EBP-4],0
053A4817 |. 75 05 ||JNZ SHORT EXERe.053A481E
053A4819 |. 897D FC ||MOV DWORD PTR SS:[EBP-4],EDI
053A481C |. EB 03 ||JMP SHORT EXERe.053A4821
053A481E |> 897D F8 ||MOV DWORD PTR SS:[EBP-8],EDI
053A4821 |> 83C1 04 ||ADD ECX,4
053A4824 |. 4A ||DEC EDX
053A4825 |.^ 75 E8 |\JNZ SHORT EXERe.053A480F
053A4827 |. 83C6 04 |ADD ESI,4
053A482A |. FF4D 0C |DEC DWORD PTR SS:[EBP+C]
053A482D |.^ 75 C9 \JNZ SHORT EXERe.053A47F8
053A482F |. FF75 FC PUSH DWORD PTR SS:[EBP-4] ; /Arg2 原始数 2 (API Name Hash)
053A4832 |. 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C] ; |
053A4835 |. FF75 F8 PUSH DWORD PTR SS:[EBP-8] ; |Arg1 原始数 1 (Dll Name Hash)
053A4838 |. E8 F3DFFFFF CALL EXERe.053A2830 ; \EXERe.053A2830
053A483D |. 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8] ; arg0
053A4840 |. 5F POP EDI
053A4841 |. 5E POP ESI
053A4842 |. 8901 MOV DWORD PTR DS:[ECX],EAX ; 最终结果
053A4844 |. C9 LEAVE
053A4845 \. C2 1C00 RETN 1C
Structure // 0c byte ; 这个结构很重要 ******************************************************************
{
DWORD DLLNameHash;
DWORD APINameHash;
DWORD APIAddress( 被 53A102C 处理过的);
}
proc 53A2830(DLL Name Hash, API Name Hash)
053A2830 /$ 55 PUSH EBP
053A2831 |. 8BEC MOV EBP,ESP
053A2833 |. 83EC 30 SUB ESP,30
053A2836 |. A1 4C8C3B05 MOV EAX,DWORD PTR DS:[53B8C4C] ; 全局变量 2
053A283B |. 53 PUSH EBX
053A283C |. 56 PUSH ESI
053A283D |. 8B75 0C MOV ESI,DWORD PTR SS:[EBP+C] ; API Name Hash
053A2840 |. 8D4D F4 LEA ECX,DWORD PTR SS:[EBP-C]
053A2843 |. 57 PUSH EDI
053A2844 |. 8B7D 08 MOV EDI,DWORD PTR SS:[EBP+8] ; DLL Name Hash
053A2847 |. 51 PUSH ECX ; /Arg3 pS1
053A2848 |. 50 PUSH EAX ; |Arg2 [53B8C4C] 全局变量2, 初始=0
053A2849 |. 33DB XOR EBX,EBX ; |
053A284B |. FF35 488C3B05 PUSH DWORD PTR DS:[53B8C48] ; |Arg1 [53B8C48] 全局变量1, 初始=0
053A2851 |. 897D F4 MOV DWORD PTR SS:[EBP-C],EDI ; |
053A2854 |. 8975 F8 MOV DWORD PTR SS:[EBP-8],ESI ; |
053A2857 |. 895D FC MOV DWORD PTR SS:[EBP-4],EBX ; |
053A285A |. E8 20240000 CALL EXERe.053A4C7F ; \EXERe.053A4C7F
053A285F |. 83C4 0C ADD ESP,0C
053A2862 |. 3B05 4C8C3B05 CMP EAX,DWORD PTR DS:[53B8C4C] ; 判断是否成功
053A2868 |. 74 0D JE SHORT EXERe.053A2877
053A286A |. 8BF0 MOV ESI,EAX ; 成功了
053A286C |. 8D7D D0 LEA EDI,DWORD PTR SS:[EBP-30]
053A286F |. A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; 复制到临时空间, 这个多余
053A2870 |. A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; 这个多余
053A2871 |. A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; 有这个就够了
053A2872 |. 8B45 D8 MOV EAX,DWORD PTR SS:[EBP-28] ; API address ( 被 53A102C 处理过的)
053A2875 |. EB 6B JMP SHORT EXERe.053A28E2
053A2877 |> 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18] ; 不成功
053A287A |. B9 488C3B05 MOV ECX,EXERe.053B8C48 ; proc 53A2301 的一个参数
053A287F |. 50 PUSH EAX ; pS2
053A2880 |. 895D F0 MOV DWORD PTR SS:[EBP-10],EBX ; 填充 S2
053A2883 |. 897D E8 MOV DWORD PTR SS:[EBP-18],EDI
053A2886 |. 8975 EC MOV DWORD PTR SS:[EBP-14],ESI
053A2889 |. E8 73FAFFFF CALL EXERe.053A2301 ; 扩充 [53B8C48] - [53B8C50] 的队列, ***********************************************************
053A288E |. 895D E4 MOV DWORD PTR SS:[EBP-1C],EBX ; 填充 S3
053A2891 |. 897D DC MOV DWORD PTR SS:[EBP-24],EDI
053A2894 |. 8975 E0 MOV DWORD PTR SS:[EBP-20],ESI
053A2897 |. BB 000000F0 MOV EBX,F0000000
053A289C |> A1 A0A03B05 /MOV EAX,DWORD PTR DS:[53BA0A0]
053A28A1 |. 6A 02 |PUSH 2
053A28A3 |. F7D0 |NOT EAX
053A28A5 |. FFD0 |CALL EAX ; Sleep(2ms), 等待 2 ms
053A28A7 |. A1 4C8C3B05 |MOV EAX,DWORD PTR DS:[53B8C4C]
053A28AC |. 8D4D DC |LEA ECX,DWORD PTR SS:[EBP-24]
053A28AF |. 51 |PUSH ECX ; /Arg3 pS3
053A28B0 |. 50 |PUSH EAX ; |Arg2 [53B8C4C]
053A28B1 |. FF35 488C3B05 |PUSH DWORD PTR DS:[53B8C48] ; |Arg1 [53B8C48]
053A28B7 |. E8 C3230000 |CALL EXERe.053A4C7F ; \EXERe.053A4C7F, 再找一次
053A28BC |. 83C4 0C |ADD ESP,0C
053A28BF |. 3B05 4C8C3B05 |CMP EAX,DWORD PTR DS:[53B8C4C] ; 再次判断是否匹配
053A28C5 |. 74 19 |JE SHORT EXERe.053A28E0 ; 如果还没成功, 就放弃, 返回 0 , 这样程序就结束了 ********************************
053A28C7 |. 8BF0 |MOV ESI,EAX ; 成功
053A28C9 |. 8D7D D0 |LEA EDI,DWORD PTR SS:[EBP-30]
053A28CC |. A5 |MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
053A28CD |. A5 |MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
053A28CE |. A5 |MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
053A28CF |. 8B45 D8 |MOV EAX,DWORD PTR SS:[EBP-28] ; API address ( 被 53A102C 处理过的)
053A28D2 |. 85C0 |TEST EAX,EAX
053A28D4 |.^ 74 C6 |JE SHORT EXERe.053A289C ; APIaddress=0, 再去等 2 ms
053A28D6 |. 8BC8 |MOV ECX,EAX
053A28D8 |. 23CB |AND ECX,EBX
053A28DA |. 3BCB |CMP ECX,EBX
053A28DC |. 75 04 |JNZ SHORT EXERe.053A28E2 ; API address 不能是 Fxxxxxxx
053A28DE |.^ EB BC \JMP SHORT EXERe.053A289C
053A28E0 |> 33C0 XOR EAX,EAX
053A28E2 |> 5F POP EDI
053A28E3 |. 5E POP ESI
053A28E4 |. 5B POP EBX
053A28E5 |. C9 LEAVE
053A28E6 \. C2 0800 RETN 8
proc 53A4C7F( X, Y, Z)
X pStructure (第一个)
Y pStructure (最后一个)
Z pStructure
从 X 到 Y 的队列中找出与 Z 匹配的 (比较 DLL hash, API hash)
053A4C7F /$ 55 PUSH EBP
053A4C80 |. 8BEC MOV EBP,ESP
053A4C82 |. 8B4D 0C MOV ECX,DWORD PTR SS:[EBP+C] ; ECX = Y
053A4C85 |. 53 PUSH EBX
053A4C86 |. 8B5D 08 MOV EBX,DWORD PTR SS:[EBP+8] ; EBX = X
053A4C89 |. 8BC1 MOV EAX,ECX
053A4C8B |. 56 PUSH ESI
053A4C8C |. 57 PUSH EDI
053A4C8D |. 2BC3 SUB EAX,EBX ; EAX = Y-X
053A4C8F |. 6A 0C PUSH 0C
053A4C91 |. 99 CDQ
053A4C92 |. 5E POP ESI ; ESI = 0c
053A4C93 |. 894D 0C MOV DWORD PTR SS:[EBP+C],ECX ; Y 不变
053A4C96 |. F7FE IDIV ESI
053A4C98 |. 33C9 XOR ECX,ECX ; 循环变量
053A4C9A |. 85C0 TEST EAX,EAX
053A4C9C |. 8945 08 MOV DWORD PTR SS:[EBP+8],EAX ; 下面循环 (Y-X)/0c 次
053A4C9F |. 7E 27 JLE SHORT EXERe.053A4CC8
|.
053A4CA1 |. 8B75 10 MOV ESI,DWORD PTR SS:[EBP+10] ; Z
053A4CA4 |. 8BD3 MOV EDX,EBX ; EDX = X
053A4CA6 |. 8B7E 04 MOV EDI,DWORD PTR DS:[ESI+4] ; Z.APINameHash
|.
053A4CA9 |> 397A 04 /CMP DWORD PTR DS:[EDX+4],EDI ; 先比较 API Hash Name
053A4CAC |. 75 06 |JNZ SHORT EXERe.053A4CB4
053A4CAE |. 8B02 |MOV EAX,DWORD PTR DS:[EDX]
053A4CB0 |. 3B06 |CMP EAX,DWORD PTR DS:[ESI] ; 再比较 DLL Name Hash
053A4CB2 |. 74 0B |JE SHORT EXERe.053A4CBF ; 两个都 OK 则找到
053A4CB4 |> 41 |INC ECX
053A4CB5 |. 83C2 0C |ADD EDX,0C
053A4CB8 |. 3B4D 08 |CMP ECX,DWORD PTR SS:[EBP+8] ; 是否超过最后一个
053A4CBB |. 7D 0B |JGE SHORT EXERe.053A4CC8 ; 找不到返回 Y
053A4CBD |.^ EB EA \JMP SHORT EXERe.053A4CA9
053A4CBF |> 8D0449 LEA EAX,DWORD PTR DS:[ECX+ECX*2]
053A4CC2 |. 8D0483 LEA EAX,DWORD PTR DS:[EBX+EAX*4] ; EAX = X + 0ch*ECX
053A4CC5 |. 8945 0C MOV DWORD PTR SS:[EBP+C],EAX ; 匹配的结构地址
053A4CC8 |> 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
053A4CCB |. 5F POP EDI
053A4CCC |. 5E POP ESI
053A4CCD |. 5B POP EBX
053A4CCE |. 5D POP EBP
053A4CCF \. C3 RETN
Proc 53A2301(pStructure)
ECX = 53B8C48, 很重要的一个全局变量
053B8C48 ;第一个结构地址
053B8C4C ;最后一个结构地址
053B8C50 ;结构个数
Structure // 0c byte ; 这个结构很重要 ******************************************************************
{
DWORD DLLNameHash;
DWORD APINameHash;
DWORD APIAddress( 被 53A102C 处理过的);
}
053A2301 /$ 55 PUSH EBP
053A2302 |. 8BEC MOV EBP,ESP
053A2304 |. 51 PUSH ECX
053A2305 |. 53 PUSH EBX
053A2306 |. 8BD9 MOV EBX,ECX ; 53B8C48
053A2308 |. 56 PUSH ESI
053A2309 |. 57 PUSH EDI
053A230A |. 8B43 08 MOV EAX,DWORD PTR DS:[EBX+8] ; 结构个数
053A230D |. 85C0 TEST EAX,EAX
053A230F |. 75 30 JNZ SHORT EXERe.053A2341
053A2311 |. A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4] ; 原来为 0, 新生成一个
053A2316 |. 6A 0C PUSH 0C
053A2318 |. 6A 08 PUSH 8
053A231A |. FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053A2320 |. F7D0 NOT EAX
053A2322 |. FFD0 CALL EAX ; HeapAlloc(0ch byte)
053A2324 |. 85C0 TEST EAX,EAX
053A2326 |. 0F84 80000000 JE EXERe.053A23AC
053A232C |. 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8] ; pStructure
053A232F |. 8BF8 MOV EDI,EAX
053A2331 |. A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; 复制结构
053A2332 |. A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
053A2333 |. A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
053A2334 |. 8903 MOV DWORD PTR DS:[EBX],EAX ; [53B8C48]
053A2336 |. 83C0 0C ADD EAX,0C
053A2339 |. FF43 08 INC DWORD PTR DS:[EBX+8] ; 结构个数 ++
053A233C |. 8943 04 MOV DWORD PTR DS:[EBX+4],EAX
053A233F |. EB 6B JMP SHORT EXERe.053A23AC
053A2341 |> 8D4440 03 LEA EAX,DWORD PTR DS:[EAX+EAX*2+3] ; 原来不为 0, 扩展一个
053A2345 |. C1E0 02 SHL EAX,2 ; EAX = (EAX+1)*12
053A2348 |. 50 PUSH EAX
053A2349 |. A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053A234E |. 6A 08 PUSH 8
053A2350 |. FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053A2356 |. F7D0 NOT EAX
053A2358 |. FFD0 CALL EAX ; HeapAlloc(新分配空间, 比原来大 0c 字节)
053A235A |. 33C9 XOR ECX,ECX
053A235C |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
053A235F |. 394B 08 CMP DWORD PTR DS:[EBX+8],ECX
053A2362 |. 7E 15 JLE SHORT EXERe.053A2379
053A2364 |. 33D2 XOR EDX,EDX ; 把老的内容复制到新空间
053A2366 |> 8BF2 /MOV ESI,EDX
053A2368 |. 8D3C02 |LEA EDI,DWORD PTR DS:[EDX+EAX]
053A236B |. 0333 |ADD ESI,DWORD PTR DS:[EBX]
053A236D |. 41 |INC ECX
053A236E |. 83C2 0C |ADD EDX,0C
053A2371 |. A5 |MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
053A2372 |. A5 |MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
053A2373 |. A5 |MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
053A2374 |. 3B4B 08 |CMP ECX,DWORD PTR DS:[EBX+8]
053A2377 |.^ 7C ED \JL SHORT EXERe.053A2366
053A2379 |> 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8] ; pStructure
053A237C |. 8D0C49 LEA ECX,DWORD PTR DS:[ECX+ECX*2]
053A237F |. 8D3C88 LEA EDI,DWORD PTR DS:[EAX+ECX*4]
053A2382 |. A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; append 到最后
053A2383 |. A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
053A2384 |. A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
053A2385 |. FF33 PUSH DWORD PTR DS:[EBX] ; 释放老的空间
053A2387 |. A1 90A03B05 MOV EAX,DWORD PTR DS:[53BA090]
053A238C |. F7D0 NOT EAX
053A238E |. 6A 00 PUSH 0
053A2390 |. FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053A2396 |. FFD0 CALL EAX ; HeapFree
053A2398 |. FF43 08 INC DWORD PTR DS:[EBX+8] ; 结构个数 ++
053A239B |. 8B43 08 MOV EAX,DWORD PTR DS:[EBX+8]
053A239E |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
053A23A1 |. 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*2]
053A23A4 |. 890B MOV DWORD PTR DS:[EBX],ECX ; 新空间的开始地址
053A23A6 |. 8D0481 LEA EAX,DWORD PTR DS:[ECX+EAX*4]
053A23A9 |. 8943 04 MOV DWORD PTR DS:[EBX+4],EAX ; 新空间的结束地址
053A23AC |> 5F POP EDI
053A23AD |. 5E POP ESI
053A23AE |. 5B POP EBX
053A23AF |. C9 LEAVE
053A23B0 \. C2 0400 RETN 4
053B8C18 ; 开始结构地址
053B8C1C ; 结束结构地址
053B8C20 ; hThread 结构个数
structure hThread
{
Dword ThreadHandle;
}
053B8C24 ; 开始结构地址
053B8C28 ; 结束结构地址
053B8C2C ; DllNameHash 结构个数
structure DllNameHash
{
Dword DllNameHash;
}
053B8C38 ; 开始结构地址
053B8C3C ; 结束结构地址
053B8C40 ; Dll UniName Path 结构个数
structure UniName
{
Dword BaseAddress;
Dword UnicodeString; 指向 Unicode Name
}
053B8C58 ; 开始结构地址
053B8C5C ; 结束结构地址
053B8C60 ; DLL API Address 结构个数
structure Export
{
Dword BaseAddress;
Dword pFirstThunk; (Dll 所有的 API address, 按原始循序, 0 结束)
Dword TlsSize
}
MyLoadLibrary(pDllName)
ECX = 053B8C18 ;关键全局变量
053A5514 /. 55 PUSH EBP
053A5515 |. 8BEC MOV EBP,ESP
053A5517 |. 81EC 180A0000 SUB ESP,0A18
053A551D |. 53 PUSH EBX
053A551E |. 56 PUSH ESI
053A551F |. 57 PUSH EDI
053A5520 |. 8B7D 08 MOV EDI,DWORD PTR SS:[EBP+8] ; pDllName
053A5523 |. 33DB XOR EBX,EBX
053A5525 |. 8BF1 MOV ESI,ECX ; 053B8C18
053A5527 |. 3BFB CMP EDI,EBX
053A5529 |. 8975 F0 MOV DWORD PTR SS:[EBP-10],ESI
053A552C |. 0F84 75010000 JE EXERe.053A56A7 ; pDllName == 0 则结束
053A5532 |. 53 PUSH EBX
053A5533 |. 57 PUSH EDI
053A5534 |. E8 6EF1FFFF CALL EXERe.053A46A7 ; uppercase
053A5539 |. 59 POP ECX
053A553A |. 50 PUSH EAX
053A553B |. E8 C91F0000 CALL EXERe.053A7509 ; 对 Dll Name 做 Hash 变换
053A5540 |. 59 POP ECX
053A5541 |. 33D2 XOR EDX,EDX
053A5543 |. 59 POP ECX
053A5544 |. 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX ; 保存 Dll Name Hash
053A5547 |. 8B4E 14 MOV ECX,DWORD PTR DS:[ESI+14] ; 已处理的 DLL 个数
053A554A |. 3BCB CMP ECX,EBX
053A554C |. 7E 13 JLE SHORT EXERe.053A5561
053A554E |. 8B76 0C MOV ESI,DWORD PTR DS:[ESI+C]
053A5551 |> 3B06 /CMP EAX,DWORD PTR DS:[ESI] ; 搜索数组
053A5553 |. 0F84 4E010000 |JE EXERe.053A56A7 ; 相等就表示已经处理过了, 返回
053A5559 |. 42 |INC EDX
053A555A |. 83C6 04 |ADD ESI,4 ; 下一个
053A555D |. 3BD1 |CMP EDX,ECX
053A555F |.^ 7C F0 \JL SHORT EXERe.053A5551
053A5561 |> A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053A5566 |. 6A 08 PUSH 8 ; 8 字节
053A5568 |. 6A 08 PUSH 8
053A556A |. FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053A5570 |. F7D0 NOT EAX
053A5572 |. FFD0 CALL EAX ; ntdll.RtlAllocateHeap
053A5574 |. 8BF0 MOV ESI,EAX
053A5576 |. A1 7CA03B05 MOV EAX,DWORD PTR DS:[53BA07C]
053A557B |. 57 PUSH EDI
053A557C |. F7D0 NOT EAX
053A557E |. FFD0 CALL EAX ; GetModuleHandleA
053A5580 |. 3BC3 CMP EAX,EBX
053A5582 |. 8906 MOV DWORD PTR DS:[ESI],EAX ; 包存 DLL Base Address
053A5584 |. 75 11 JNZ SHORT EXERe.053A5597 ; 不等已经加载了
053A5586 |. A1 84A03B05 MOV EAX,DWORD PTR DS:[53BA084]
053A558B |. 57 PUSH EDI
053A558C |. F7D0 NOT EAX
053A558E |. FFD0 CALL EAX ; LoadLibraryA
053A5590 |. 8906 MOV DWORD PTR DS:[ESI],EAX
053A5592 |. E8 0EFFFFFF CALL EXERe.053A54A5 ; 修正 53B8C38-53B8C40 所指的 UniName 列表
053A5597 |> E8 12010000 CALL EXERe.053A56AE ; 判断是否加载了 User32.dll, 0 没有, 否则返回 Not User32 BaseAddress
053A559C |. F7D0 NOT EAX
053A559E |. 3906 CMP DWORD PTR DS:[ESI],EAX
053A55A0 |. 75 16 JNZ SHORT EXERe.053A55B8 ; 改成 JMP, 跳过未注册提示 ***************************************************************************
053A55A2 |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8] ; 当前处理的是 User32.dll
053A55A5 |. 50 PUSH EAX
053A55A6 |. A1 ACA03B05 MOV EAX,DWORD PTR DS:[53BA0AC]
053A55AB |. 53 PUSH EBX
053A55AC |. 53 PUSH EBX
053A55AD |. 68 76573A05 PUSH EXERe.053A5776 ; ThreadFunction = 53A5776
053A55B2 |. 53 PUSH EBX
053A55B3 |. 53 PUSH EBX
053A55B4 |. F7D0 NOT EAX
053A55B6 |. FFD0 CALL EAX ; CreateThread ( 显示未注册对话框)
053A55B8 |> 8D8D E8F5FFFF LEA ECX,DWORD PTR SS:[EBP-A18]
053A55BE |. E8 9ACCFFFF CALL EXERe.053A225D ; zero buffer
053A55C3 |. FF36 PUSH DWORD PTR DS:[ESI] ; /Arg1 = dll base
053A55C5 |. 8D8D E8F5FFFF LEA ECX,DWORD PTR SS:[EBP-A18] ; |
053A55CB |. E8 00120000 CALL EXERe.053A67D0 ; \EXERe.053A67D0 ( 获取 DLL 的区块信息)
053A55D0 |. 8B06 MOV EAX,DWORD PTR DS:[ESI] ; dll base
053A55D2 |. 8D4D E4 LEA ECX,DWORD PTR SS:[EBP-1C] ; pExport
053A55D5 |. 8945 E4 MOV DWORD PTR SS:[EBP-1C],EAX
053A55D8 |. A1 5C8C3B05 MOV EAX,DWORD PTR DS:[53B8C5C]
053A55DD |. 51 PUSH ECX
053A55DE |. 50 PUSH EAX
053A55DF |. FF35 588C3B05 PUSH DWORD PTR DS:[53B8C58]
053A55E5 |. 895D E8 MOV DWORD PTR SS:[EBP-18],EBX
053A55E8 |. 895D EC MOV DWORD PTR SS:[EBP-14],EBX
053A55EB |. E8 C7D0FFFF CALL EXERe.053A26B7 ; 搜索 53B8C58-53B8C60 所指的 Export 列表
053A55F0 |. 83C4 0C ADD ESP,0C
053A55F3 |. 3B05 5C8C3B05 CMP EAX,DWORD PTR DS:[53B8C5C]
053A55F9 |. 75 0D JNZ SHORT EXERe.053A5608 ; 是否已有 Export 表
053A55FB |. 8D85 E8F5FFFF LEA EAX,DWORD PTR SS:[EBP-A18] ; 没有
053A5601 |. 50 PUSH EAX
053A5602 |. E8 631A0000 CALL EXERe.053A706A ; 修正 53B8C58-53B8C60 所指的 Export 列表
053A5607 |. 59 POP ECX
053A5608 |> 395D C0 CMP DWORD PTR SS:[EBP-40],EBX ; 这个 DLL 是否有 .tls 段
053A560B |. 7C 62 JL SHORT EXERe.053A566F
053A560D |. 53 PUSH EBX ; 有 tls
053A560E |. 8D45 D8 LEA EAX,DWORD PTR SS:[EBP-28] ; 放 tls 的 buffer
053A5611 |. 6A 18 PUSH 18
053A5613 |. 50 PUSH EAX
053A5614 |. 8B06 MOV EAX,DWORD PTR DS:[ESI] ; DLL baseaddress
053A5616 |. 0385 E8F6FFFF ADD EAX,DWORD PTR SS:[EBP-918] ; PE 头 Directory 中的 .tls RVA
053A561C |. 50 PUSH EAX
053A561D |. A1 88A03B05 MOV EAX,DWORD PTR DS:[53BA088]
053A5622 |. FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8] ; hProcess
053A5628 |. F7D0 NOT EAX
053A562A |. FFD0 CALL EAX ; ReadProcessMemory ( 读 18h byte)
053A562C |. 8B45 DC MOV EAX,DWORD PTR SS:[EBP-24]
053A562F |. 2B45 D8 SUB EAX,DWORD PTR SS:[EBP-28] ; tls 空间大小
053A5632 |. 0105 DCA03B05 ADD DWORD PTR DS:[53BA0DC],EAX ; 累加 tls 空间
053A5638 |. 50 PUSH EAX
053A5639 |. A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053A563E |. 6A 08 PUSH 8
053A5640 |. FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053A5646 |. F7D0 NOT EAX
053A5648 |. FFD0 CALL EAX ; HeapAlloc( DLL 所需的 tls 空间)
053A564A |. 6A 04 PUSH 4
053A564C |. 8BF8 MOV EDI,EAX
053A564E |. A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053A5653 |. 6A 08 PUSH 8
053A5655 |. FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053A565B |. F7D0 NOT EAX
053A565D |. FFD0 CALL EAX ; HeapAlloc ( 4 byte)
053A565F |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
053A5662 |. 8938 MOV DWORD PTR DS:[EAX],EDI
053A5664 |. 50 PUSH EAX
053A5665 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
053A5668 |. 64:A3 2C00000>MOV DWORD PTR FS:[2C],EAX ; ThreadLocalStoragePointer
053A566E |. 58 POP EAX
053A566F |> 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; DLL Name Hash
053A5672 |. 8D7E 04 LEA EDI,DWORD PTR DS:[ESI+4]
053A5675 |. 8907 MOV DWORD PTR DS:[EDI],EAX
053A5677 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
053A567A |. 50 PUSH EAX
053A567B |. A1 ACA03B05 MOV EAX,DWORD PTR DS:[53BA0AC]
053A5680 |. 53 PUSH EBX
053A5681 |. 56 PUSH ESI ; Param = { DLLBase, DllHash}
053A5682 |. 68 40583A05 PUSH EXERe.053A5840 ; ThreadFunction = 53A5840 关键 ******************************************************
053A5687 |. 53 PUSH EBX
053A5688 |. 53 PUSH EBX
053A5689 |. F7D0 NOT EAX
053A568B |. FFD0 CALL EAX ; CreateThread
053A568D |. 8B75 F0 MOV ESI,DWORD PTR SS:[EBP-10] ; 53b8C18
053A5690 |. 8945 08 MOV DWORD PTR SS:[EBP+8],EAX ; hThread
053A5693 |. 8D45 08 LEA EAX,DWORD PTR SS:[EBP+8]
053A5696 |. 8BCE MOV ECX,ESI
053A5698 |. 50 PUSH EAX
053A5699 |. E8 30070000 CALL EXERe.053A5DCE ; 修正 53B8C18-53B8C20 所指的 hThread 列表
053A569E |. 57 PUSH EDI
053A569F |. 8D4E 0C LEA ECX,DWORD PTR DS:[ESI+C]
053A56A2 |. E8 27070000 CALL EXERe.053A5DCE ; 修正 53B8C24-53B8C2C 所指的 DllNameHash 列表
053A56A7 |> 5F POP EDI
053A56A8 |. 5E POP ESI
053A56A9 |. 5B POP EBX
053A56AA |. C9 LEAVE
053A56AB \. C2 0400 RETN 4
053A5840 /. 55 PUSH EBP
053A5841 |. 8BEC MOV EBP,ESP
053A5843 |. 81EC 940B0000 SUB ESP,0B94
053A5849 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] ; Parameter
053A584C |. 53 PUSH EBX
053A584D |. 56 PUSH ESI
053A584E |. 57 PUSH EDI
053A584F |. 8B18 MOV EBX,DWORD PTR DS:[EAX] ; DLL base
053A5851 |. 8B48 04 MOV ECX,DWORD PTR DS:[EAX+4] ; DLL Name Hash
053A5854 |. 33F6 XOR ESI,ESI
053A5856 |. 50 PUSH EAX
053A5857 |. A1 90A03B05 MOV EAX,DWORD PTR DS:[53BA090]
053A585C |. 56 PUSH ESI
053A585D |. FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053A5863 |. 894D A8 MOV DWORD PTR SS:[EBP-58],ECX ; DLL Name Hash
053A5866 |. F7D0 NOT EAX
053A5868 |. FFD0 CALL EAX ; HeapFree
053A586A |. 8D8D 6CF4FFFF LEA ECX,DWORD PTR SS:[EBP-B94]
053A5870 |. E8 E8C9FFFF CALL EXERe.053A225D ; Zero buffer
053A5875 |. 53 PUSH EBX ; /Arg1=DLL Base
053A5876 |. 8D8D 6CF4FFFF LEA ECX,DWORD PTR SS:[EBP-B94] ; |
053A587C |. E8 4F0F0000 CALL EXERe.053A67D0 ; \EXERe.053A67D0( 获取 DLL 的区段信息)
053A5881 |. 56 PUSH ESI
053A5882 |. 8D85 6CFFFFFF LEA EAX,DWORD PTR SS:[EBP-94]
053A5888 |. 6A 28 PUSH 28
053A588A |. 50 PUSH EAX
053A588B |. 8B85 24F5FFFF MOV EAX,DWORD PTR SS:[EBP-ADC] ; Export table 的 RVA
053A5891 |. 03C3 ADD EAX,EBX
053A5893 |. 50 PUSH EAX
053A5894 |. A1 88A03B05 MOV EAX,DWORD PTR DS:[53BA088]
053A5899 |. FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8]
053A589F |. F7D0 NOT EAX
053A58A1 |. FFD0 CALL EAX ; ReadProcessMemory (28h) Export Table Header
053A58A3 |. 8B45 80 MOV EAX,DWORD PTR SS:[EBP-80] ; NumberOfFunctions
053A58A6 |. C1E0 02 SHL EAX,2 ; * 4
053A58A9 |. 50 PUSH EAX
053A58AA |. A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053A58AF |. 6A 08 PUSH 8
053A58B1 |. FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053A58B7 |. F7D0 NOT EAX
053A58B9 |. FFD0 CALL EAX ; HeapAlloc
053A58BB |. 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX ; 空间指针1 放 API 地址
053A58BE |. 8B45 84 MOV EAX,DWORD PTR SS:[EBP-7C] ; NumberOfNames
053A58C1 |. 03C0 ADD EAX,EAX ; * 2
053A58C3 |. 8975 B8 MOV DWORD PTR SS:[EBP-48],ESI
053A58C6 |. 50 PUSH EAX
053A58C7 |. A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053A58CC |. 6A 08 PUSH 8
053A58CE |. 8975 BC MOV DWORD PTR SS:[EBP-44],ESI
053A58D1 |. FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053A58D7 |. 8975 C0 MOV DWORD PTR SS:[EBP-40],ESI
053A58DA |. F7D0 NOT EAX
053A58DC |. FFD0 CALL EAX ; HeapAlloc
053A58DE |. 8945 D8 MOV DWORD PTR SS:[EBP-28],EAX ; 空间指针2 放 NameOrdinal
053A58E1 |. 8B45 84 MOV EAX,DWORD PTR SS:[EBP-7C] ; NumberOfNames
053A58E4 |. C1E0 08 SHL EAX,8 ; * 256
053A58E7 |. 50 PUSH EAX
053A58E8 |. A1 B4A03B05 MOV EAX,DWORD PTR DS:[53BA0B4]
053A58ED |. 6A 08 PUSH 8
053A58EF |. FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053A58F5 |. F7D0 NOT EAX
053A58F7 |. FFD0 CALL EAX ; HeapAlloc
053A58F9 |. 8945 DC MOV DWORD PTR SS:[EBP-24],EAX ; 空间指针3 放 NameString
053A58FC |. 8B45 80 MOV EAX,DWORD PTR SS:[EBP-80] ; NumberOfFunctions
053A58FF |. C1E0 02 SHL EAX,2 ; * 4
053A5902 |. 56 PUSH ESI
053A5903 |. 50 PUSH EAX
053A5904 |. 8B45 88 MOV EAX,DWORD PTR SS:[EBP-78] ; AddressOfFunctions
053A5907 |. FF75 F4 PUSH DWORD PTR SS:[EBP-C] ; 空间指针1
053A590A |. 03C3 ADD EAX,EBX
053A590C |. 50 PUSH EAX
053A590D |. A1 88A03B05 MOV EAX,DWORD PTR DS:[53BA088]
053A5912 |. FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8]
053A5918 |. F7D0 NOT EAX
053A591A |. FFD0 CALL EAX ; ReadProcessMemory 读入所有的地址
053A591C |. 8B45 84 MOV EAX,DWORD PTR SS:[EBP-7C] ; NumberOfNames
053A591F |. 56 PUSH ESI
053A5920 |. 03C0 ADD EAX,EAX
053A5922 |. 50 PUSH EAX
053A5923 |. 8B45 90 MOV EAX,DWORD PTR SS:[EBP-70] ; AddressOfNameOrdinals
053A5926 |. FF75 D8 PUSH DWORD PTR SS:[EBP-28] ; 空间指针2
053A5929 |. 03C3 ADD EAX,EBX
053A592B |. 50 PUSH EAX
053A592C |. FF35 D8A03B05 PUSH DWORD PTR DS:[53BA0D8]
053A5932 |. A1 88A03B05 MOV EAX,DWORD PTR DS:[53BA088]
053A5937 |. F7D0 NOT EAX
053A5939 |. FFD0 CALL EAX ; ReadProcessMemory 读入所有的 NameOrdinal
053A593B |. 33FF XOR EDI,EDI
053A593D |. 3975 84 CMP DWORD PTR SS:[EBP-7C],ESI ; NumberOfNames > 0 ?
053A5940 |. 7E 6B JLE SHORT EXERe.053A59AD
053A5942 |. 8B45 DC MOV EAX,DWORD PTR SS:[EBP-24] ; 空间指针3
053A5945 |. 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX
053A5948 |> 56 /PUSH ESI ; 循环读入所有的 NameString
053A5949 |. 8D45 E0 |LEA EAX,DWORD PTR SS:[EBP-20]
053A594C |. 6A 04 |PUSH 4
053A594E |. 50 |PUSH EAX
053A594F |. 8B45 8C |MOV EAX,DWORD PTR SS:[EBP-74] ; AddressOfNames
053A5952 |. 8975 EC |MOV DWORD PTR SS:[EBP-14],ESI
053A5955 |. 8D04B8 |LEA EAX,DWORD PTR DS:[EAX+EDI*4] ; EDI 循环变量
053A5958 |. 03C3 |ADD EAX,EBX ; RVA -> VA
053A595A |. 50 |PUSH EAX
053A595B |. A1 88A03B05 |MOV EAX,DWORD PTR DS:[53BA088]
053A5960 |. FF35 D8A03B05 |PUSH DWORD PTR DS:[53BA0D8]
053A5966 |. F7D0 |NOT EAX
053A5968 |. FFD0 |CALL EAX ; 读 4 字节地址
053A596A |. 8B45 E8 |MOV EAX,DWORD PTR SS:[EBP-18]
053A596D |. 8945 08 |MOV DWORD PTR SS:[EBP+8],EAX
053A5970 |> 8B45 E0 |/MOV EAX,DWORD PTR SS:[EBP-20]
053A5973 |. 8B4D EC ||MOV ECX,DWORD PTR SS:[EBP-14]
053A5976 |. 56 ||PUSH ESI
053A5977 |. 6A 01 ||PUSH 1
053A5979 |. FF75 08 ||PUSH DWORD PTR SS:[EBP+8]
053A597C |. 03C1 ||ADD EAX,ECX
053A597E |. 03C3 ||ADD EAX,EBX
053A5980 |. 50 ||PUSH EAX
053A5981 |. A1 88A03B05 ||MOV EAX,DWORD PTR DS:[53BA088]
053A5986 |. FF35 D8A03B05 ||PUSH DWORD PTR DS:[53BA0D8]
053A598C |. F7D0 ||NOT EAX
053A598E |. FFD0 ||CALL EAX ; ReadProcessMemory (1 byte)
053A5990 |. 8B45 08 ||MOV EAX,DWORD PTR SS:[EBP+8]
053A5993 |. 8038 00 ||CMP BYTE PTR DS:[EAX],0 ; 是否 0
053A5996 |. 74 08 ||JE SHORT EXERe.053A59A0 ; 是 0 一个 Name 结束
053A5998 |. FF45 EC ||INC DWORD PTR SS:[EBP-14]
053A599B |. FF45 08 ||INC DWORD PTR SS:[EBP+8]
053A599E |.^ EB D0 |\JMP SHORT EXERe.053A5970
053A59A0 |> 8145 E8 00010>|ADD DWORD PTR SS:[EBP-18],100 ; 每个 Name 256 byte
053A59A7 |. 47 |INC EDI
053A59A8 |. 3B7D 84 |CMP EDI,DWORD PTR SS:[EBP-7C] ; 所有的 Name 读完?
053A59AB |.^ 7C 9B \JL SHORT EXERe.053A5948
053A59AD |> 3975 80 CMP DWORD PTR SS:[EBP-80],ESI ; NumberOfFunctions > 0 ?
053A59B0 |. 8975 AC MOV DWORD PTR SS:[EBP-54],ESI
053A59B3 |. 8975 B0 MOV DWORD PTR SS:[EBP-50],ESI
053A59B6 |. 8975 B4 MOV DWORD PTR SS:[EBP-4C],ESI
053A59B9 |. 8975 F8 MOV DWORD PTR SS:[EBP-8],ESI
053A59BC |. 0F8E EA000000 JLE EXERe.053A5AAC
053A59C2 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; 空间指针1
053A59C5 |. 8945 08 MOV DWORD PTR SS:[EBP+8],EAX
053A59C8 |> 8B45 08 /MOV EAX,DWORD PTR SS:[EBP+8] ; 循环修正 API 地址, 入口RVA在输出表中,指向另一DLL的某函数 ( "DLL2.API2" )
053A59CB |. 8B8D 24F5FFFF |MOV ECX,DWORD PTR SS:[EBP-ADC] ; Export table 的 RVA
053A59D1 |. 8B00 |MOV EAX,DWORD PTR DS:[EAX] ; API 相对地址
053A59D3 |. 3BC1 |CMP EAX,ECX
053A59D5 |. 0F8C BE000000 |JL EXERe.053A5A99 ; API 地址< Export 就不用处理
053A59DB |. 8B95 28F5FFFF |MOV EDX,DWORD PTR SS:[EBP-AD8] ; Export Table Size
053A59E1 |. 03D1 |ADD EDX,ECX
053A59E3 |. 3BC2 |CMP EAX,EDX
053A59E5 |. 0F83 AE000000 |JNB EXERe.053A5A99 ; API 地址>= Export+Size 也不用处理
053A59EB |. 8D8D 5CFEFFFF |LEA ECX,DWORD PTR SS:[EBP-1A4] ; 开始修正
053A59F1 |. 03C3 |ADD EAX,EBX
053A59F3 |. 85C9 |TEST ECX,ECX
053A59F5 |. 74 25 |JE SHORT EXERe.053A5A1C
053A59F7 |. 3BC6 |CMP EAX,ESI
053A59F9 |. 74 21 |JE SHORT EXERe.053A5A1C
053A59FB |. 8BC8 |MOV ECX,EAX
053A59FD |. 8D85 5CFEFFFF |LEA EAX,DWORD PTR SS:[EBP-1A4]
053A5A03 |. 33FF |XOR EDI,EDI
053A5A05 |. 2BC8 |SUB ECX,EAX
053A5A07 |> 8D843D 5CFEFF>|/LEA EAX,DWORD PTR SS:[EBP+EDI-1A4] ; 读入 API 地址所指的字符 256 byte
053A5A0E |. 47 ||INC EDI
053A5A0F |. 81FF 00010000 ||CMP EDI,100
053A5A15 |. 8A1401 ||MOV DL,BYTE PTR DS:[ECX+EAX]
053A5A18 |. 8810 ||MOV BYTE PTR DS:[EAX],DL
053A5A1A |.^ 72 EB |\JB SHORT EXERe.053A5A07
053A5A1C |> 33C0 |XOR EAX,EAX
053A5A1E |> 80BC05 5CFEFF>|/CMP BYTE PTR SS:[EBP+EAX-1A4],2E ; 找到 "."
053A5A26 |. 8945 F0 ||MOV DWORD PTR SS:[EBP-10],EAX
053A5A29 |. 74 0A ||JE SHORT EXERe.053A5A35
053A5A2B |. 3D 00010000 ||CMP EAX,100
053A5A30 |. 77 0B ||JA SHORT EXERe.053A5A3D
053A5A32 |. 40 ||INC EAX
053A5A33 |.^ EB E9 |\JMP SHORT EXERe.053A5A1E
053A5A35 |> 80A405 5CFEFF>|AND BYTE PTR SS:[EBP+EAX-1A4],0 ; "." 变成 0
053A5A3D |> 8D85 5CFEFFFF |LEA EAX,DWORD PTR SS:[EBP-1A4]
053A5A43 |. 50 |PUSH EAX
053A5A44 |. A1 7CA03B05 |MOV EAX,DWORD PTR DS:[53BA07C]
053A5A49 |. F7D0 |NOT EAX
053A5A4B |. FFD0 |CALL EAX ; GetModuleHandleA(DLL2)
053A5A4D |. 8BF8 |MOV EDI,EAX
053A5A4F |. 3BFE |CMP EDI,ESI
053A5A51 |. 75 15 |JNZ SHORT EXERe.053A5A68
053A5A53 |. 8D85 5CFEFFFF |LEA EAX,DWORD PTR SS:[EBP-1A4]
053A5A59 |. 50 |PUSH EAX
053A5A5A |. A1 84A03B05 |MOV EAX,DWORD PTR DS:[53BA084]
053A5A5F |. F7D0 |NOT EAX
053A5A61 |. FFD0 |CALL EAX ; LoadLibraryA
053A5A63 |. E8 3DFAFFFF |CALL EXERe.053A54A5 ; 修正 53B8C38-53B8C40 所指的 UniName 列表
053A5A68 |> 8B45 F0 |MOV EAX,DWORD PTR SS:[EBP-10]
053A5A6B |. 8D8405 5DFEFF>|LEA EAX,DWORD PTR SS:[EBP+EAX-1A3] ; 指向 API2
053A5A72 |. 50 |PUSH EAX
053A5A73 |. A1 B0A03B05 |MOV EAX,DWORD PTR DS:[53BA0B0]
053A5A78 |. 57 |PUSH EDI
053A5A79 |. F7D0 |NOT EAX
053A5A7B |. FFD0 |CALL EAX ; KERNEL32.GetProcAddress
053A5A7D |. 8B4D 08 |MOV ECX,DWORD PTR SS:[EBP+8] ; 已移动到的空间指针1
053A5A80 |. 2BC7 |SUB EAX,EDI ; DLL2 base
053A5A82 |. 897D C8 |MOV DWORD PTR SS:[EBP-38],EDI ; DLL2 base
053A5A85 |. 8901 |MOV DWORD PTR DS:[ECX],EAX
053A5A87 |. 8B45 F8 |MOV EAX,DWORD PTR SS:[EBP-8] ; 已处理的 API 个数
053A5A8A |. 8945 C4 |MOV DWORD PTR SS:[EBP-3C],EAX
053A5A8D |. 8D45 C4 |LEA EAX,DWORD PTR SS:[EBP-3C]
053A5A90 |. 50 |PUSH EAX
053A5A91 |. 8D4D AC |LEA ECX,DWORD PTR SS:[EBP-54] ; 70FF60
053A5A94 |. E8 09EFFFFF |CALL EXERe.053A49A2 ; 修正 70FF60-70FF68 所指的 dll2 列表 structure dll2 { dword apiorder; API 在 Dll1 中的序号
053A5A99 |> FF45 F8 |INC DWORD PTR SS:[EBP-8] dword dll2base; DLL2 基址 }
053A5A9C |. 8345 08 04 |ADD DWORD PTR SS:[EBP+8],4
053A5AA0 |. 8B45 F8 |MOV EAX,DWORD PTR SS:[EBP-8]
053A5AA3 |. 3B45 80 |CMP EAX,DWORD PTR SS:[EBP-80]
053A5AA6 |.^ 0F8C 1CFFFFFF \JL EXERe.053A59C8
053A5AAC |> 33FF XOR EDI,EDI ; 循环变量
053A5AAE |. 3975 80 CMP DWORD PTR SS:[EBP-80],ESI ; NumberOfFunctions > 0 ?
053A5AB1 |. 0F8E 86000000 JLE EXERe.053A5B3D
053A5AB7 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; 空间指针1
053A5ABA |. 8945 08 MOV DWORD PTR SS:[EBP+8],EAX
053A5ABD |> 8B45 08 /MOV EAX,DWORD PTR SS:[EBP+8]
053A5AC0 |. 3930 |CMP DWORD PTR DS:[EAX],ESI ; API RVA
053A5AC2 |. 74 6F |JE SHORT EXERe.053A5B33
053A5AC4 |. 834D F0 FF |OR DWORD PTR SS:[EBP-10],FFFFFFFF
053A5AC8 |. 33C0 |XOR EAX,EAX
053A5ACA |. 3975 84 |CMP DWORD PTR SS:[EBP-7C],ESI ; NumberOfNames > 0 ?
053A5ACD |. 7E 34 |JLE SHORT EXERe.053A5B03
053A5ACF |. 8B4D D8 |MOV ECX,DWORD PTR SS:[EBP-28] ; 空间指针2
053A5AD2 |> 0FBF11 |/MOVSX EDX,WORD PTR DS:[ECX] ; 循环找出 EDI
053A5AD5 |. 3BD7 ||CMP EDX,EDI
053A5AD7 |. 74 0A ||JE SHORT EXERe.053A5AE3
053A5AD9 |. 40 ||INC EAX
053A5ADA |. 41 ||INC ECX
053A5ADB |. 41 ||INC ECX
053A5ADC |. 3B45 84 ||CMP EAX,DWORD PTR SS:[EBP-7C]
053A5ADF |.^ 7C F1 |\JL SHORT EXERe.053A5AD2
053A5AE1 |. EB 20 |JMP SHORT EXERe.053A5B03 ; 到这里说明这个 API 没有名字, 直接去 053A5B03
053A5AE3 |> 3BC6 |CMP EAX,ESI
053A5AE5 |. 8945 F0 |MOV DWORD PTR SS:[EBP-10],EAX ; AddressOfNameOrdinals 中第 EAX 个为 AddressOfFunctions 中第 EDI 个
053A5AE8 |. 7C 19 |JL SHORT EXERe.053A5B03
053A5AEA |. C1E0 08 |SHL EAX,8 ; * 256
053A5AED |. 0345 DC |ADD EAX,DWORD PTR SS:[EBP-24] ; 空间指针3
053A5AF0 |. 56 |PUSH ESI
053A5AF1 |. 50 |PUSH EAX
053A5AF2 |. E8 B0EBFFFF |CALL EXERe.053A46A7 ; uppercase
053A5AF7 |. 59 |POP ECX
053A5AF8 |. 50 |PUSH EAX
053A5AF9 |. E8 0B1A0000 |CALL EXERe.053A7509 ; Hash 变换
053A5AFE |. 59 |POP ECX
053A5AFF |. 8945 9C |MOV DWORD PTR SS:[EBP-64],EAX ; API Name Hash
053A5B02 |. 59 |POP ECX
053A5B03 |> 8B85 7CFFFFFF |MOV EAX,DWORD PTR SS:[EBP-84] ; Export Table 中的 base
053A5B09 |. 6A 04 |PUSH 4 ; Hash 变换只取 4 字节
053A5B0B |. 03C7 |ADD EAX,EDI ; API 对外的 Ordinal
053A5B0D |. 8945 E0 |MOV DWORD PTR SS:[EBP-20],EAX
053A5B10 |. 8D45 E0 |LEA EAX,DWORD PTR SS:[EBP-20]
053A5B13 |. 50 |PUSH EAX
053A5B14 |. E8 F0190000 |CALL EXERe.053A7509 ; 对 Ordinal 做 Hash 变换
053A5B19 |. 8945 98 |MOV DWORD PTR SS:[EBP-68],EAX ; API Ordinal Hash
053A5B1C |. 8B45 F0 |MOV EAX,DWORD PTR SS:[EBP-10] ;
053A5B1F |. 59 |POP ECX
053A5B20 |. 8945 A0 |MOV DWORD PTR SS:[EBP-60],EAX
053A5B23 |. 59 |POP ECX
053A5B24 |. 8D45 94 |LEA EAX,DWORD PTR SS:[EBP-6C]
053A5B27 |. 50 |PUSH EAX
053A5B28 |. 8D4D B8 |LEA ECX,DWORD PTR SS:[EBP-48] ; 70FF6C
053A5B2B |. 897D 94 |MOV DWORD PTR SS:[EBP-6C],EDI
053A5B2E |. E8 31030000 |CALL EXERe.053A5E64 ; 修正 70FF6C-70FF74 所指的 NameOrdinalHash 列表
053A5B33 |> 8345 08 04 |ADD DWORD PTR SS:[EBP+8],4
053A5B37 |. 47 |INC EDI
053A5B38 |. 3B7D 80 |CMP EDI,DWORD PTR SS:[EBP-80]
053A5B3B |.^ 7C 80 \JL SHORT EXERe.053A5ABD
structure NameOrdinalHash
{
dword order_in_AddressofFunctions;
dword OrdinalHash;
dword NameHash;
dword order_in_AddressofNameOrdinal;
}
053A5B3D |> A1 A0A03B05 /MOV EAX,DWORD PTR DS:[53BA0A0] ; 都处理好了, 开始等待主线程的命令
053A5B42 |. 6A 02 |PUSH 2
053A5B44 |. F7D0 |NOT EAX
053A5B46 |. FFD0 |CALL EAX ; Sleep(2ms)
053A5B48 |. 803D 308C3B05>|CMP BYTE PTR DS:[53B8C30],0 ; 程序结束命令送到这
053A5B4F |. 0F85 E1010000 |JNZ EXERe.053A5D36
053A5B55 |. A1 94A03B05 |MOV EAX,DWORD PTR DS:[53BA094] ; 程序没结束
053A5B5A |. F7D0 |NOT EAX
053A5B5C |. FFD0 |CALL EAX ; GetTickCount
053A5B5E |. 8B0D E0A03B05 |MOV ECX,DWORD PTR DS:[53BA0E0] ; 053C0087 做的时间标志
053A5B64 |. BF E8030000 |MOV EDI,3E8 ; 1000
053A5B69 |. 2BC1 |SUB EAX,ECX ; 时间差
053A5B6B |. 99 |CDQ
053A5B6C |. F7FF |IDIV EDI
053A5B6E |. 33D2 |XOR EDX,EDX
053A5B70 |. 8BF8 |MOV EDI,EAX ; 过了几秒
053A5B72 |. 8BC1 |MOV EAX,ECX
053A5B74 |. B9 2C010000 |MOV ECX,12C ; 300
053A5B79 |. F7F1 |DIV ECX
053A5B7B |. 03D1 |ADD EDX,ECX
053A5B7D |. 3BFA |CMP EDI,EDX ; 唯一的一个 Anti
053A5B7F |. 7E 0C |JLE SHORT EXERe.053A5B8D ; 改成 JMP ***************************************************************************************
053A5B81 |. A1 A8A03B05 |MOV EAX,DWORD PTR DS:[53BA0A8]
053A5B86 |. 56 |PUSH ESI
053A5B87 |. 6A FF |PUSH -1
053A5B89 |. F7D0 |NOT EAX
053A5B8B |. FFD0 |CALL EAX ; TerminateProcess
053A5B8D |> A1 508C3B05 |MOV EAX,DWORD PTR DS:[53B8C50] ; 主线程的命令送到这
053A5B92 |. 3BC6 |CMP EAX,ESI
053A5B94 |.^ 7E A7 |JLE SHORT EXERe.053A5B3D
053A5B96 |. 8975 F0 |MOV DWORD PTR SS:[EBP-10],ESI
053A5B99 |. 8945 E0 |MOV DWORD PTR SS:[EBP-20],EAX ; 队列中需要处理的 API 个数
053A5B9C |> A1 488C3B05 |/MOV EAX,DWORD PTR DS:[53B8C48] ; 开始地址
053A5BA1 |. 8B4D F0 ||MOV ECX,DWORD PTR SS:[EBP-10] ; 已处理过
053A5BA4 |. 03C1 ||ADD EAX,ECX
053A5BA6 |. 8B4D A8 ||MOV ECX,DWORD PTR SS:[EBP-58] ; Dll Name Hash(线程的局部变量)
053A5BA9 |. 8945 F8 ||MOV DWORD PTR SS:[EBP-8],EAX
053A5BAC |. 3908 ||CMP DWORD PTR DS:[EAX],ECX ; 不相等说明不是本 DLL 的, 队列中下一个API
053A5BAE |. 0F85 6E010000 ||JNZ EXERe.053A5D22
053A5BB4 |. 8065 0B 00 ||AND BYTE PTR SS:[EBP+B],0
053A5BB8 |. 8B40 08 ||MOV EAX,DWORD PTR DS:[EAX+8] ; 0 或 API Address
053A5BBB |. 8B55 C0 ||MOV EDX,DWORD PTR SS:[EBP-40] ; NameOrdinalHash 列表中个数
053A5BBE |. 8BF0 ||MOV ESI,EAX
053A5BC0 |. B9 000000F0 ||MOV ECX,F0000000
053A5BC5 |. 8955 C8 ||MOV DWORD PTR SS:[EBP-38],EDX
053A5BC8 |. 23F1 ||AND ESI,ECX
053A5BCA |. 3BF1 ||CMP ESI,ECX
053A5BCC |. 74 08 ||JE SHORT EXERe.053A5BD6 ; Fxxxxxxx 重新来过
053A5BCE |. 85C0 ||TEST EAX,EAX ; 0 or API address
053A5BD0 |. 0F85 4C010000 ||JNZ EXERe.053A5D22 ; 不等于0 的话就跳过
053A5BD6 |> 8365 EC 00 ||AND DWORD PTR SS:[EBP-14],0
053A5BDA |. 85D2 ||TEST EDX,EDX
053A5BDC |. 0F8E 40010000 ||JLE EXERe.053A5D22
053A5BE2 |> 8B45 EC ||/MOV EAX,DWORD PTR SS:[EBP-14]
053A5BE5 |. 8365 E8 00 |||AND DWORD PTR SS:[EBP-18],0 ; 0, 1 两种情况
053A5BE9 |. C1E0 04 |||SHL EAX,4
053A5BEC |. 8945 A4 |||MOV DWORD PTR SS:[EBP-5C],EAX
053A5BEF |> 8B45 B8 |||/MOV EAX,DWORD PTR SS:[EBP-48] ; NameOrdianlHash 列表开始地址
053A5BF2 |. 8B4D A4 ||||MOV ECX,DWORD PTR SS:[EBP-5C]
053A5BF5 |. 8DBD 5CFFFFFF ||||LEA EDI,DWORD PTR SS:[EBP-A4]
053A5BFB |. 8D3401 ||||LEA ESI,DWORD PTR DS:[ECX+EAX]
053A5BFE |. 8B45 E8 ||||MOV EAX,DWORD PTR SS:[EBP-18]
053A5C01 |. A5 ||||MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
053A5C02 |. A5 ||||MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
053A5C03 |. A5 ||||MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
053A5C04 |. 83E8 00 ||||SUB EAX,0 ; Switch (cases 0..1)
053A5C07 |. A5 ||||MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
053A5C08 |. 74 0B ||||JE SHORT EXERe.053A5C15
053A5C0A |. 48 ||||DEC EAX
053A5C0B |. 75 11 ||||JNZ SHORT EXERe.053A5C1E
053A5C0D |. 8B85 60FFFFFF ||||MOV EAX,DWORD PTR SS:[EBP-A0] ; Case 1 of switch 053A5C04, 对应 OridnalHash, 没有名字
053A5C13 |. EB 06 ||||JMP SHORT EXERe.053A5C1B
053A5C15 |> 8B85 64FFFFFF ||||MOV EAX,DWORD PTR SS:[EBP-9C] ; Case 0 of switch 053A5C04, 对应 NameHash
053A5C1B |> 8945 D4 ||||MOV DWORD PTR SS:[EBP-2C],EAX
053A5C1E |> 8B55 B4 ||||MOV EDX,DWORD PTR SS:[EBP-4C] ; Default case of switch 053A5C04, 是否是指向另一 DLL 的API
053A5C21 |. 8065 FF 00 ||||AND BYTE PTR SS:[EBP-1],0
053A5C25 |. 8365 E4 00 ||||AND DWORD PTR SS:[EBP-1C],0
053A5C29 |. 8B85 5CFFFFFF ||||MOV EAX,DWORD PTR SS:[EBP-A4]
053A5C2F |. 85D2 ||||TEST EDX,EDX
053A5C31 |. 7E 20 ||||JLE SHORT EXERe.053A5C53
053A5C33 |. 8B4D AC ||||MOV ECX,DWORD PTR SS:[EBP-54]
053A5C36 |> 8B31 ||||/MOV ESI,DWORD PTR DS:[ECX]
053A5C38 |. 8B79 04 |||||MOV EDI,DWORD PTR DS:[ECX+4]
053A5C3B |. 3BF0 |||||CMP ESI,EAX
053A5C3D |. 897D A0 |||||MOV DWORD PTR SS:[EBP-60],EDI ; 另一 DLL 的 BaseAddress
053A5C40 |. 74 0D |||||JE SHORT EXERe.053A5C4F
053A5C42 |. FF45 E4 |||||INC DWORD PTR SS:[EBP-1C]
053A5C45 |. 83C1 08 |||||ADD ECX,8
053A5C48 |. 3955 E4 |||||CMP DWORD PTR SS:[EBP-1C],EDX
053A5C4B |.^ 7C E9 ||||\JL SHORT EXERe.053A5C36
053A5C4D |. EB 04 ||||JMP SHORT EXERe.053A5C53
053A5C4F |> C645 FF 01 ||||MOV BYTE PTR SS:[EBP-1],1 ; 指向另一 DLL 的标志
053A5C53 |> 8B7D F8 ||||MOV EDI,DWORD PTR SS:[EBP-8]
053A5C56 |. 8B4F 04 ||||MOV ECX,DWORD PTR DS:[EDI+4] ; 队列中 API Hash
053A5C59 |. 3B4D D4 ||||CMP ECX,DWORD PTR SS:[EBP-2C] ; 运气非常好,第一个就成功?
053A5C5C |. 894D CC ||||MOV DWORD PTR SS:[EBP-34],ECX
053A5C5F |. 75 55 ||||JNZ SHORT EXERe.053A5CB6
053A5C61 |. 8365 D0 00 ||||AND DWORD PTR SS:[EBP-30],0
053A5C65 |. 83BD 3CFEFFFF>||||CMP DWORD PTR SS:[EBP-1C4],0
053A5C6C |. 0F8E 91000000 ||||JLE EXERe.053A5D03
053A5C72 |. 8B75 F4 ||||MOV ESI,DWORD PTR SS:[EBP-C]
053A5C75 |. 8D95 74FDFFFF ||||LEA EDX,DWORD PTR SS:[EBP-28C]
053A5C7B |. 8D8D B0F5FFFF ||||LEA ECX,DWORD PTR SS:[EBP-A50]
053A5C81 |. 8955 E4 ||||MOV DWORD PTR SS:[EBP-1C],EDX
053A5C84 |> 8B55 E4 ||||/MOV EDX,DWORD PTR SS:[EBP-1C]
053A5C87 |. 833A 00 |||||CMP DWORD PTR DS:[EDX],0
053A5C8A |. 74 13 |||||JE SHORT EXERe.053A5C9F
053A5C8C |. 8B3C86 |||||MOV EDI,DWORD PTR DS:[ESI+EAX*4]
053A5C8F |. 8B11 |||||MOV EDX,DWORD PTR DS:[ECX]
053A5C91 |. 3BFA |||||CMP EDI,EDX
053A5C93 |. 72 0A |||||JB SHORT EXERe.053A5C9F
053A5C95 |. 8B79 FC |||||MOV EDI,DWORD PTR DS:[ECX-4]
053A5C98 |. 03FA |||||ADD EDI,EDX
053A5C9A |. 393C86 |||||CMP DWORD PTR DS:[ESI+EAX*4],EDI
053A5C9D |. 72 17 |||||JB SHORT EXERe.053A5CB6
053A5C9F |> FF45 D0 |||||INC DWORD PTR SS:[EBP-30]
053A5CA2 |. 8345 E4 04 |||||ADD DWORD PTR SS:[EBP-1C],4
053A5CA6 |. 8B55 D0 |||||MOV EDX,DWORD PTR SS:[EBP-30]
053A5CA9 |. 83C1 28 |||||ADD ECX,28
053A5CAC |. 3B95 3CFEFFFF |||||CMP EDX,DWORD PTR SS:[EBP-1C4]
053A5CB2 |. 7D 54 |||||JGE SHORT EXERe.053A5D08
053A5CB4 |.^ EB CE ||||\JMP SHORT EXERe.053A5C84
053A5CB6 |> 807D FF 00 ||||CMP BYTE PTR SS:[EBP-1],0 ;是否指向另一 DLL 的标志
053A5CBA |. 8D4D 0B ||||LEA ECX,DWORD PTR SS:[EBP+B]
053A5CBD |. 51 ||||PUSH ECX ; Arg5 返回是否 stolen 成功的标志
053A5CBE |. 8B4D F4 ||||MOV ECX,DWORD PTR SS:[EBP-C]
053A5CC1 |. FF3481 ||||PUSH DWORD PTR DS:[ECX+EAX*4] ; Arg4
053A5CC4 |. 74 05 ||||JE SHORT EXERe.053A5CCB
053A5CC6 |. FF75 A0 ||||PUSH DWORD PTR SS:[EBP-60] ; Arg3( Dll2 base)
053A5CC9 |. EB 01 ||||JMP SHORT EXERe.053A5CCC
053A5CCB |> 53 ||||PUSH EBX Arg3( DLL1 base)
053A5CCC |> FF75 D4 ||||PUSH DWORD PTR SS:[EBP-2C] ; |Arg2
053A5CCF |. FF75 CC ||||PUSH DWORD PTR SS:[EBP-34] ; |Arg1
053A5CD2 |. E8 B0000000 ||||CALL EXERe.053A5D87 ; \EXERe.053A5D87
053A5CD7 |. 8B4D F8 ||||MOV ECX,DWORD PTR SS:[EBP-8]
053A5CDA |. 83C4 14 ||||ADD ESP,14
053A5CDD |. 8941 08 ||||MOV DWORD PTR DS:[ECX+8],EAX ; 为主线程返回 API 地址
053A5CE0 |. 807D 0B 00 ||||CMP BYTE PTR SS:[EBP+B],0 ; 是否 Stolen 成功
053A5CE4 |. 75 3C ||||JNZ SHORT EXERe.053A5D22
053A5CE6 |. FF45 E8 ||||INC DWORD PTR SS:[EBP-18]
053A5CE9 |. 837D E8 02 ||||CMP DWORD PTR SS:[EBP-18],2
053A5CED |.^ 0F8C FCFEFFFF |||\JL EXERe.053A5BEF
053A5CF3 |. FF45 EC |||INC DWORD PTR SS:[EBP-14]
053A5CF6 |. 8B45 EC |||MOV EAX,DWORD PTR SS:[EBP-14]
053A5CF9 |. 3B45 C8 |||CMP EAX,DWORD PTR SS:[EBP-38]
053A5CFC |. 7D 24 |||JGE SHORT EXERe.053A5D22
053A5CFE |.^ E9 DFFEFFFF ||\JMP EXERe.053A5BE2
053A5D03 |> 8B75 F4 ||MOV ESI,DWORD PTR SS:[EBP-C]
053A5D06 |. EB 03 ||JMP SHORT EXERe.053A5D0B
053A5D08 |> 8B7D F8 ||MOV EDI,DWORD PTR SS:[EBP-8]
053A5D0B |> 807D FF 00 ||CMP BYTE PTR SS:[EBP-1],0
053A5D0F |. 8B0486 ||MOV EAX,DWORD PTR DS:[ESI+EAX*4]
053A5D12 |. 74 05 ||JE SHORT EXERe.053A5D19
053A5D14 |. 0345 A0 ||ADD EAX,DWORD PTR SS:[EBP-60]
053A5D17 |. EB 02 ||JMP SHORT EXERe.053A5D1B
053A5D19 |> 03C3 ||ADD EAX,EBX
053A5D1B |> 8947 08 ||MOV DWORD PTR DS:[EDI+8],EAX
053A5D1E |. C645 0B 01 ||MOV BYTE PTR SS:[EBP+B],1
053A5D22 |> 8345 F0 0C ||ADD DWORD PTR SS:[EBP-10],0C
053A5D26 |. FF4D E0 ||DEC DWORD PTR SS:[EBP-20]
053A5D29 |.^ 0F85 6DFEFFFF |\JNZ EXERe.053A5B9C
053A5D2F |. 33F6 |XOR ESI,ESI
053A5D31 |.^ E9 07FEFFFF \JMP EXERe.053A5B3D
053A5D36 |> 3975 F4 CMP DWORD PTR SS:[EBP-C],ESI
053A5D39 |. 74 13 JE SHORT EXERe.053A5D4E
053A5D3B |. FF75 F4 PUSH DWORD PTR SS:[EBP-C] ; 空间指针1
053A5D3E |. A1 90A03B05 MOV EAX,DWORD PTR DS:[53BA090]
053A5D43 |. F7D0 NOT EAX
053A5D45 |. 56 PUSH ESI
053A5D46 |. FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053A5D4C |. FFD0 CALL EAX ; HeapFree
053A5D4E |> 3975 D8 CMP DWORD PTR SS:[EBP-28],ESI
053A5D51 |. 74 13 JE SHORT EXERe.053A5D66
053A5D53 |. FF75 D8 PUSH DWORD PTR SS:[EBP-28] ; 空间指针2
053A5D56 |. A1 90A03B05 MOV EAX,DWORD PTR DS:[53BA090]
053A5D5B |. F7D0 NOT EAX
053A5D5D |. 56 PUSH ESI
053A5D5E |. FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053A5D64 |. FFD0 CALL EAX ; HeapFree
053A5D66 |> 3975 DC CMP DWORD PTR SS:[EBP-24],ESI
053A5D69 |. 74 13 JE SHORT EXERe.053A5D7E
053A5D6B |. FF75 DC PUSH DWORD PTR SS:[EBP-24] ; 空间指针3
053A5D6E |. A1 90A03B05 MOV EAX,DWORD PTR DS:[53BA090]
053A5D73 |. F7D0 NOT EAX
053A5D75 |. 56 PUSH ESI
053A5D76 |. FF35 D4A03B05 PUSH DWORD PTR DS:[53BA0D4]
053A5D7C |. FFD0 CALL EAX ; HeapFree
053A5D7E |> 5F POP EDI
053A5D7F |. 5E POP ESI
053A5D80 |. 33C0 XOR EAX,EAX
053A5D82 |. 5B POP EBX
053A5D83 |. C9 LEAVE
053A5D84 \. C2 0400 RETN 4
Proc 53A5D87(arg1, arg2, arg3, arg4, arg5)
arg1 = 要求的API Hash
arg2 = NameOrdinalHash 列表中 API Hash
arg3 = DLL BASE
arg4 = NameOrdinalHash 列表中 API address RVA
arg5 = pDword, 返回是否成功的标志
053A5D87 /$ 55 PUSH EBP
053A5D88 |. 8BEC MOV EBP,ESP
053A5D8A |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
053A5D8D |. 3B45 0C CMP EAX,DWORD PTR SS:[EBP+C]
053A5D90 |. 75 2D JNZ SHORT EXERe.053A5DBF
053A5D92 |. 8B4D 14 MOV ECX,DWORD PTR SS:[EBP+14]
053A5D95 |. 8D45 08 LEA EAX,DWORD PTR SS:[EBP+8]
053A5D98 |. 8365 08 00 AND DWORD PTR SS:[EBP+8],0
053A5D9C |. 6A 00 PUSH 0
053A5D9E |. 50 PUSH EAX
053A5D9F |. 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
053A5DA2 |. 03C8 ADD ECX,EAX
053A5DA4 |. 51 PUSH ECX
053A5DA5 |. 50 PUSH EAX
053A5DA6 |. E8 81B2FFFF CALL EXERe.053A102C ; 偷 API 的 CALL
053A5DAB |. 8B4D 18 MOV ECX,DWORD PTR SS:[EBP+18]
053A5DAE |. 83C4 10 ADD ESP,10
053A5DB1 |. 837D 08 00 CMP DWORD PTR SS:[EBP+8],0 ; StolenSize>0 ?
053A5DB5 |. C601 01 MOV BYTE PTR DS:[ECX],1
053A5DB8 |. 75 12 JNZ SHORT EXERe.053A5DCC
053A5DBA |. 8021 00 AND BYTE PTR DS:[ECX],0
053A5DBD |. 5D POP EBP
053A5DBE |. C3 RETN
053A5DBF |> 8B45 14 MOV EAX,DWORD PTR SS:[EBP+14]
053A5DC2 |. 8B4D 10 MOV ECX,DWORD PTR SS:[EBP+10]
053A5DC5 |. 03C1 ADD EAX,ECX
053A5DC7 |. 0D 000000F0 OR EAX,F0000000
053A5DCC |> 5D POP EBP
053A5DCD \. C3 RETN
053A5776 /. 55 PUSH EBP
053A5777 |. 8BEC MOV EBP,ESP
053A5779 |. 81EC 540A0000 SUB ESP,0A54
053A577F |. A1 A0A03B05 MOV EAX,DWORD PTR DS:[53BA0A0]
053A5784 |. F7D0 NOT EAX
053A5786 |. 85C0 TEST EAX,EAX
053A5788 |. 0F84 AC000000 JE EXERe.053A583A
053A578E |. 68 60EA0000 PUSH 0EA60
053A5793 |. FFD0 CALL EAX ; Sleep (60s)
053A5795 |> A1 A0A03B05 /MOV EAX,DWORD PTR DS:[53BA0A0]
053A579A |. 6A 02 |PUSH 2
053A579C |. F7D0 |NOT EAX
053A579E |. FFD0 |CALL EAX
053A57A0 |. E8 09FFFFFF |CALL EXERe.053A56AE ; 判断 User32 是否已加载
053A57A5 |. 85C0 |TEST EAX,EAX
053A57A7 |.^ 74 EC \JE SHORT EXERe.053A5795 ; 未加载, 等待 2 ms
053A57A9 |. 8D8D ACF5FFFF LEA ECX,DWORD PTR SS:[EBP-A54]
053A57AF |. E8 A9CAFFFF CALL EXERe.053A225D ; zero buffer
053A57B4 |. E8 F5FEFFFF CALL EXERe.053A56AE ; 取 user32 base address
053A57B9 |. F7D0 NOT EAX
053A57BB |. 50 PUSH EAX ; /Arg1
053A57BC |. 8D8D ACF5FFFF LEA ECX,DWORD PTR SS:[EBP-A54] ; |
053A57C2 |. E8 09100000 CALL EXERe.053A67D0 ; \EXERe.053A67D0 ( 分析区块信息)
053A57C7 |. 85C0 TEST EAX,EAX
053A57C9 |. 74 6F JE SHORT EXERe.053A583A
053A57CB |. 68 50083B05 PUSH EXERe.053B0850 ; /Arg1 = 053B0850
053A57D0 |. 8D8D ACF5FFFF LEA ECX,DWORD PTR SS:[EBP-A54] ; |
053A57D6 |. E8 3C180000 CALL EXERe.053A7017 ; \EXERe.053A7017 ( Stolen MessageBoxExW)
053A57DB |. 85C0 TEST EAX,EAX
053A57DD |. A3 8CA03B05 MOV DWORD PTR DS:[53BA08C],EAX
053A57E2 |. 74 56 JE SHORT EXERe.053A583A
053A57E4 |. 56 PUSH ESI
053A57E5 |. 57 PUSH EDI
053A57E6 |. 8D4D FC LEA ECX,DWORD PTR SS:[EBP-4]
053A57E9 |. 6A 00 PUSH 0
053A57EB |. F7D0 NOT EAX
053A57ED |. 51 PUSH ECX
053A57EE |. 50 PUSH EAX
053A57EF |. 8B45 8C MOV EAX,DWORD PTR SS:[EBP-74]
053A57F2 |. F7D0 NOT EAX
053A57F4 |. 50 PUSH EAX
053A57F5 |. E8 32B8FFFF CALL EXERe.053A102C
053A57FA |. 83C4 10 ADD ESP,10
053A57FD |. BE 9CCF3A05 MOV ESI,EXERe.053ACF9C
053A5802 |. 8D7D 9C LEA EDI,DWORD PTR SS:[EBP-64]
053A5805 |. 6A 0C PUSH 0C
053A5807 |. 59 POP ECX
053A5808 |. F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS> ; 提示信息
053A580A |. 66:A5 MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]
053A580C |. 6A 0A PUSH 0A
053A580E |. BE 70CF3A05 MOV ESI,EXERe.053ACF70
053A5813 |. 59 POP ECX
053A5814 |. 8D7D D0 LEA EDI,DWORD PTR SS:[EBP-30]
053A5817 |. F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS> ; 提示信息
053A5819 |. F7D0 NOT EAX
053A581B |. 66:A5 MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]
053A581D |. 5F POP EDI
053A581E |. A3 8CA03B05 MOV DWORD PTR DS:[53BA08C],EAX
053A5823 |. 85C0 TEST EAX,EAX
053A5825 |. 5E POP ESI
053A5826 |. 74 12 JE SHORT EXERe.053A583A
053A5828 |. 6A 00 PUSH 0
053A582A |. 8D4D D2 LEA ECX,DWORD PTR SS:[EBP-2E]
053A582D |. 6A 00 PUSH 0
053A582F |. 51 PUSH ECX
053A5830 |. 8D4D 9E LEA ECX,DWORD PTR SS:[EBP-62]
053A5833 |. 51 PUSH ECX
053A5834 |. 6A 00 PUSH 0
053A5836 |. F7D0 NOT EAX
053A5838 |. FFD0 CALL EAX ; 显示未注册
053A583A |> 33C0 XOR EAX,EAX
053A583C |. C9 LEAVE
053A583D \. C2 0400 RETN 4
十六. 壳处理好的资源, 没有好的办法自动变成标准格式, 我是手动建立的.
053B8C68 00 00 00 00
053B8C6C 00 00 00 00
053B8C70 C8 BB 15 00 ;Rsrc1 结构队列开始地址
053B8C74 2C BC 15 00 ;Rsrc1 结构队列结束地址
053B8C78 19 00 00 00 ;Rsrc1 结构队列个数
Structure Rsrc1
{
Rsrc2* address;
}
Structure Rsrc2
{
dword ResType; ; 如果 ResType=-1, 名字导入,
byte dup 208h (0); ; 名字在这里
dword ResID;
dword ??
dword ??
dword size;
dword 0;
dword 0;
dword RsrcAddress;
}
壳用下面的函数来找资源
proc53A6437(ResType, ResID, pSize)
ret = 地址
053A6437 /$ 55 PUSH EBP
053A6438 |. 8BEC MOV EBP,ESP
053A643A |. 51 PUSH ECX
053A643B |. 51 PUSH ECX
053A643C |. A1 788C3B05 MOV EAX,DWORD PTR DS:[53B8C78] ; Rsrc 个数
053A6441 |. 53 PUSH EBX
053A6442 |. 33DB XOR EBX,EBX
053A6444 |. 56 PUSH ESI
053A6445 |. 3BC3 CMP EAX,EBX
053A6447 |. 57 PUSH EDI
053A6448 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
053A644B |. 895D FC MOV DWORD PTR SS:[EBP-4],EBX ; 结果先清 0
053A644E |. 0F8E A7000000 JLE EXERe.053A64FB
053A6454 |. 83CF FF OR EDI,FFFFFFFF ; EDI = -1
053A6457 |> A1 708C3B05 /MOV EAX,DWORD PTR DS:[53B8C70]
053A645C |. 8B3498 |MOV ESI,DWORD PTR DS:[EAX+EBX*4] ; ESI 每一块资源的地址
053A645F |. 8B06 |MOV EAX,DWORD PTR DS:[ESI] ; EAX 表示 资源Type
053A6461 |. 3BC7 |CMP EAX,EDI
053A6463 |. 74 18 |JE SHORT EXERe.053A647D ; [ESI] == -1 ? 053A647D : 053A6465
053A6465 |. 8B8E 0C020000 |MOV ECX,DWORD PTR DS:[ESI+20C] ; ECX 表示 资源ID
053A646B |. 3BCF |CMP ECX,EDI
053A646D |. 74 0A |JE SHORT EXERe.053A6479 ; [ESI + 20c] == -1 ?
053A646F |. 3B45 08 |CMP EAX,DWORD PTR SS:[EBP+8] ; EAX == ResType?
053A6472 |. 75 67 |JNZ SHORT EXERe.053A64DB
053A6474 |. 3B4D 0C |CMP ECX,DWORD PTR SS:[EBP+C] ; ECX == ResID?
053A6477 |. EB 60 |JMP SHORT EXERe.053A64D9
053A6479 |> 3BC7 |CMP EAX,EDI
053A647B |. 75 1E |JNZ SHORT EXERe.053A649B
053A647D |> 8B8E 0C020000 |MOV ECX,DWORD PTR DS:[ESI+20C] ; ECX 表示 资源ID
053A6483 |. 3BCF |CMP ECX,EDI
053A6485 |. 74 10 |JE SHORT EXERe.053A6497 ; [ESI + 20c] == -1 ?
053A6487 |. 3B4D 0C |CMP ECX,DWORD PTR SS:[EBP+C] ; == ResID?
053A648A |. 75 4F |JNZ SHORT EXERe.053A64DB
053A648C |. FF75 08 |PUSH DWORD PTR SS:[EBP+8] ; ResType
053A648F |. 8D86 0C010000 |LEA EAX,DWORD PTR DS:[ESI+10C] ; [ESI + 10c]
053A6495 |. EB 38 |JMP SHORT EXERe.053A64CF
053A6497 |> 3BC7 |CMP EAX,EDI
053A6499 |. 74 11 |JE SHORT EXERe.053A64AC
053A649B |> 39BE 0C020000 |CMP DWORD PTR DS:[ESI+20C],EDI
053A64A1 |. 75 05 |JNZ SHORT EXERe.053A64A8
053A64A3 |. 3B45 08 |CMP EAX,DWORD PTR SS:[EBP+8] ; == ResType?
053A64A6 |. EB 1F |JMP SHORT EXERe.053A64C7
053A64A8 |> 3BC7 |CMP EAX,EDI
053A64AA |. 75 2F |JNZ SHORT EXERe.053A64DB
053A64AC |> 39BE 0C020000 |CMP DWORD PTR DS:[ESI+20C],EDI
053A64B2 |. 75 27 |JNZ SHORT EXERe.053A64DB
053A64B4 |. FF75 08 |PUSH DWORD PTR SS:[EBP+8] ; == ResType?
053A64B7 |. 8D86 0C010000 |LEA EAX,DWORD PTR DS:[ESI+10C]
053A64BD |. 50 |PUSH EAX
053A64BE |. E8 42000000 |CALL EXERe.053A6505
053A64C3 |. 59 |POP ECX
053A64C4 |. 59 |POP ECX
053A64C5 |. 85C0 |TEST EAX,EAX
053A64C7 |> 75 12 |JNZ SHORT EXERe.053A64DB
053A64C9 |. FF75 0C |PUSH DWORD PTR SS:[EBP+C] ; == ResID/16+1
053A64CC |. 8D46 0C |LEA EAX,DWORD PTR DS:[ESI+C]
053A64CF |> 50 |PUSH EAX
053A64D0 |. E8 30000000 |CALL EXERe.053A6505
053A64D5 |. 59 |POP ECX
053A64D6 |. 59 |POP ECX
053A64D7 |. 85C0 |TEST EAX,EAX
053A64D9 |> 74 0C |JE SHORT EXERe.053A64E7 ; 如果相等就找到了
053A64DB |> 43 |INC EBX ; 到下一块去找
053A64DC |. 3B5D F8 |CMP EBX,DWORD PTR SS:[EBP-8] ; 是否最后一块了?
053A64DF |.^ 0F8C 72FFFFFF \JL EXERe.053A6457
053A64E5 |. EB 14 JMP SHORT EXERe.053A64FB ; 资源找不到, 到这里
053A64E7 |> 8B4D 10 MOV ECX,DWORD PTR SS:[EBP+10]
053A64EA |. 8B86 18020000 MOV EAX,DWORD PTR DS:[ESI+218] ; size
053A64F0 |. 8901 MOV DWORD PTR DS:[ECX],EAX
053A64F2 |. 8B86 24020000 MOV EAX,DWORD PTR DS:[ESI+224]
053A64F8 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX ; 资源数据的地址
053A64FB |> 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
053A64FE |. 5F POP EDI
053A64FF |. 5E POP ESI
053A6500 |. 5B POP EBX
053A6501 |. C9 LEAVE
053A6502 \. C2 0C00 RETN 0C
[课程]FART 脱壳王!加量不加价!FART作者讲授!