|
发表于 2015-2-9 23:50:21
|
显示全部楼层
本帖最后由 ghvn7777 于 2015-2-9 23:51 编辑
好吧,懂了楼主什么意思了。楼主是想自己构造汇编代码改变量a的值吧?本菜鸟经过半天调试,可算调通了,指出楼主几点错误,共同学习。
1.楼主第一步就是调用函数,构建反汇编代码。然而在函数体中用到的address变量还未初始化。在函数调用后才初始化的。
2.就是楼主的jmp问题了,都是泪啊。。。调了好久才发现jmp xxx 的指令格式为e9 + 偏移量。。。不是地址。。
偏移量 = 目的地址 - 起始地址 - 跳转指令 长度(因为malloc分配的内存在堆里,里代码段比较远,所以肯定是长跳转,跳转指令长度为5)
嘿嘿,楼主改过来应该就行了,把自己代码贴上来,希望共同学习~~
- #include <stdio.h>
- #include <stdlib.h>
- int a, address;
- void * myCode()
- {
- char *lpCode = (char *)malloc(0x10 * sizeof(char));
- char *t = lpCode;
- lpCode[0] = 0xc7;
- lpCode[1] = 0x05;
- t += 2;
- *((int *)t) = (int)&a;
- t += 4;
- *((int *)t) = 10;
- t += 4;
- *t = 0xe9;
- t++;
- *((int*)t) = address - ((int)t - 1) - 5; //应该从e9开始算,所以t-1
- return (void *)lpCode;
- }
- int main()
- {
- __asm mov address, offset _nextCode;
- void *lpFun = myCode();
-
- __asm jmp lpFun
- _nextCode:
- printf("%d\n", a);
- return 0;
- }
复制代码
|
|