jsr @r1 ; signal
nop
…
loc_416058:
mov.l off_416124, r1 ; unk_43D304
mov.l @r1, r1
mov.l off_416128, r2 ; unk_43D31C
mov.w word_41610C, r3 ; h'400
mov r1, r4
mov r2, r5
mov r3, r6
mov.l off_41612C, r1 ; loc_414BA8
jsr @r1 ; loc_414BA8
nop
cmp/pl r0
bf loc_41608C
mov.l off_416130, r1 ; aKaraokReadJava ; "karaok, read javaSock: %s\n"
mov.l off_416128, r2 ; unk_43D31C
mov r1, r4
mov r2, r5
mov.l off_416134, r1 ; printf
jsr @r1 ; printf
nop
mov.l off_416128, r1 ; unk_43D31C
mov r1, r4
mov.l off_416138, r1 ; (dword_4158B8+h'DC)//h'4F222FE6, signal 函数设置的
信号
jsr @r1
nop
bra loc_416228
nop
loc_40EF98:
…
tst r1, r1
bt dword_40EFD0+h'26
mov.l off_40F008, r1 ; unk_43C168
mov.l @r1, r1
cmp/pl r1
bf dword_40EFD0+h'26
mov.l off_40F00C, r2 ; aSendToZtebwS ; "Send to ztebw:%s\n"
mov r14, r1
add #-h'34, r1
mov.l @(h'3C,r1), r1
mov r2, r4
mov r1, r5
mov.l off_40F010, r1 ; printf //输出“Send to ztebw:”,JAVA、ACK、VPLAYER
等
…(略)
虽然在 telnet中不能输入连续的字符串,但是我们可以通过编程实现,向机顶盒的TCP3465
端口发送完整的命令字符串。 ztebw实质是茁壮 iPanel浏览器的修改版,需要注意的是ztebw
没有引入库文件,不直接调用标准c函数,增加了代码分析的难度。
分析 ztebw反汇编代码,确定出ztebw浏览器支持的命令,代码如下:
loc_56011C:
...(略)
mov.l off_5602B4, r9 ; sub_5E3234
add #8, r15
mov.l off_5602B8, r5 ; aPlay ; "play"
jsr @r9 ; sub_5E3234 //比较r4和r5字符串,相同返回0
mov r8, r4
tst r0, r0
bf loc_560172
mov.l off_5602BC, r0 ; sub_561A64
...(略) //play,则调用sub_561A64
loc_560172: ; "testplay"
mov.l off_5602CC, r5 ; aTestplay
jsr @r9
mov r8, r4
tst r0, r0
bf/s loc_56018E
mov r8, r5
...(略) // testplay,则调用 sub_562EF4
loc_56018E: ; "pause"
mov.l off_5602D4, r5 ; aPause
jsr @r9
mov r8, r4
tst r0, r0
bf/s loc_5601A4
mov #2, r4
...(略) //pause,则调用 sub_5620DC
off_5602A8:.data.l aOnbwplaycontro ; "OnBwPlayControl"
off_5602AC:.data.l aSDSPlayContr_0 ; "%s[%d]:[%s] Play control command
is %s."...
off_5602B0:.data.l aMc_evtproces_0 ; "mc_evtprocessor.c"
off_5602B8:.data.l aPlay ; "play"
off_5602CC:.data.l aTestplay ; "testplay"
off_5602D4:.data.l aPause ; "pause"
off_5602DC:.data.l aResume ; "resume"
off_5602E0:.data.l aStop ; "stop"
off_5602E4:.data.l aStopwithdiag ; "stopwithdiag"
off_5602F0:.data.l aSeek ; "seek"
off_5602F8:.data.l aFf ; "FF"
off_560300:.data.l aRr ; "RR"
off_560304:.data.l aSDSRrSpeedIsD ; "%s[%d]:[%s] RR speed is %d\n"
off_560310:.data.l aSDSUnknownPlay ; "%s[%d]:[%s] Unknown play control
comman"...
代码中的 sub_5E3234 过程(函数)完成类似 strcmp()函数功能,代码分析如下。当字符串
比较一致时,调用相应的过程(函数),向vplayer 进程提交控制命令“play”(播放)、“stop”
(停止)、“pause”(暂停)、“resume”(恢复)、“setmute”(静音)等,完成对播放器的远程
控制。
sub_5E3234:
mov.l r14, @-r15
mov r15, r14
loc_5E3238:
mov.b @r4+, r1 //(R4)→符号扩展→R1,R4+1→R4
mov.b @r5+, r2 //(R5)→符号扩展→R2,R5+1→R5
extu.b r1, r0 //r1字节零扩展,按单字节字符处理
tst r0, r0
bf/s loc_5E3248 //r4读出的字符不为空时,跳转 loc_5E3248,与r5字符比
较
extu.b r2, r2 // r2字节零扩展,按单字节字符处理
bra loc_5E324E // r4读出的字符为空时,函数退出,返回值为r2符号取反
neg r2, r0 //符号取反,即0减 r2保存到 r0
sub r2, r0 // R0-R2→R0
loc_5E324E:
mov r14, r15
mov.l @r15+, r14
rts
nop
; End of function sub_5E3234
//该函数类似strcmp(str1,str2)函数,比较 str1 和 str2 字符串,相等返回 0 |