找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
楼主: 闪乐

不为人知的特征码修改方法

[复制链接]

1

主题

16

回帖

22

牛毛

初生牛犊

积分
22
QQ
发表于 2008-12-29 20:25:42 | 显示全部楼层 来自 山东省临沂市费县
字母与数字的组合,一点也看不懂啊

0

主题

88

回帖

117

牛毛

一级牛人

积分
117
发表于 2008-12-30 21:26:41 | 显示全部楼层 来自 陕西省西安市
有特点就好 肯定好用吧

36

主题

787

回帖

1120

牛毛

二级牛人

积分
1120
QQ
发表于 2009-1-6 19:24:27 | 显示全部楼层 来自 江苏省泰州市海陵区
要汇编知识吧

614

主题

3047

回帖

4905

牛毛

二级牛人

站长

积分
4995
 楼主| 发表于 2008-6-25 01:29:51 | 显示全部楼层 |阅读模式 来自 四川省泸州市
有关重定位问题的修改示例

以下是有关涉及重定位问题的特征码修改示例,附件就不发了,知道意思就行了
00001B4E: FF25 04210010 JMP [10002104] ;这样好看多了
0000198B: FF15 20210010 CALL [10002120]
00001555: 8B3D 4C210010 MOV EDI,[1000214C]
=======================================================================
=======================================================================
看看我对第一处的修改:
注意看重定位问题
(一般调用输入函数返回时,EAX放返回值,所以可以在压栈之后调用之前放心使用EAX)
  使用EAX做重定位处理。
用OD打开
修改方法如下:
A:找一处空隙:
10001FD0 90 nop
10001FD1 90 nop ;先来两个NOP,防止花指令
10001FD2 E8 00000000 ;这句用二进制编辑,很重要,OD的右键有
;完成后这句指令就变成 call 10001FD7
;接下来
10001FD7 58 pop eax
10001FD8 2D D71F0010 sub eax, 10001FD7 ;这个数对应前面的call
10001FDD 05 04210010 add eax, 10002104 ;这个是函数地址
;对照第一处特征码( 00001B4E: FF25 04210010 JMP [10002104] )
; <&MFC42.#269_AFX_MODULE_STA>
;到这里,函数地址的重定位就完成了
10001FE2 FF20 jmp [eax] ;跳到重定位后的函数入口

B:
把光标移到第一处特征码那一行单击
------------
10001FD0=10001FD0
本地调用来自 10001773
------------
转到10001773处,
10001773 |. E8 D6030000 call 10001B4E
改为
10001773 E8 58080000 call 10001FD0 ;指向刚才空隙中的代码起始
这里只有来自10001773的一处调用,如果有多处调用就要改多处,方法一样
C:
把第一处特征码的代码NOP掉
(实际改变的只是FF25这两个字节,后面的04210010在加载时会被加载器改回来)
niu-cow 2006-06-04
----------------
--------------------------------------------------------------------------

看这个特征码:
0000198B: FF15 20210010 CALL [10002120]
此处有重定位,重定位的范围是0000198d-00001990,即20210010四个字节
这四个字节上不要放指令,会被加载器破坏的,以后NOP掉就是了
看看前后:
10001987 |. FF7424 04 push dword ptr [esp+4] ; /func
1000198B |. FF15 20210010 call [10002120] ; <&MSVCRT._onexit>
10001991 |. 59 pop ecx
第二句没有跳入,可以用万能跳转法
(第一句没关系的,只要没有跳入到“中腰”就行。第三句不改,不用考虑)
从10001987处跳出去吧(万能跳转法),jmp 只要五个字节,改到1000198b,
没有到重定位的地方。
A:
找一处空隙
10001FA0 90 nop ;防止花指令,方便修改
10001FA1 90 nop
10001FA2 FF7424 04 push dword ptr [esp+4] ;原来的指令补回去
10001FA6 E8 00000000 ;二进制编辑
;指令变为 call 10001FAB
10001FAB 58 pop eax
10001FAC 2D AB1F0010 sub eax, 10001FAB ;对应前面的call的地址
;从call开始的这三句构成重定位差
;哪个寄存器空闲就用哪个,call前面一般用eax
10001FB1 05 20210010 add eax,10002120 ; <&MSVCRT._onexit>
;把原来函数的地址加上重定位差
;到这里,函数地址的重定位已经完成了
10001FB6 FF10 call [eax] ;调用函数
10001FB8 ^ E9 D4F9FFFF jmp 10001991 ;返回后跳回到下一句
;不要跳到0000198d-00001990
B:
10001987 /E9 14060000 jmp 10001FA0 ;跳到刚才空隙中代码的起始
1000198C |90 nop
1000198D |90 nop
1000198E |90 nop
1000198F |90 nop
10001990 |90 nop

-------------------------------------
------------------------------------------------------------------------
再看这个
00001555: 8B3D 4C210010 MOV EDI,[1000214C]
此处MOV指令将改变EDI的值,所以等下重定位时也使用EDI,这样最保险
同样不要在00001557-0000155A 改指令,以后NOP掉就是了
同样用OD打开,看看
10001551 |. 8B5424 16 mov edx, [esp+16]
10001555 |. 8B3D 4C210010 mov edi, [1000214C] ;USER32.wsprintfA
第二句没有跳入,这样可以用万能跳转法
A:
找一处空隙
10001F70 90 nop
10001F71 90 nop
10001F72 8B5424 16 mov edx, [esp+16];补指令,老规矩
10001F76 E8 00000000 ;这句不用再说了吧call 10001F7B
10001F7B 5F pop edi ;直接用edi,这是技巧
10001F7C 81EF 7B1F0010 sub edi, 10001F7B
;这样,edi 已经是重定位差了
10001F82 81C7 4C210010 add edi, 1000214C ; <&USER32.wsprintfA>
;edi的值已经重定位了,
;但现在还不行,注意,原来的指令有个方括号,也就是取地址所指的内存的值
;2006-06-09修改时疏忽了    (2006-06-14 修正)
10001F88 8B3F mov edi, [edi]
;跳回到原来的下一句吧(这句也要修正,指令相同但机器码不同)
;同样不要跳到NOP掉的地方,这样保险
10001F8A ^ E9 CCF5FFFF jmp 1000155B

B:
10001551 /E9 1A0A0000 jmp 10001F70 ;这个也不再解释了
10001556 |90 nop
10001557 |90 nop
10001558 |90 nop
10001559 |90 nop
1000155A |90 nop


----------------
----------------------------------------------------------------------------
----------------
好了,总结一下
重定位的方法其实很简单
先求重定位差:
nop ;先来几个nop防止出现花指令
;(这样修改时看得清楚些,或者再放些垃圾指令)
e8 00 00 00 00 ;这句将变为call xxxxxxxx
;用C32ASM看到的地址和OLLYDBG看到的不一样,没关系的,
;看到啥就是啥
pop eax ; 或别的寄存器,一定要空闲
sub eax,xxxxxxxx ;每句之间都可放垃圾指令,只要不破坏现场就行了
然后
add eax,yyyyyyyy ;yyyyyyyy为需要重定位的(原来的)地址值,
;加上前面求出的重定位差
;就完成了重定位
至于重定位之后,该怎么办就怎么办

空隙要足够大,加了垃圾指令需要更大的空隙。
直接寻址的地方会被加载器重定位的,别试图在这些地方修改指令
剩下的就是跳来跳去的问题了,ok
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-4-27 11:16 , Processed in 0.175228 second(s), 49 queries .

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表