首先用文件监视工具,看执行 php cklic.php 调用了哪些文件。
php.exe => php5ts.dll => php.ini => ZendExtensionManager.dll => ZendOptimizer.dll 然后生成了
C:\Documents and Settings\Administrator\Local Settings\Temp\ZendOptimizer.MemoryBase@Administrator@193488477 内容是 01600000,
然后读入了授权文件 zyiis.zl, 最后打开了 cklic.php 。
---------------------
od载入php.exe,文件名作为参数,在 CreateFileW 下断点。断下后,观察参数是zyiis.zl时,多次ctrl+F9,回到了 ZendOptimizer 里读取 zyiis.zl 的代码位置:(下次要快速到达此位置:od载入,停在EP,然后打勾 break on new module load,显示载入 ZendOptimizer.dll 就可ctrl+G到代码地址了)
01536037 68 30875C01 PUSH 015C8730 ; ASCII "rb"
0153603C 50 PUSH EAX
0153603D 896C24 18 MOV DWORD PTR SS:[ESP+18], EBP
01536041 896C24 1C MOV DWORD PTR SS:[ESP+1C], EBP
01536045 FF15 A8015B01 CALL NEAR DWORD PTR DS:[<&MSVCRT.fopen>] // 调用了 CreateFileW
然后就是一行行读取,每读到一行,先判断是否 Host-ID 行:
0153626B 55 PUSH EBP
0153626C 53 PUSH EBX
0153626D 68 FC865C01 PUSH 015C86FC ; ASCII "Host-ID"
01536272 FFD7 CALL NEAR EDI ; msvcrt.strncmp
01536279 /75 75 JNZ SHORT 015362F0 // 判断读到的是否 Host-ID, 不是就跳
然后再判断是否 Verification-Code 行:
015362F2 68 E8865C01 PUSH 015C86E8 ; ASCII "Verification-Code"
015362F7 FFD7 CALL NEAR EDI ; msvcrt.strncmp
015362FE /0F85 C8000000 JNZ 015363CC // 判断读到的是否 Verification-Code, 不是就跳
如果不是上面2个,就执行一次:
call _zend_hash_add_or_update
00C0E678 00C0E6B4 ASCII "Registered-To" // 参数1 key
00C0E67C 0000000D // 参数2 key长度
00C0E680 00C0E6C4 ASCII "www.ad8.cc" // 参数3 值
00C0E684 0000000B // 参数4 值长度
重点看读到 Verification-Code 怎么处理,先判断长度是否 3Dh,然后处理下:
01536399 FF15 CC015B01 CALL msvcrt.sprintf
00C0E67C 014E8260 |s = 014E8260
00C0E680 015C86DC |format = "MC%cCF%s"
00C0E684 00000077 |<%c> = 77 ('w') // 首字节
00C0E688 00C0E6C9 \<%s> = "BgfxTjZPzpdSlPgThYryXOiqnozAhQzDCdF0JTVt38EyoCfScG0+0YNrQ==" // 其余部分
得到 "MCwCFBgfxTjZPzpdSlPgThYryXOiqnozAhQzDCdF0JTVt38EyoCfScG0+0YNrQ==" 然后:
01534B6F CALL zend_hash_find 得到 "Produced-By" 的值 YingZhong
01534BA2 CALL zend_hash_find 得到 "Product-Name" 的值 ZYADS
01534BBE CALL 01535180 把 ZYADS +\0 + YingZhong 合起来,返回结果在 eax:"ZYADS"。不解
01534D39 CALL zend_hash_find 查找 "ZYADS" 的值
01534C4F CALL 01544AC0 得到 "Expires"
01534C68 CALL zend_hash_find 得到 值
然后比较 "Expires" 的值是否 "Never"
01534DDC CALL 01544AC0 得到 "IP-Range"
01534E77 CALL 01544AC0 得到 "Max-Concurrent"
015350BE CALL php5ts.zend_hash_del_key_or_index 把 "ZYADS" 删了
最后返回到:
01547AD7 E8 04D9FEFF CALL 015353E0
01547ADC 8B5424 48 MOV EDX, DWORD PTR SS:[ESP+48] 返回到这里
跟得晕头转向,试图用 trace来跟踪流程,结果trace.txt 存了1G了,还在显示tracing,放弃。又回来继续手跟。内存里搜 那个处理过的Code字串,只有一个地址,下内存访问断点。
01539B52 F2:AE REPNE SCAS BYTE PTR ES:[EDI]
跟下去之后,发现进行了base64_decode 处理。
01531462 0FBE15 75805C01 MOVSX EDX, BYTE PTR DS:[15C8075] // 到这里,base64_decode 处理完毕
再往下,没力气了