试图破解zend的授权验证
首先用文件监视工具,看执行 php cklic.php 调用了哪些文件。
php.exe => php5ts.dll => php.ini => ZendExtensionManager.dll => ZendOptimizer.dll 然后生成了
C:Documents and SettingsAdministratorLocal SettingsTempendOptimizer.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 + + 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 处理完毕再往下,没力气了
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。