如何修改特征码
2024-07-18 21:35:43作者:饭克斯
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
详细不?不过有点累人。。。。。