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

怎的动态修改程序代码

2012-12-31 
怎样动态修改程序代码是这样的,想在运行的时候把arr数组中的数据插入到main()函数里面(arr数组里面为二进

怎样动态修改程序代码
是这样的,想在运行的时候把arr数组中的数据插入到main()函数里面(arr数组里面为二进制代码),直接执行arr中的代码也可以,怎么弄?

char arr[]={'\x55','\x8B','\xEC','\x83','\xEC','\x54','\x53','\x56','\x57','\x8D','\x7D','\xAC','\xB9','\x15','\x00','\x00','\x00','\xB8','\xCC','\xCC','\xCC','\xCC','\xF3','\xAB','\xC7','\x45','\xFC','\x01','\x00','\x00','\x00','\x68','\x84','\x2E','\x42','\x00','\xE8','\xE7','\x24','\x00','\x00','\x83','\xC4','\x04','\x8D','\x45','\xF4','\x50','\x68','\x80','\x2E','\x42','\x00','\xE8','\x56','\x25','\x00','\x00','\x83','\xC4','\x08','\x8B','\x4D','\xFC','\x89','\x4D','\xF0','\x8B','\x55','\xF0','\x52','\x68','\x1C','\x20','\x42','\x00','\x8B','\x45','\xFC','\x83','\xC0','\x01','\x89','\x45','\xFC','\xE8','\xB6','\x24','\x00','\x00','\x83','\xC4','\x08','\x8B','\x4D','\xF4','\x2B','\x4D','\xFC','\xF7','\xD9','\x1B','\xC9','\x41','\x89','\x4D','\xF8','\x8B','\x4D','\xF8','\x67','\xE3','\xCC','\x8B','\x55','\xFC','\x89','\x55','\xEC','\x8B','\x45','\xEC','\x50','\x68','\x1C','\x20','\x42','\x00','\x8B','\x4D','\xFC','\x83','\xE9','\x01','\x89','\x4D','\xFC','\xE8','\x82','\x24','\x00','\x00','\x83','\xC4','\x08','\x33','\xD2','\x83','\x7D','\xFC','\x00','\x0F','\x94','\xC2','\x89','\x55','\xF8','\x8B','\x4D','\xF8','\x67','\xE3','\xCE'};
int main()
{
    return 0;
}


[解决办法]
char arr[]={'\x55','\x8B','\xEC','\x83','\xEC','\x54','\x53','\x56','\x57','\x8D','\x7D','\xAC','\xB9','\x15','\x00','\x00','\x00','\xB8','\xCC','\xCC','\xCC','\xCC','\xF3','\xAB','\xC7','\x45','\xFC','\x01','\x00','\x00','\x00','\x68','\x84','\x2E','\x42','\x00','\xE8','\xE7','\x24','\x00','\x00','\x83','\xC4','\x04','\x8D','\x45','\xF4','\x50','\x68','\x80','\x2E','\x42','\x00','\xE8','\x56','\x25','\x00','\x00','\x83','\xC4','\x08','\x8B','\x4D','\xFC','\x89','\x4D','\xF0','\x8B','\x55','\xF0','\x52','\x68','\x1C','\x20','\x42','\x00','\x8B','\x45','\xFC','\x83','\xC0','\x01','\x89','\x45','\xFC','\xE8','\xB6','\x24','\x00','\x00','\x83','\xC4','\x08','\x8B','\x4D','\xF4','\x2B','\x4D','\xFC','\xF7','\xD9','\x1B','\xC9','\x41','\x89','\x4D','\xF8','\x8B','\x4D','\xF8','\x67','\xE3','\xCC','\x8B','\x55','\xFC','\x89','\x55','\xEC','\x8B','\x45','\xEC','\x50','\x68','\x1C','\x20','\x42','\x00','\x8B','\x4D','\xFC','\x83','\xE9','\x01','\x89','\x4D','\xFC','\xE8','\x82','\x24','\x00','\x00','\x83','\xC4','\x08','\x33','\xD2','\x83','\x7D','\xFC','\x00','\x0F','\x94','\xC2','\x89','\x55','\xF8','\x8B','\x4D','\xF8','\x67','\xE3','\xCE'};
int main()
{
typedef void(*funcptr)(void);
funcptr f=(funcptr)((void*)arr);
f();
    return 0;
}
[解决办法]
引用:
题目有要求的,不能使用循环语句,选择语句,跳转语句,内嵌汇编也不行。


机器码跟汇编有区别么, 这是作弊..

直接写 const char main[] = { ... }; 就可以了...

记得加上 const , 不然很多系统下 .data 是不可运行的, .const 一般都跟 .text 合并在一起的...

这个不是缓冲区溢出, Linux 下木有问题的说...
[解决办法]
linux 下可以将
#ifdef DEBUG
char arr[]={'\x55','\x8B','\xEC','\x83','\xEC','\x54','\x53','\x56','\x57','\x8D','\x7D','\xAC','\xB9','\x15','\x00','\x00','\x00','\xB8','\xCC','\xCC','\xCC','\xCC','\xF3','\xAB','\xC7','\x45','\xFC','\x01','\x00','\x00','\x00','\x68','\x84','\x2E','\x42','\x00','\xE8','\xE7','\x24','\x00','\x00','\x83','\xC4','\x04','\x8D','\x45','\xF4','\x50','\x68','\x80','\x2E','\x42','\x00','\xE8','\x56','\x25','\x00','\x00','\x83','\xC4','\x08','\x8B','\x4D','\xFC','\x89','\x4D','\xF0','\x8B','\x55','\xF0','\x52','\x68','\x1C','\x20','\x42','\x00','\x8B','\x45','\xFC','\x83','\xC0','\x01','\x89','\x45','\xFC','\xE8','\xB6','\x24','\x00','\x00','\x83','\xC4','\x08','\x8B','\x4D','\xF4','\x2B','\x4D','\xFC','\xF7','\xD9','\x1B','\xC9','\x41','\x89','\x4D','\xF8','\x8B','\x4D','\xF8','\x67','\xE3','\xCC','\x8B','\x55','\xFC','\x89','\x55','\xEC','\x8B','\x45','\xEC','\x50','\x68','\x1C','\x20','\x42','\x00','\x8B','\x4D','\xFC','\x83','\xE9','\x01','\x89','\x4D','\xFC','\xE8','\x82','\x24','\x00','\x00','\x83','\xC4','\x08','\x33','\xD2','\x83','\x7D','\xFC','\x00','\x0F','\x94','\xC2','\x89','\x55','\xF8','\x8B','\x4D','\xF8','\x67','\xE3','\xCE'}; int main() {     return 0; } 



#endif

在执行时加上./a.out -D -DEBUG 此处a.out为编译连接好了的可执行文件的名字
[解决办法]


#include<stdio.h>

extern "C" int __cdecl mainCRTStartup(void); 

char arr[]={'\x55','\x8B','\xEC','\x83','\xEC','\x54','\x53','\x56','\x57','\x8D','\x7D','\xAC','\xB9','\x15','\x00','\x00','\x00','\xB8','\xCC','\xCC','\xCC','\xCC','\xF3','\xAB','\xC7','\x45','\xFC','\x01','\x00','\x00','\x00','\x68','\x84','\x2E','\x42','\x00','\xE8','\xE7','\x24','\x00','\x00','\x83','\xC4','\x04','\x8D','\x45','\xF4','\x50','\x68','\x80','\x2E','\x42','\x00','\xE8','\x56','\x25','\x00','\x00','\x83','\xC4','\x08','\x8B','\x4D','\xFC','\x89','\x4D','\xF0','\x8B','\x55','\xF0','\x52','\x68','\x1C','\x20','\x42','\x00','\x8B','\x45','\xFC','\x83','\xC0','\x01','\x89','\x45','\xFC','\xE8','\xB6','\x24','\x00','\x00','\x83','\xC4','\x08','\x8B','\x4D','\xF4','\x2B','\x4D','\xFC','\xF7','\xD9','\x1B','\xC9','\x41','\x89','\x4D','\xF8','\x8B','\x4D','\xF8','\x67','\xE3','\xCC','\x8B','\x55','\xFC','\x89','\x55','\xEC','\x8B','\x45','\xEC','\x50','\x68','\x1C','\x20','\x42','\x00','\x8B','\x4D','\xFC','\x83','\xE9','\x01','\x89','\x4D','\xFC','\xE8','\x82','\x24','\x00','\x00','\x83','\xC4','\x08','\x33','\xD2','\x83','\x7D','\xFC','\x00','\x0F','\x94','\xC2','\x89','\x55','\xF8','\x8B','\x4D','\xF8','\x67','\xE3','\xCE'};

void function()

#pragma comment(linker, "/entry:function")
#pragma comment(linker, "/SECTION:.text,ERW")
#pragma comment(lib, "msvcrt.lib")
int mainCRTStartup();
void main();
__asm
{
MOV EAX, OFFSET main
MOV BYTE PTR[EAX], 0xB8 //MOV EAX, 0x 
MOV DWORD PTR[EAX+1],offset arr //将arr的地址放在mov eax,0x的后面,形成代码mov eax,offset arr
MOV WORD PTR[EAX+5], 0xE0FF // JMP EAX:FFE0
}
  
mainCRTStartup();
__asm
{
ret
}
}

