闲来无事,再研究下花指令,呵呵。
请看下面的花指令调用:(OD下ctrl+A分析结束后结果)
0040112D > $ B8 05000000 mov eax, 5 ;start
00401132 . E8 D61E0000 call 0040300D
00401137 . 85C0 test eax, eax
00401139 . 74 00 je short 0040113B
0040113B > E8 6A00E831 call 322811AA
00401140 ? 0000 add byte ptr [eax], al
00401142 ? 00A3 30314000 add byte ptr [ebx+403130], ah
;...
00403000 0000 add byte ptr [eax], al
00403002 0083 042401E8 add byte ptr [ebx+E8012404], al
00403008 0000 add byte ptr [eax], al
0040300A 0000 add byte ptr [eax], al
0040300C C3 retn
0040300D E8 F1FFFFFF call 00403003
00403012 E8 010424E8 call E8643418
00403017 0000 add byte ptr [eax], al
00403019 0000 add byte ptr [eax], al
0040301B 58 pop eax
0040301C E9 FFFFFFFF jmp 00403020
00403021 E0 00 loopdne short 00403023
源代码如下:
;----花指令为什么写在数据段?为了避免OD分析,因为OD只自动分析代码段。---
;----为此,那些label跳转无法在数据段写,只好写机器码了----
;----所有的跳转都是相对偏移---
.data
db 00,00,00 ;三个0混淆后面指令
add dword ptr [esp],1 ;把返回地址+1
db 0E8h,0,0,0,0 ;call $+5
retn ;这条指令被调用两次,一次call,一次自身
myjmp proc
db 0E8h,0F1h,0FFh,0FFh,0FFh ;call上面
db 0E8h ;混淆指令
add [esp],eax ;把需要的偏移加上去
db 0E8h,0,0,0,0 ;call $+5
pop eax ;取出返回地址,会有两次经过
db 0E9h,0FFh,0FFh,0FFh,0FFh,0E0h ;淫荡就在这里了,两条指令合并
myjmp endp
.code
start:
mov eax,offset @F - $ - 10 ;@@指向正常指令
call myjmp
test eax,eax
jz $+2
db 0E8h
@@:
invoke GetModuleHandle,NULL
总结:
1:一处阴险的地方在于retn会被连续调用两次,一个call,一次retn返回到自身执行一次。
2:一处阴险的地方在于把花指令写在数据段,避免了OD分析。
3:一处阴险的地方在于最后三条指令都会被过两遍,跳晕人。
4:一处很阴险的地方在于jmp $+4与jmp eax两条指令合并,无论是OD还是IDA,只能分析其中一条指令,看到的只是jmp $+4。嘿嘿。够阴险吧。
思考:
发现了其实真正的jmp $+X是短跳,所以只需要jmp $+1就可以了,那最后的机器可以改成db 0EBh,0FFh,0E0h了。。。随便啦。
由于写在数据段,所以,以后看看在myjmp里加上SMC,嘿嘿。
娱乐研究,不足之处请指正,谢谢。欢迎拍砖。
[课程]FART 脱壳王!加量不加价!FART作者讲授!