#log
var addr
msg "忽略所有异常"
var iat1
var nextstop
dbh

//获得codebase ,codesize
var cb
var cs
gmi eip,CODEBASE
cmp $RESULT,0
je err
mov cb,$RESULT
gmi eip,CODESIZE
cmp $RESULT,0
je err
mov cs,$RESULT

Check:
//检查 PELock 1.0x -> Bartosz Wojcik 特征指纹
var temp
mov temp,eip
sub temp,5c
FIND temp,#4C6F61644C6962726172794100005669727475616C416C6C6F63004B45#
cmp $RESULT,0
jne begin
msgyn "好像不是 PELock 1.0x -> Bartosz Wojcik 吧?"
cmp $RESULT,0
jne begin
jmp err

begin:
gpa "VirtualAlloc","kernel32.dll"
cmp $RESULT,0
je err
find $RESULT,#C2??00#
cmp $RESULT,0
je err
var VirtualAlloc
mov VirtualAlloc,$RESULT

bp VirtualAlloc
VA:
esto
cmp eip,VirtualAlloc
jne VA

bc VirtualAlloc
sti

//执行到VirtualAlloc

find eip,#C3# //retn
cmp $RESULT,0
je err
go $RESULT
sti
//执行到返回

find eip,#F6C180# //Found 'Test cl,80'
cmp $RESULT,0
je lblabort
mov addr,$RESULT
log addr
cmt addr,"Running!please wait......!"
co:
var CRC_Code_Add
var CRC_Patch_Add
find eip,#2B848D????0000#
//查找特征代码 "SUB EAX,DWORD PTR SS:[EBP+ECX*4+3B14]"
mov CRC_Code_Add,$RESULT
cmp CRC_Code_Add,0
je err

bp CRC_Code_Add
ESTO
bc CRC_Code_Add

gmemi eip,MEMORYBASE

mov CRC_Patch_Add,$RESULT
gmemi eip,MEMORYSIZE
add CRC_Patch_Add,$RESULT
sub CRC_Patch_Add,100
//CRC_PATCH 代码地址为 当前执行段末尾-100
cmp CRC_Patch_Add,0
je err

//搜索输入表填充
Seach_Fix_ITA_Add:
//查找 修复 ITA 的代码地址
find eip,#8919#
var Fix_ITA_Add
//查找特征代码 "MOV DWORD PTR DS:[ECX],EBX"
mov Fix_ITA_Add,$RESULT
cmp Fix_ITA_Add,0
je err

var magicoff //检验偏移中的那个常量
mov magicoff,eip
add magicoff,3
mov magicoff,[magicoff]

var firstcode //校验的第一个dword
var lastcode //校验的最后一个dword
mov firstcode,ebp
add firstcode,magicoff
//计算firstcode
log firstcode
var maxecx
mov maxecx,ecx
mov lastcode,maxecx
mul lastcode,4
//计算lastcode
add lastcode,firstcode
log lastcode

//计算要填的ecx 位于 mov [ecx],ebx
var temp
mov temp,Fix_ITA_Add
sub temp,firstcode
//add temp,1
div temp,4
log temp

//计算要填的代码 位于 mov [ecx],ebx
var calciatcode
mov calciatcode,temp
mul calciatcode,4
add calciatcode,firstcode
mov calciatcode,[calciatcode]
log calciatcode

//计算要填的ecx 位于自己
var me1
mov me1,eip
sub me1,firstcode
//add me1,1
div me1,4
log me1

//计算要填的代码 位于自己
var me1code
mov me1code,me1
mul me1code,4
add me1code,firstcode
mov me1code,[me1code]
log me1code

//计算要填的ecx 位于自己 + 4
var me2
mov me2,eip
sub me2,firstcode
add me2,4
//add me2,1
div me2,4
log me2

//计算要填的代码 位于自己 + 4
var me2code
mov me2code,me2
mul me2code,4
add me2code,firstcode
mov me2code,[me2code]
log me2code

//计算要填的ecx 位于自己 + 8
var me3
mov me3,eip
sub me3,firstcode
add me3,8
//add me2,1
div me3,4
log me3

