(a)
int foo(int x, int y) {
    while (b(x,y))
        if (c(x,y)) 
           return 1;
    return 0;
}


(b)
004011F0               	@foo@8:
004011F0 56         		push	esi
004011F1 57        		push 	edi
004011F2 8BF2        		mov 	esi,edx
004011F4 8BF9        		mov 	edi,ecx
004011F6 E869FEFFFF      		call 	fn_00401064 ; _b
004011FB 85C0           		test 	eax,eax
004011FD 741A          		jz   	loc_00401219
004011FF             	loc_004011FF:
004011FF 8BD6            		mov 	edx,esi
00401201 8BCF            		mov 	ecx,edi
00401203 E857FEFFFF        		call 	fn_0040105F ; _c
00401208 85C0            		test	eax,eax
0040120A 7512         		jnz 	loc_0040121E
0040120C 8BD6          		mov 	edx,esi
0040120E 8BCF           		mov 	ecx,edi
00401210 E84FFEFFFF     		call 	fn_00401064 ; _b
00401215 85C0           		test 	eax,eax
00401217 75E6           		jnz  	loc_004011FF
00401219               	loc_00401219:
00401219 5F             		pop 	edi
0040121A 33C0           		xor 	eax,eax
0040121C 5E             		pop 	esi
0040121D C3             		ret
0040121E              	loc_0040121E:
0040121E 5F               		pop  	edi
0040121F B801000000        		mov 	eax,1
00401224 5E                		pop  	esi
00401225 C3                		ret


(c)
call,test,jz,loc,call,test,jnz,call,test,jnz,loc,xor,ret,loc,ret


(d)
EEC1E2A53DA3D4FCF3E57850F302412D


(e)
int bar(int x, int y, int z) {
    while (g(x,y,666))
        if (h(1234,x,y)) 
           return 1;
    return 0;
}

Figure 1: (a) A small C function; (b) disassembly of a compiled version; (c) its opstring; (d) its function digest; (e) and a slightly different C function that yields the same opstring and function digest.

Back to Article