首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

hnxyy在吗,请问个有关问题,关于PE伪装器代码中的有关问题

2012-02-20 
hnxyy在吗,请教个问题,关于PE伪装器代码中的问题JMPOFF43//花指令的机器码,Ollydbg加载后随便取这个JMPO

hnxyy在吗,请教个问题,关于PE伪装器代码中的问题
JMPOFF   =   43;     //花指令的机器码,Ollydbg加载后随便取

这个JMPOFF机器码不知是怎么取得的,现在我增加新的花指令,但这个JMPOFF的值不知是如何取的

对“Ollydbg加载后随便取”非常不明白


[解决办法]
我帮你呼他了~
[解决办法]
如果你想彻底了解这种加花机制,建议你先了解它的原理和PE的一些基础知识,我的程序中基本注释比较清楚了,你可以先学着手工用OD加一些花,添加一个区段写花代码或在PE中找个空隙写都可以,关键要保持堆栈平衡

+++++++++++++++++++++++++++
说明:以VC++6的花指令为例说明

//VC++6外衣 1
OEPCODEFIVE: THEAD =
($55, $8B, $EC, $6A, $FF, $68, $00, $00, $00, $00, $68, $00, $00, $00, $00, $64,
$A1, $00, $00, $00, $00, $50, $64, $89, $25, $00, $00, $00, $00, $83, $EC, $68,
$53, $56, $57, $58, $58, $58, $83, $C4, $68, $58, $67, $64, $A3, $00, $00, $58,
$58, $58, $58, $8B, $E8, $E9, $07, $B9, $FE, $FF, $00, $00, $00, $00, $00, $00);

//VC++6外衣 2
OEPCODEFIVE: THEAD =
($55, $8B, $EC, $6A, $FF, $68, $00, $00, $00, $00, $68, $00, $00, $00, $00, $64,
$A1, $00, $00, $00, $00, $50, $64, $89, $25, $00, $00, $00, $00, $83, $EC, $68,
$53, $56, $57, $58, $58, $58, $83, $C4, $68, $58, $67, $64, $A3, $00, $00, $58,
$58, $58, $58, $8B, $E8, $B8, $00, $10, $40, $00, $FF, $E0, $90, $00, $00, $00);

1.直接将入口地址赋给寄存器eax,然后jmp eax
0046902A B8 304A4500 mov eax,Project1.00454A30
0046902F FFE0 jmp eax
00469031 90 nop
2. 直接跳转到入口地址
00469124 - E9 07B9FEFF jmp Project1.00454A30
两种效果实际上是一样的,但我们为了方便修改花指令跳转到原来的入口地址,通常取得原
pe header的AddressOfEntryPoint,然后给寄存器eax保存改值,所以第二种方法就不太方便,
所以一般采用第一种方法,JMPOFF为花指令代码到跳转指令的偏移,如对Visual C++的花指令
JMPOFF=54,其后免跟的是原入口地址,可以随便填写,程序加花指令是会自动修改,一般可以
默认设为00104000(即00401000).
通过汇编修改花指令跳转原入口地址的语句:
asm //这里说明一下,这是嵌入的汇编代码,寄存器—CPU暂时储存数据的东西,比内存更快,以提高效率
PUSHAD
LEA eax, OEPCODE //将OEPCODE的地址交给寄存器
ADD eax, JMPOFF //添加JMPOFF值给寄存器
MOV edx, AddressOfEntryPoint //转移指令,相当于付值语句,左边给右边
MOV DWORD ptr [eax], edx //同上
POPAD
end;
}

JMPOFF的长度在上面已经说的很清楚了,就是花指令的长度

对:
OEPCODEFIVE: THEAD =
($55, $8B, $EC, $6A, $FF, $68, $00, $00, $00, $00, $68, $00, $00, $00, $00, $64,
$A1, $00, $00, $00, $00, $50, $64, $89, $25, $00, $00, $00, $00, $83, $EC, $68,
$53, $56, $57, $58, $58, $58, $83, $C4, $68, $58, $67, $64, $A3, $00, $00, $58,
$58, $58, $58, $8B, $E8, $B8, $00, $10, $40, $00, $FF, $E0, $90, $00, $00, $00);

它的长度就是$00, $10, $40, $00前的长度54,原入口地址是$00, $10, $40, $00(00104000),随便填写,通过:

asm //这里说明一下,这是嵌入的汇编代码,寄存器—CPU暂时储存数据的东西,比内存更快,以提高效率
PUSHAD
LEA eax, OEPCODE //将OEPCODE的地址交给寄存器
ADD eax, JMPOFF //添加JMPOFF值给寄存器
MOV edx, AddressOfEntryPoint //转移指令,相当于付值语句,左边给右边
MOV DWORD ptr [eax], edx //同上
POPAD
end;

返回到原入口,这个时候00104000已经变成真正的OEP

先压栈,跳到入口,出栈,保持堆栈平衡


0046902A B8 304A4500 mov eax,Project1.00454A30
0046902F FFE0 jmp eax
00469031 90 nop

$00, $10, $40, $00, $FF, $E0, $90

$00, $10, $40, $00是随便填写的,对应上面的
B8 304A4500 mov eax,Project1.00454A30

表示从这个地方开始返回原入口,之前都是JMPOFF的长度

呵呵,表达不清楚,希望你能看明白

如果你od用的熟了,一看就明白

多用OD进行手工加花,可有助于你理解

热点排行