//计算要填的代码 位于自己 + 8
var me3code
mov me3code,me3
mul me3code,4
add me3code,firstcode
mov me3code,[me3code]
log me3code

CRC_Patch_Code:
//CRC补丁代码
MOV [CRC_Patch_Add],#81F948010000743281F985000000742481F984000000741681F98100000074082B848D143B0000C32D848D5C31C32D2B848D14C32D3B0000D3C32D8919E803C3#
//MOV [CRC_Patch_Add],#81F948010000742481F985000000741681F98400000074082B848D143B0000C32D2B848D14C32D3B0000D3C32D8919EB03C30000#
//CRC 补丁

//补丁的校正
var coolcode
mov coolcode,CRC_Patch_Add
add coolcode,2
mov [coolcode],temp
add coolcode,8
mov [coolcode],me3
add coolcode,8
mov [coolcode],me2
add coolcode,8
mov [coolcode],me1
add coolcode,9
mov [coolcode],magicoff
add coolcode,6
mov [coolcode],me1code
add coolcode,6
mov [coolcode],me2code
add coolcode,6
mov [coolcode],me3code
add coolcode,6
mov [coolcode],calciatcode

//MSG "CRC 补丁成功"

FIX_CRC_Enter_Point:
//修改 CRC 的入口
EVAL "call {CRC_Patch_Add}"
ASM eip,$RESULT
//修改 当前代码为 CALL CRC补丁地址
var temp
MOV temp,CRC_Code_Add
ADD temp,5
MOV [temp],#9090#
//把后面的两个字节用 NOP 覆盖
CMT eip,"修改 CRC 的入口"
// MSG "成功修改 CRC 的入口"

Seach_Fix_ITA:
//查找修复 ITA 的地址
bp Fix_ITA_Add
ESTO
CMP eip,Fix_ITA_Add
JNE Seach_Fix_ITA
//运行到 Fix_ITA 代码处
JMP Fix_ITA


Fix_ITA:
//修复 ITA
bc Fix_ITA_Add
ASM Fix_ITA_Add,"MOV DWORD PTR DS:[ECX],EAX"
//修改 "MOV DWORD PTR DS:[ECX],EBX" 为 "MOV DWORD PTR DS:[ECX],EAX"
CMT Fix_ITA_Add,"修复 ITA 地址"

var temp
mov temp,eip
findaga:
find temp,#0F85????FFFF#
cmp $RESULT,0
je lblabort
mov temp,$RESULT
cmp temp,lastcode
ja goyou
inc temp
jmp findaga

goyou:
//查找IAT处理结束地址
add temp,6
bp temp
esto
bc temp

find eip,#C602E9# //E9 跳转 入壳
cmp $RESULT,0
je lbl5
var nextstop
mov nextstop,$RESULT
bp nextstop
esto
bc nextstop
//修复IAT


lbl5:
cmp nextstop,0
je allok
msgyn "是否修复混淆代码,如不修复就要把混淆区段也DUMP"
cmp $RESULT,0
je cool

var temp
mov temp,edi
sub temp,1
mov [temp],#EB058B1683C6048BFA0FB60646EB6C909090508BC883E003C1E902F3A58BC8F3A45A469090EB475033D233C9B106F7F18BC80FB646018AE068252D353D68050D151DB0B833D238241474079090FEC042EBF45A5A25FF0000005033C08B560203C283C606E2F65A8817894701465A4B75915F8D4D662BCFF3AA61C3803E8D74A7803E81758D807E01F87587C6073D508BC883E003C1E9024848464647E97AFFFFFF#
add temp,7A
bp temp
var cureip
mov cureip,edi
sub cureip,1
mov eip,cureip
run
bc temp
jmp allok

cool:
find eip,#61C3#
cmp $RESULT,0
je err
var final
mov final,$RESULT
bp final
lops:
esto
cmp eip,final
jne lops
bc final

allok:
sti
sti

//快到OEP了
find eip,#0F85??FFFFFF#
cmp $RESULT,0
je err
bp $RESULT
esto
bc $RESULT
add $RESULT,6
bp $RESULT
esto
cmt eip,"Removing junk from stolen OEP! Please wait ..."
bc $RESULT

