By CodeCracker
Attached new script for Obsidium, fixed ObsidiumIAT for dlls files;
Finding OEP for dll files is different: I’ve break hardware on execute to Rva 1000 – that address was called from OEP; I’ve returned from that until I found the real OEP.
Obsidium CodeDecrypt.txt – Olly script for decrypting code section.
ObsidiumIAT_v3.txt
/*
=============================================================================
Obsidium IAT fixer by CodeExplorer
=============================================================================
When you use this Olly script you should be at OEP
=============================================================================
*/
var addr
var pointer
var thunk
var temp
var ImportTableAddress
var ImportTableEnd
var ImportSize
var CurrentPos
var OLD_EIP
var OLD_ESP
var varEax
var varEbx
var varEcx
var varEdx
var varEsi
var varEdi
var varEsp
var varEbp
var varEip
var WhereAre
var MainModule
var CodeBase
var PossibleApi
var SearchWhat
var BufferKeep
var CurrentFailedCount
var FailedOn
var AdrsTest
var CurrentPosBak
var KernelBase
mov OLD_EIP,eip // backup EIP
mov OLD_ESP,esp // backup ESP
mov varEax,eax
mov varEbx,ebx
mov varEcx,ecx
mov varEdx,edx
mov varEsi,esi
mov varEdi,edi
mov varEsp,esp
mov varEbp,ebp
GMA "KERNEL32", MODULEBASE
mov KernelBase, $RESULT
mov CurrentFailedCount, 0
alloc 30
mov BufferKeep, $RESULT
GMI eip, MODULEBASE
cmp $RESULT,0
je SCRIPT_FINISHED
mov addr,$RESULT // 401000 // code base
mov MainModule,$RESULT
GMEMI addr, MEMORYSIZE
add addr,$RESULT
mov CodeBase, addr
LABEL_01:
find addr,#FF??????4000# // call/jmp dword [...]
cmp $RESULT,0
jne FoundSomething
find addr,#FF15# // call dword [...]
cmp $RESULT,0
jne FoundSomething
find addr,#FF25# // jmp dword [...]
cmp $RESULT,0
jne FoundSomething
jmp SCRIPT_FINISHED
FoundSomething:
mov addr,$RESULT
cmp [addr+1], 15, 1 // call dword [...]
je IS_OK
cmp [addr+1], 25, 1 // jmp dword [...]
je IS_OK
jmp NextAddress
IS_OK:
mov addr,$RESULT
mov pointer,$RESULT
add pointer,2
mov pointer,[pointer]
mov thunk,[pointer]
GMI thunk, MODULEBASE // After this $RESULT is the address to the codebase of the module to which eip belongs
cmp $RESULT, 0
jz GetImportTable
NextAddress:
add addr,6
jmp LABEL_01
GetImportTable:
mov ImportTableAddress, pointer
BigLoop:
cmp [ImportTableAddress-8], 0, 4
jnz CheckNextOneIT
cmp [ImportTableAddress-4], 0, 4
jz FoundProperAddress
CheckNextOneIT:
sub ImportTableAddress, 4
jmp BigLoop
FoundProperAddress:
log ImportTableAddress
mov ImportTableEnd, ImportTableAddress
IAT_END_LOOP:
cmp [ImportTableEnd+4], 0, 4
jnz CheckNextIAT_END
cmp [ImportTableEnd+8], 0, 4
jz FoundIatEND
GMI [ImportTableEnd+8], MODULEBASE // After this $RESULT is the address to the codebase of the module to which eip belongs
cmp $RESULT, 0 // may be some import address after belonging to a module this means we didn't reached the end
jz CheckNextIAT_END // if address after don't belong to a module we didn't reached the end
cmp $RESULT, MainModule // 400000 // if address belong to main module we reached the end
jz FoundIatEND
CheckNextIAT_END:
add ImportTableEnd, 4
jmp IAT_END_LOOP
FoundIatEND:
add ImportTableEnd, 4
log ImportTableEnd
mov ImportSize, ImportTableEnd
sub ImportSize, ImportTableAddress
log ImportSize
mov CurrentPos, ImportTableAddress
ThunkSearchLoop:
cmp [CurrentPos], 0
jz NextThunkAddress
GMI [CurrentPos], MODULEBASE // After this $RESULT is the address to the codebase of the module to which eip belongs
cmp $RESULT, 0 // if the thunk already belong to a module
jnz NextThunkAddress
//log CurrentPos
mov [BufferKeep], CurrentPos
Readstr [BufferKeep], 4
mov SearchWhat, $RESULT
buf SearchWhat
//log $RESULT
find CodeBase,$RESULT
//log $RESULT
cmp $RESULT, 0 // if no reference to that dword
jz TryResolveStrangeThunk
mov CurrentFailedCount, 0
call TraceAndFixApi
NextThunkAddress:
add CurrentPos, 4
cmp CurrentPos, ImportTableEnd
jnz ThunkSearchLoop
jmp SCRIPT_FINISHED
TryResolveStrangeThunk:
mov PreviousValue, CurrentPos
sub PreviousValue, 4
mov PreviousValue, [PreviousValue]
mov NextValue, CurrentPos
add NextValue, 4
cmp PreviousValue, 0
jz NextThunkAddress
GMI PreviousValue, MODULEBASE
cmp $RESULT, 0 // if the thunk don't belong to a module
jz NextThunkAddress
mov CModuleBase, $RESULT
cmp CModuleBase,KernelBase
jnz NextThunkAddress
// Now try to resolve next thunk:
mov CurrentPosBak, CurrentPos
add CurrentPos, 4
cmp [CurrentPos], 0
jz NextThunkAddress
GMI [CurrentPos], MODULEBASE // After this $RESULT is the address to the codebase of the module to which eip belongs
cmp $RESULT, 0 // if the thunk already belong to a module
jnz NextThunkAddress
//log CurrentPos
mov [BufferKeep], CurrentPos
Readstr [BufferKeep], 4
mov SearchWhat, $RESULT
buf SearchWhat
//log $RESULT
find CodeBase,$RESULT
//log $RESULT
cmp $RESULT, 0 // if no reference to that dword
jz NextThunkAddress
mov CurrentFailedCount, 0
call TraceAndFixApi
mov NextValue, [NextValue]
cmp NextValue, 0
jz NextThunkAddress
GMI NextValue, MODULEBASE
cmp $RESULT, 0 // if the thunk don't belong to a module
jz NextThunkAddress
cmp CModuleBase, $RESULT
jnz NextThunkAddress
log "We have something here!"
mov CurrentPos, CurrentPosBak
mov CurrentFailedCount, 0
call TraceAndFixApi
jmp NextThunkAddress
//jmp NextThunkAddress
//FailedOnThatThunk:
//inc CurrentFailedCount
//mov FailedOn,CurrentPos
//log FailedOn
TraceAndFixApi: // input CurrentPos - resolved import will be writed at [CurrentPos]
mov eip,[CurrentPos]
OK_01:
sti // step in
cmp [eip],93FF, 2 // FF93 94000000 CALL DWORD PTR DS:[EBX+0x94]
jz FinnalyOK
mov temp,[eip]
and temp,0FFFFFF
cmp temp,0476FF // FF7604 PUSH DWORD PTR DS:[ESI+0x4]
jnz OK_01
OK_02:
sto // step over
cmp [eip],93FF, 2 // FF93 94000000 CALL DWORD PTR DS:[EBX+0x94]
jz FinnalyOK
mov temp,[eip]
and temp,0FFFFFF
cmp temp,0476FF // FF7604 PUSH DWORD PTR DS:[ESI+0x4]
jnz OK_02
OK_03:
sto // step over
cmp [eip],93FF, 2 // FF93 94000000 CALL DWORD PTR DS:[EBX+0x94]
jnz OK_03
FinnalyOK:
mov PossibleApi, [esp], 4
GMI PossibleApi, MODULEBASE
cmp $RESULT,0 // if has no module base step over
jz PossibleStepOver
cmp $RESULT,MainModule // if module is main module step over
jz PossibleStepOver
cmp $RESULT,PossibleApi // if a module base step over
jz PossibleStepOver
mov eax, PossibleApi ; api address is on stack - dword ptr [esp]
jmp SetApiAddress
PossibleStepOver:
cmp PossibleApi,0 // if dword ptr [esp] is 0
jz OK_01 // jump back to search
log PossibleApi
sto // step over
mov PossibleApi,eax
SetApiAddress:
mov WhereAre,eip
log WhereAre
log CurrentPos
mov [CurrentPos],PossibleApi
//log eax
ret
SCRIPT_FINISHED:
mov eax,varEax
mov ebx,varEbx
mov ecx,varEcx
mov edx,varEdx
mov esi,varEsi
mov edi,varEdi
mov esp,varEsp
mov ebp,varEbp
mov eip, OLD_EIP // restore eip
mov esp, OLD_ESP // restore ESP
msg "Script finished!"
Obsidium CodeDecrypt.txt
var OLD_EIP
var OLD_ESP
var varEax
var varEbx
var varEcx
var varEdx
var varEsi
var varEdi
var varEsp
var varEbp
var varEip
var addr
var CodeBase
var FoundPlace
var ReturnAddress
var SecondPlace
var FoundCount
var ValueKept
var oldEsp
var OldEip
mov OLD_EIP,eip // backup EIP
mov OLD_ESP,esp // backup ESP
mov varEax,eax
mov varEbx,ebx
mov varEcx,ecx
mov varEdx,edx
mov varEsi,esi
mov varEdi,edi
mov varEsp,esp
mov varEbp,ebp
GMI eip, MODULEBASE
cmp $RESULT,0
je SCRIPT_FINISHED
mov addr,$RESULT // 401000 // code base
mov MainModule,$RESULT
GMEMI addr, MEMORYSIZE
add addr,$RESULT
mov CodeBase, addr
// 6D2B44EE 68 57000000 PUSH 0x57
// 6D2B44F3 FF15 A0E32B6D CALL NEAR DWORD PTR DS:[0x6D2BE3A0]
SearchLoop:
find addr,#68??0000??FF15#
cmp $RESULT,0
je SCRIPT_FINISHED
mov FoundPlace, $RESULT
//bp FoundPlace
mov addr, FoundPlace
inc addr
mov ValueKept, FoundPlace
add ValueKept, 07
mov ValueKept, [ValueKept]
mov ValueKept, [ValueKept]
GMI ValueKept, MODULEBASE
cmp $RESULT,MainModule
jz SearchLoop
cmp $RESULT,0
jnz SearchLoop
mov ReturnAddress, FoundPlace
add ReturnAddress, 0B
bphws ReturnAddress, "x"
//BPMC
//bprm ReturnAddress, 1
pusha
mov oldEsp, esp
mov OldEip, eip
mov eip, FoundPlace
erun
ReturnAddressOk:
bphwc
mov esp, oldEsp
mov eip, OldEip
popa
fill FoundPlace, 0B, 90 // NOP 0Bh bytes
find addr,#68??0000??FF15#
cmp $RESULT,0
je SCRIPT_FINISHED
mov SecondPlace, $RESULT
mov ValueKept, SecondPlace
add ValueKept, 07
mov ValueKept, [ValueKept]
mov ValueKept, [ValueKept]
GMI ValueKept, MODULEBASE
cmp $RESULT,MainModule
jz SearchLoop
cmp $RESULT,0
jnz SearchLoop
fill SecondPlace, 0B, 90 // NOP 0Bh bytes
mov addr, SecondPlace
inc addr
inc FoundCount
jmp SearchLoop
SCRIPT_FINISHED:
mov eax,varEax
mov ebx,varEbx
mov ecx,varEcx
mov edx,varEdx
mov esi,varEsi
mov edi,varEdi
mov esp,varEsp
mov ebp,varEbp
mov eip, OLD_EIP // restore eip
mov esp, OLD_ESP // restore ESP
msg "Script finished!"
扫码免费获取资源:
