能力值:
( LV5,RANK:60 )
|
-
-
2 楼
因为你自制的有问题
没调整esp给自己分配空间
加上
PUSH EBP
MOV EBP,ESP
SUB ESP,100
你少了一条指令
"my msgbox"第一条指令设置 'm'的指令没看见哦
加上 MOV BYTE PTR SS:[EBP-12],6D
char szCode[] =
"\x55\x8B\xEC\x81\xEC\x00\x01\x00\x00" "\xC6\x45\xEE\x6D"
"\xC6\x45\xEF\x79\xC6\x45\xF0\x20\xC6\x45\xF1\x6D\xC6\x45\xF2\x73\xC6"
"\x45\xF3\x67\xC6\x45\xF4\x62\xC6\x45\xF5\x6F\xC6\x45\xF6\x78\xC6"
"\x45\xF7\x00\x8D\x75\xEE\xC6\x45\xF9\x62\xC6\x45\xFA\x75\xC6\x45"
"\xFB\x66\xC6\x45\xFC\x66\xC6\x45\xFD\x6C\xC6\x45\xFE\x6F\xC6\x45"
"\xFF\x00\x8D\x7D\xF9\x6A\x01\x56\x57\x6A\x00\xB8\xEA\x07\xD5\x77"
"\xFF\xD0";
之前你没
MOV EBP,ESP
SUB ESP,100
,当时
----------------------------------
ESP
.
.这段地址空间正好很短
.
EBP
然后就设置ebp地址上面的内存,地址还超越了esp值,
-------------------------------------
...字符串都写到这里来了
ESP
.
.这段地址空间正好很短
.
EBP
-------------------
然后就是Push 1的时候ESP主动上调,并写入00000001 4字节的数据把你的字符串给覆盖了
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
这代码会这样
#include <stdio.h>
#include <windows.h>
char szCode[] =
"\xC6\x45\xEE\x6D"
"\xC6\x45\xEF\x79\xC6\x45\xF0\x20\xC6\x45\xF1\x6D\xC6\x45\xF2\x73\xC6"
"\x45\xF3\x67\xC6\x45\xF4\x62\xC6\x45\xF5\x6F\xC6\x45\xF6\x78\xC6"
"\x45\xF7\x00\x8D\x75\xEE\xC6\x45\xF9\x62\xC6\x45\xFA\x75\xC6\x45"
"\xFB\x66\xC6\x45\xFC\x66\xC6\x45\xFD\x6C\xC6\x45\xFE\x6F\xC6\x45"
"\xFF\x00\x8D\x7D\xF9\x6A\x01\x56\x57\x6A\x00\xB8\xEA\x07\xD5\x77"
"\xFF\xD0"; int main()
{
LoadLibrary( "user32.dll" );
__asm
{
lea eax,szCode;
push eax;
ret;
}
return 0;
}
|
能力值:
( LV5,RANK:60 )
|
-
-
4 楼
我刚仔细看了下问题,
修改了1楼的回复了
|
能力值:
( LV10,RANK:163 )
|
-
-
5 楼
其实你后面还少几行呢,
MOV ESP,EBP
pop ebp
ret
上面有
push ebp
mov ebp,esp
下面没有恢复,也没有返回.
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
跟你们学到不少,太谢谢了
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
不好意思,在问一下,如何将汇编代码转成十六进制字符串呢
|
能力值:
( LV3,RANK:30 )
|
-
-
8 楼
其实
pushad
popad
就可以了
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
汇编代码写在OD里,看内存。oD插件有ha_nonawrite1.2(写汇编代码的),数据格式转换。我是这样弄的,不知大牛们用什么方法
|
能力值:
( LV10,RANK:163 )
|
-
-
10 楼
先OD,然后再Shift+x就复制出来了,然后自己写个小工具每格两个字符加上一个\x.
|
|
|