能力值:
( LV2,RANK:10 )
|
-
-
26 楼
然后我修改了生成的EXE文件,直接修改为
call dword ptr user32.messageA
|
能力值:
( LV2,RANK:10 )
|
-
-
27 楼
用V7有4个错,用V10有170个错-_-
都是类似Test.obj : error LNK2001: unresolved external symbol __imp__VerifyVersionInfoA@1
6
to aait:
start:
db 0e8h
dd MessageBoxA
end start
我这边编译出来是:
00401000 > $ E8 06104000 CALL 0080200B
00401005 CC INT3
00401006 .- FF25 00204000 JMP DWORD PTR DS:[<&USER32.MessageBoxA>] ; USER32.MessageBoxA
不能运行也罢了,照样生成了FF25 00204000这6个字节,呵呵
我的初衷就是不要生成这6个字节
|
能力值:
( LV2,RANK:10 )
|
-
-
28 楼
让我疑惑的是,开始地址为什么是401005,而不是401000,而且第一条指令是jmp xxx
而不是我程序中的第一指令call xxxxxx,而且还填充了那么多的cc,cc,cc,太不好看了。
请问这个问题怎么解决呢 ?
|
能力值:
( LV2,RANK:10 )
|
-
-
29 楼
我编译出来的结果和你是一样的,
然后我人为在EXE文件中修改了
00401000 > $ E8 06104000 CALL 0080200B
00401005 CC INT3
00401006 .- FF25 00204000 JMP DWORD PTR DS:[<&USER32.MessageBoxA>] ; USER32.MessageBoxA
我把401000 call 0080200b
改为401000 FF15 00204000
反汇编出来,就是call dword ptr user32.messagea
|
能力值:
( LV2,RANK:10 )
|
-
-
30 楼
噢,知道你的意思了
如果说是生产exe之后再改,也好改,但文件总大小就不会变了,我原来想法跟你28楼一样,直接在原地call目标而不是转一下,想尽量小一点的
不过我也发现这个的好处了
因为call后边其实是相对位置的差值
所以首先肯定不能call 77D5xxxx(msgbox的绝对地址?)
一般都是“间接寻址”来call
原地call :
总字节数total=nx6
masm32的calll
total=6+n*5
调用同一个函数的次数大于6的时候,优势已经体现出来了
|
能力值:
( LV2,RANK:10 )
|
-
-
31 楼
是的,call不能call 7XXX绝对地址的。
这个7XXX的绝对地址是windows 把pe装入内存的时候,在pe的导入表中找到相应单元,在把
内存中的 user32.dll的messageboxa的地址填入,
所以这个7XXX是动态的。和pe文件的导入表相关。
但是生成jmp xxxx以后,jmp后面的xxx就是存放7xxx地址的内存单元。
所以只要call xxxx(这个xxx是jmp后的xxx),就call到user32.massageboxa了。
你要消除jmp xxxx,试下这样。
还是可以通过修改EXE文件覆盖掉jmp messageboxA的。
我一下讲不清楚。
|
能力值:
( LV2,RANK:10 )
|
-
-
32 楼
暂时不管了,这个以后再慢慢看看
|
能力值:
( LV2,RANK:10 )
|
-
-
33 楼
我已经做到了,消除jmp user32.messageboxa
|
能力值:
( LV2,RANK:10 )
|
-
-
34 楼
怎么出来的?别说不清楚啊,慢慢说,又不赶飞机
|
能力值:
( LV2,RANK:10 )
|
-
-
35 楼
楼主开新贴给我20kx我就慢慢说啊。
|
|
|