lblClearJunkCode:
repl eip,#EB00#,#9090#,1000
repl eip,#EB01??#,#909090#,1000
repl eip,#EB02????#,#90909090#,1000
repl eip,#EB03??????#,#9090909090#,1000

repl eip,#EB04????????#,#909090909090#,1000


repl eip,#C1??00#,#909090#,1000
repl eip,#F87301??#,#90909090#,1000
repl eip,#F97201??#,#90909090#,1000

repl eip,#70037101??#,#9090909090#,1000
repl eip,#72037301??#,#9090909090#,1000
repl eip,#74037501??#,#9090909090#,1000
repl eip,#76037701??#,#9090909090#,1000
repl eip,#78037901??#,#9090909090#,1000
repl eip,#7A037B01??#,#9090909090#,1000
repl eip,#7C037D01??#,#9090909090#,1000
repl eip,#7E037F01??#,#9090909090#,1000

repl eip,#E801000000??#,#E80100000090#,1000
repl eip,#E801000000??8F4424FC#,#90909090909090909090#,1000
repl eip,#E801000000??8D642404#,#90909090909090909090#,1000
msg "Junkcode has been removed!"

lbl7:
find eip,#5D#
go $RESULT
sto


delphitab:
//处理delphi被偷的表
find eip,#E80000000058#
cmp $RESULT,0
je lbllogcode //非delphi程序
cmp $RESULT,esi
ja lbllogcode //非delphi程序
add $RESULT,5
find $RESULT,#05# //add eax,const
cmp $RESULT,0
je lbllogcode //非delphi程序
cmp $RESULT,esi
ja lbllogcode //非delphi程序
add $RESULT,5
bp $RESULT
esto
bc $RESULT
//此时eax== 被偷代码位置

var lastpush
//最后一个push的位置
var saveaddr
var cureip
mov cureip,eip
findnext:
find cureip,#68????????90#
cmp $RESULT,0
je findok
cmp $RESULT,esi
ja findok
mov saveaddr,$RESULT
add $RESULT,1
mov cureip,$RESULT
jmp findnext

findok:
cmp saveaddr,0
je lbllogcode
var saveoff
mov saveoff,saveaddr
inc saveoff
mov saveoff,[saveoff]
//找到fakeoep
var tabend //delphi被偷表结束
var tempcode
mov tabend,saveoff

//保存fakeoep
var fakeoep
mov fakeoep,saveoff

nextfend:
mov tempcode,[tabend]
and tempcode,FF
cmp tempcode,0
je findend
dec tabend
jmp nextfend
findend:
mov tempcode,[tabend]
and tempcode,FF
cmp tempcode,0
jne allfind
dec tabend
jmp findend

allfind:
inc tabend
var oldtabend
mov oldtabend,tabend
var esival
mov esival,esi
sub esival,4
mov esi,esival
allfind1:
cmp eax,esi
ja goodnow
mov ecx,[eax]
log tabend
mov [tabend],ecx
add eax,4
add tabend,4
jmp allfind1

goodnow:
add esival,4
mov esi,esival
mov eax,oldtabend
var oep
mov oep,tabend

//补上OEP代码
log oep
mov [oep],#558BEC83C4F0#
sub fakeoep,5
mov [fakeoep],#B8#
inc fakeoep
mov [fakeoep],oldtabend

find eip,#894804# //mov dword ptr [eax+4], ecx
cmp $RESULT,0
je lbllogcode
add $RESULT,3
bp $RESULT
esto
bc $RESULT

lbllogcode:
find eip,#C3#
bp $RESULT
eob lblgoOEP
ti


lblgoOEP:
bc $RESULT
sto
an eip
cmt eip,"Now,press ALT+V+N open trace window,you will find stolen code!"

lblend:
msg " by loveboom[DFCG[FCG],Thank you for using my !"
ret


lblabort:
msg "Error, aborted!,Meybe target is not protect by PELock 1.0x -> Bartosz."
ret

err:
msg "error"
ret