首页
社区
课程
招聘
[已解决]复制函数代码到另一个函数重定位的问题
发表于: 2009-12-19 17:30 4644

[已解决]复制函数代码到另一个函数重定位的问题

2009-12-19 17:30
4644
如何才能正确的复制一个函数的代码到另一个函数中的 JMP 定位 我用了论坛上一个朋友的函数
VOID BufferCopy(PUCHAR pCode, ULONG Address, ULONG BufferLength)
{
        ULONG cAbs, i;
        LONG oRel, cRel;
       
        memset(pCode, 0x90, BufferLength);
        for (i = 0; i < BufferLength; i++)
        {
                cAbs = Address + i;
                pCode[i] = *(PUCHAR)cAbs;
                switch (*(PUCHAR)cAbs)
                {
                        case 0x0F: //JXX NEAR X
                                if ((*(PUCHAR)(cAbs + 1) >= 0x80)&&(*(PUCHAR)(cAbs + 1) <= 0x8F))
                                {
                                        oRel = *(PLONG)(cAbs + 2);
                                        if ((oRel + cAbs + 6 > Address + BufferLength)||
                                                (oRel + cAbs + 6 < Address)) //判断跳转是否在过程范围内
                                        {
                                                pCode[i + 1] = *(PUCHAR)(cAbs + 1);
                                                cRel = GetRelAddr(oRel, cAbs, (ULONG)pCode + i);
                                                memcpy(pCode + i + 2, &cRel, sizeof(LONG));
                                                //DbgPrint("JXX: 0x%08X -> 0x%08X", cAbs, (ULONG)pCode + i);
                                                i += sizeof(LONG) + 1;
                                        }
                                }
                                break;
                               
                        case 0xE8: //CALL
                                oRel = *(PLONG)(cAbs + 1);                               
                                if ((oRel + cAbs + 5 > Address + BufferLength)||
                                        (oRel + cAbs + 5 < Address)) //判断跳转是否在过程范围内
                                {
                                        cRel = GetRelAddr(oRel, cAbs, (ULONG)pCode + i);
                                        memcpy(pCode + i + 1, &cRel, sizeof(LONG));
                                        //DbgPrint("CALL: 0x%08X -> 0x%08X", cAbs, (ULONG)pCode + i);
                                        i += sizeof(LONG);
                                }
                                break;
                               
                        case 0x80: //CMP BYTE PTR X
                                if (*(PUCHAR)(cAbs + 1) == 0x7D)
                                {
                                        memcpy(pCode + i + 1, (PVOID)(cAbs + 1), 3);
                                        i += 3; continue;
                                }
                                break;
                               
                        case 0xC2: //RET X
                                if (*(PUSHORT)(cAbs +1) == 0x10)
                                {
                                        memcpy(pCode + i + 1, (PVOID)(cAbs + 1), sizeof(USHORT));
                                        i += sizeof(USHORT);
                                }
                                break;
                               
                        case 0xE9: //JMP
                                oRel = *(PLONG)(cAbs + 1);
                                if (oRel + cAbs > Address + BufferLength)
                                {
                                        cRel = GetRelAddr(oRel, cAbs, (ULONG)pCode + i);
                                        memcpy(pCode + i + 1, &cRel, sizeof(LONG));
                                        i += 4;
                                }
                }
               
                if ((*(PUCHAR)cAbs == 0x39)||(*(PUCHAR)cAbs == 0x89)||(*(PUCHAR)cAbs == 0x8D))
                {
                        memcpy(pCode + i + 1, (PVOID)(cAbs + 1), sizeof(USHORT));
                        i += sizeof(USHORT); continue;
                }

                if ((*(PUCHAR)cAbs >= 0x70)&&(*(PUCHAR)cAbs <= 0x7F)&&(*(PUCHAR)(cAbs - 1) != 0xFF))
                {
                        oRel = (LONG)(*(PCHAR)(cAbs + 1));
                        cRel = GetRelAddr(oRel, cAbs, (ULONG)pCode + i);
                        memcpy(pCode + i + 1, &cRel, 1);
                        i++; continue;
                }
        }
}
CALL JXX 系列都定位准确 但是对于 jne short 805D635D  和jmp short 805D635D
无法定位  只要遇到jmp short  XXX 就定位到自己的函数地址里了
那位哥哥 帮忙修改下 或给个 代码 谢谢了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
2
自己顶下。。。。。。
2009-12-19 19:47
0
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
2字节的JMP 是不需要重定位的(除非你没有吧整个函数复制过去)
2009-12-19 23:14
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
4
复制过去了 但是出错 蓝屏 主要是想SSDT 一个函数 把原函数 保存 SSDT
2009-12-20 00:09
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
jmp short  XXX  本来就不用修改的,
2009-12-20 02:29
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
6
解决了 主要是上面那个函数 有问题,遇到NOP 结尾的 正确 ,INT 3的就不行了
在就是我自定义函数尺寸太小了,混合了
2009-12-20 11:47
0
游客
登录 | 注册 方可回帖
返回
//