//code for expressor 1.5x ~ 1.6x 使用原版od,忽略所有异常 停在系统断点 //code by skylly starting: //隐藏调试器 exec pushad //clear beingdebugged mov eax,fs:[30] inc eax inc eax mov ebx,eax mov eax,[eax] //取出旧值 xor al,al //置0 mov [ebx],eax //写入 xor eax,eax //clear forceflag mov ebx,fs:[30] add ebx,18 mov ebx,[ebx] add ebx,10 mov [ebx],eax //clear NtGlobalFlag mov ebx,fs:[30] add ebx,68 mov [ebx],eax popad ende //这里有些anti 像exec的 gpa "OutputDebugStringA","kernel32.dll" mov [$RESULT],#8BFF5533C05DC20400# gpa "CheckRemoteDebuggerPresent","kernel32.dll" mov [$RESULT],#8BFF5533C05DC20800# gpa "FindWindowA","user32.dll" //ollydbg,filemon等 mov [$RESULT],#8BFF5533C05DC20800# gpa "VirtualProtect", "kernel32.dll" cmp $RESULT,0 je err var VirtualProtect mov VirtualProtect,$RESULT var tmp bp VirtualProtect lpvp: esto mov tmp,[esp+8] cmp tmp,1000 jne lpvp bc VirtualProtect rtu mov tmp,eip and tmp,FFFF0000 find tmp, #C7402000100000# cmp $RESULT,0 je err mov [$RESULT],#90909090909090# //anti anti dump find tmp,#75F4FE4DFF75EF# cmp $RESULT,0 je err mov [$RESULT],#EB# //heap magic检测,真是会学习... find tmp,#C745F801000000C3837DF800# //page页异常,把ntkrnel那套都学了... cmp $RESULT,0 je err mov [$RESULT],#EB23# find tmp,#58833D????????000F84# cmp $RESULT,0 je err var nagaddr mov nagaddr,$RESULT add nagaddr,8 mov [nagaddr],#90E9# //去掉nag,不知道对不对,乱改的 log nagaddr find tmp,#5356570F843C01# cmp $RESULT,0 je nomagic //magic jmp add $RESULT,3 mov [$RESULT],#90E9# nomagic: var djmp mov djmp,0 find tmp,#83C0058B4DF8# cmp $RESULT,0 je nodjmp msgyn "是否修复direct jmp? 如果选是则要配合uif来修复,如果选否则自己负责..." cmp $RESULT,0 je nodjmp //direct jmp? mov djmp,$RESULT log djmp add $RESULT,5 mov [$RESULT],#D8# nodjmp: #log find tmp,#83780C000F84# cmp $RESULT,0 je err bp $RESULT esto bc $RESULT var iidstart var iidsize mov iidstart,eax cmp djmp,0 jne concon msg "此时dump下来,等会到oep后根据日志用loadpe修复即可" concon: mov tmp,eip add tmp,6 mov tmp,[tmp] add tmp,eip add tmp,A bp tmp esto bc tmp mov iidsize,eax sub iidsize,iidstart var nearoep find eip,#005F5E5B8BE55DEB01# cmp $RESULT,0 je err mov nearoep,$RESULT inc nearoep bp nearoep going: esto cmp eip,nearoep jne going bc nearoep find eip,#FFE0# cmp $RESULT,0 je err bp $RESULT esto bc $RESULT sti var espvar mov espvar,esp sub espvar,4 bphws espvar,"r" esto esto bphwc espvar //这里已经非常非常接近oep了,一般f7两到三下就可以了,但为了方便那些比较"懒"的朋友所以写了个非常恶心的单步脚本... loopsti: mov tmp,[eip] and tmp,FF cmp tmp,58 je mysti cmp tmp,5A je mysti cmp tmp,59 je mysti cmp tmp,51 je mysti cmp tmp,68 je mysti cmp tmp,EB je mysti cmp tmp,FF je mysti cmp tmp,C3 je mysti jmp atoep mysti: esti jmp loopsti atoep: cmt eip,"OEP" var oep mov oep,eip log oep log iidstart log iidsize msg "根据日志内容自己用loadpe修复dump文件的oep及引入表地址和大小" ret err: msg "error" ret