version used: ollydbg v2 but method is similar for v1 too
ollydbg allows you to log the trace i have done some crude diffs in the past as below you can try improvise
here is the source code that's used for demo
keep in mind i had the source so i compiled it and linked with with /FIXED linker switch to vs 2017 linker so that ASLR doesn't get into play and make life harder if you have a prebuilt binary and cant force load it in same address each time text diffing will be tedious
for example push 402080 will be push f02080 which shouldn't matter but text diff will show it a a difference and it is pure noise
#include <stdio.h> #include <stdlib.h> void main (int argc , char *argv[]) { if (argc !=2 ) { printf("usage %s password\n" , argv[0]); exit(-1); } int password = atoi(argv[1]); if(password == 1337) { printf("good\n"); exit(1); } else { printf("Try again\n"); exit(0); } }
open a blank ollydbg and set trace options like this and close it

open a command prompt and run the executable wit a wrong pass
ollydbg.exe diffway.exe 4567
when ollydbg stops on initial breakpoint open the trace window 1) view run trace or ... icon
2) right click
3) log to file -> file name (say wrongpass.txt)-> ok
4) ctrl+f11 to trace in this will end in a termination
5) trace window-> right click -> stop Logging -> close ollydbg
repeat the procedure with right pass and rightpass.txt as file name
you will now have two text files of two executions
sed grep awk diff are your friends now
rip the modified registers column we are not interested in registers
sed s/"...=.*"//g wrongpass..txt >> ripwrongpass.txt sed s/"...=.*"//g rightpass..txt >> riprightpass.txt diff -w riprightpass.txt ripwrongpass.txt
we got the first divergence between executions here
:\>diff -w riprightpass..txt ripwrongpass..txt 170028,170029c170028,170029 main 00401050 PUSH 0043E1B4 main 00401055 CALL 004010C0 --- main 00401066 PUSH 0043E1BC main 0040106B CALL 004010C0 170477a170478,171087 > main 00410D40 MOVZX EAX, BYTE PTR DS:[ECX*8+EAX+43EF78]; > main 00410D48 SHR EAX, 4
