/*
ActiveMark unpacking script by russiankid
Note: check all execptions in Debuggin options.
tested with following AM versions:
5.42.1218 (granny in paradise, triblettes, xt rally, lab project deluxe, )
5.41.1210 (beetle bomp, the bug factor, jewel miner,)
5.4.1171 (fortune tiles gold,)
5.31.1140 (mouse trophy,)
5.3.1078 (capitalism 2, chuzzle deluxe,)
does not fully work:
5.2.1006 (mindrover,) ;AM selfcheck could not be found because of messed level 2 code, the rest is OK
*/
var LoadLibraryA
var RetAddr
var JumpAddr
var FixAddr
var AtEIP
var CurEIP
dbh
gpa "LoadLibraryA","kernel32.dll"
find $RESULT,#C20400#
mov LoadLibraryA,$RESULT
bp LoadLibraryA
esto
esto
bc LoadLibraryA
esti
/*
lets find zero level end
*/
find eip,#90000000000000000000000000000000#
mov JumpAddr,$RESULT
cmp JumpAddr,0
je Level0EndNotFound
NextByte:
dec JumpAddr
mov AtEIP,[JumpAddr]
and AtEIP,000000FF
cmp AtEIP,000000C3
jne NextByte
bp JumpAddr
esto
bc JumpAddr
esti
/*
now we can be at level 1 or at level 2. lets find which one.
*/
CheckForSecondLayer:
find eip,#54646E41#
mov FixAddr,$RESULT
cmp FixAddr,0
je Level2NotFound
/*
we finally at level 2. we can dump here.
*/
cmt eip, "This will be new entry point."
sub FixAddr,8
mov AtEIP,[FixAddr]
and AtEIP,000000FF
cmp AtEIP,00000074
jne FixAddrNotFound
inc FixAddr
mov [FixAddr],#00#
dec FixAddr
cmt FixAddr, "ActiveMark selfcheck fixed."
ret
/*
we are at level 1. lets find its end.
*/
Level2NotFound:
find eip,#6661FF25#
mov JumpAddr,$RESULT
cmp JumpAddr,0
je MessedCode
add JumpAddr,2
bp JumpAddr
esto
bc JumpAddr
esti
FoundSecondLayer:
cmt eip, "This will be new entry point."
find eip,#54646E41#
mov FixAddr,$RESULT
cmp FixAddr,0
je FixAddrNotFound
sub FixAddr,8
mov AtEIP,[FixAddr]
and AtEIP,000000FF
cmp AtEIP,00000074
jne FixAddrNotFound
inc FixAddr
mov [FixAddr],#00#
dec FixAddr
cmt FixAddr, "ActiveMark selfcheck fixed."
ret
/*
code is messed up. try to find end of leve 1 anyway.
*/
MessedCode:
find eip,#6661#
mov JumpAddr,$RESULT
cmp JumpAddr,0
je Level1EndNotFound
bp JumpAddr
esto
bc JumpAddr
esti
mov CurEIP,eip
tocnd "eip < CurEIP"
esti
mov AtEIP,[eip]
and AtEIP,0000FFFF
cmp AtEIP,00006066
je FoundSecondLayer
jmp Level1EndNotFound
Level0EndNotFound:
msg "Could not find level 0 end. Stopped on LoadLibraryA call."
ret
Level1EndNotFound:
msg "Could not find level 1 end. Stopped at level 1 start."
ret
FixAddrNotFound:
msg "Could not find AM selfcheck bytes. Stopped at level 2 start (new EP)."
ret