如何修改特征码

00001B4E:FF2504210010JMP[10002104];这样好看多了

0000198B:FF1520210010CALL[10002120]

00001555:8B3D4C210010MOVEDI,[1000214C]

=======================================================================

=======================================================================

看看我对第一处的修改:

注意看重定位问题

(一般调用输入函数返回时,EAX放返回值,所以可以在压栈之后调用之前放心使用EAX)

  使用EAX做重定位处理。

用OD打开

修改方法如下:

A:找一处空隙:

10001FD090nop

10001FD190nop;先来两个NOP,防止花指令

10001FD2E800000000;这句用二进制编辑,很重要,OD的右键有

;完成后这句指令就变成call10001FD7

;接下来

10001FD758popeax

10001FD82DD71F0010subeax,10001FD7;这个数对应前面的call

10001FDD0504210010addeax,10002104;这个是函数地址

;对照第一处特征码(00001B4E:FF2504210010JMP[10002104])

;到这里,函数地址的重定位就完成了

10001FE2FF20jmp[eax];跳到重定位后的函数入口

B:

把光标移到第一处特征码那一行单击

------------

10001FD0=10001FD0

本地调用来自10001773

------------

转到10001773处,

10001773|.E8D6030000call10001B4E

改为

10001773E858080000call10001FD0;指向刚才空隙中的代码起始

这里只有来自10001773的一处调用,如果有多处调用就要改多处,方法一样

C:

把第一处特征码的代码NOP掉

(实际改变的只是FF25这两个字节,后面的04210010在加载时会被加载器改回来)

niu-cow2006-06-04

----------------

--------------------------------------------------------------------------

看这个特征码:

0000198B:FF1520210010CALL[10002120]

此处有重定位,重定位的范围是0000198d-00001990,即20210010四个字节

这四个字节上不要放指令,会被加载器破坏的,以后NOP掉就是了

看看前后:

10001987|.FF742404pushdwordptr[esp+4];/func

1000198B|.FF1520210010call[10002120];

10001991|.59popecx

第二句没有跳入,可以用万能跳转法

(第一句没关系的,只要没有跳入到“中腰”就行。第三句不改不用考虑)

从10001987处跳出去吧(万能跳转法),jmp 只要五个字节,改到1000198b,

没有到重定位的地方。

A:

找一处空隙

10001FA090nop;防止花指令,方便修改

10001FA190nop

10001FA2FF742404pushdwordptr[esp+4];原来的指令补回去

10001FA6E800000000;二进制编辑

;指令变为call10001FAB

10001FAB58popeax

10001FAC2DAB1F0010subeax,10001FAB;对应前面的call的地址

;从call开始的这三句构成重定位差

;哪个寄存器空闲就用哪个,call前面一般用eax

10001FB10520210010addeax,10002120;

;把原来函数的地址加上重定位差

;到这里,函数地址的重定位已经完成了

10001FB6FF10call[eax];调用函数

10001FB8^E9D4F9FFFFjmp10001991;返回后跳回到下一句

;不要跳到0000198d-00001990

B:

10001987/E914060000jmp10001FA0;跳到刚才空隙中代码的起始

1000198C|90nop

1000198D|90nop

1000198E|90nop

1000198F|90nop

10001990|90nop

-------------------------------------

------------------------------------------------------------------------

再看这个

00001555:8B3D4C210010MOVEDI,[1000214C]

此处MOV指令将改变EDI的值,所以等下重定位时也使用EDI,这样最保险

同样不要在00001557-0000155A改指令,以后NOP掉就是了

同样用OD打开,看看

10001551|.8B542416movedx,[esp+16]

10001555|.8B3D4C210010movedi,[1000214C];USER32.wsprintfA

第二句没有跳入,这样可以用万能跳转法

A:

找一处空隙

10001F7090nop

10001F7190nop

10001F728B542416movedx,[esp+16];补指令,老规矩

10001F76E800000000;这句不用再说了吧call10001F7B

10001F7B5Fpopedi;直接用edi,这是技巧

10001F7C81EF7B1F0010subedi,10001F7B

;这样edi已经是重定位差了

10001F8281C74C210010addedi,1000214C;

;edi的值已经重定位了,

;但现在还不行,注意,原来的指令有个方括号,也就是取地址所指的内存的值

;2006-06-09修改时疏忽了    (2006-06-14修正)

10001F888B3Fmovedi,[edi]

;跳回到原来的下一句吧(这句也要修正,指令相同但机器码不同)

;同样不要跳到NOP掉的地方,这样保险

10001F8A^E9CCF5FFFFjmp1000155B

B:

10001551/E91A0A0000jmp10001F70;这个也不再解释了

10001556|90nop

10001557|90nop

10001558|90nop

10001559|90nop

1000155A|90nop

----------------

----------------------------------------------------------------------------

----------------

好了总结一下

重定位的方法其实很简单

先求重定位差:

nop;先来几个nop防止出现花指令

;(这样修改时看得清楚些,或者再放些垃圾指令)

e800000000;这句将变为callxxxxxxxx

;用C32ASM看到的地址和OLLYDBG看到的不一样,没关系的,

;看到啥就是啥

popeax;或别的寄存器,一定要空闲

subeax,xxxxxxxx;每句之间都可放垃圾指令,只要不破坏现场就行了

然后

addeax,yyyyyyyy;yyyyyyyy为需要重定位的(原来的)地址值,

;加上前面求出的重定位差

;就完成了重定位

至于重定位之后,该怎么办就怎么办

空隙要足够大,加了垃圾指令需要更大的空隙。

直接寻址的地方会被加载器重定位的,别试图在这些地方修改指令

剩下的就是跳来跳去的问题了,ok

详细不?不过有点累人。。。。。

免责声明:本站发布的游戏攻略(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场。
如果本文侵犯了您的权益,请联系站长邮箱进行举报反馈,一经查实,我们将在第一时间处理,感谢您对本站的关注!