int main()
{
_asm
{
nop
nop
nop
nop
nop
nop
nop
}
return 0;
}

这样就可以不在main中写代码,直接在某一个函数中直接修改main的代码。
main函数处反汇编的结果是
0040101E      90            NOP
0040101F      90            NOP
00401020  /$  B8 10304000   MOV EAX,a.00403010
00401025  
[解决办法]
.  FFE0          JMP EAX
00401027  
[解决办法]
.  33C0          XOR EAX,EAX
00401029  \.  C3            RETN
0040102A      90            NOP

00403010处的的结果是
00403010    55              PUSH EBP
00403011    8BEC            MOV EBP,ESP
00403013    83EC 54         SUB ESP,54
00403016    53              PUSH EBX


00403017    56              PUSH ESI
00403018    57              PUSH EDI
00403019    8D7D AC         LEA EDI,DWORD PTR SS:[EBP-54]
0040301C    B9 15000000     MOV ECX,15
00403021    B8 CCCCCCCC     MOV EAX,CCCCCCCC
00403026    F3:AB           REP STOS DWORD PTR ES:[EDI]
00403028    C745 FC 0100000>MOV DWORD PTR SS:[EBP-4],1
0040302F    68 842E4200     PUSH 422E84
00403034    E8 E7240000     CALL 00405520
00403039    83C4 04         ADD ESP,4
0040303C    8D45 F4         LEA EAX,DWORD PTR SS:[EBP-C]
0040303F    50              PUSH EAX
00403040    68 802E4200     PUSH 422E80
00403045    E8 56250000     CALL 004055A0
0040304A    83C4 08         ADD ESP,8
0040304D    8B4D FC         MOV ECX,DWORD PTR SS:[EBP-4]
就是你填充的代码

热点排行