能力值:
( LV12,RANK:360 )
|
-
-
2 楼
如果要在该函数下申请其他局部变量,申请在API参数变量最前应该也是可以的
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
标记,学习一下!
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
比较陈旧的东西了。。avp3.5入口就这么干的。。。。
|
能力值:
(RANK:1060 )
|
-
-
5 楼
5年前写过类似的一个,拿出来改了一下:
masm
mycall macro funcname, args:VARARG
local ofs, retaddr
sub esp, argcount(args)*4+8
ofs = 0
mov dword ptr [esp+ofs], funcname
ofs = ofs + 4
mov dword ptr [esp+ofs], retaddr
ofs = ofs + 4
for arg, <args>
mov dword ptr [esp+ofs], repargof(arg)
ofs = ofs + 4
endm
retn
retaddr:
endm
start:
mycall Sleep, 100
mycall MessageBoxA, 0, "call w/o pushin' arguments", 0, 0
mycall ExitProcess, 0
end start
ollydbg
00401000 >/$ 83EC 0C sub esp, 0C
00401003 |. C70424 701040>mov dword ptr [esp], <jmp.&kernel32.>
0040100A |. C74424 04 1B1>mov dword ptr [esp+4], mycall.004010>
00401012 |. C74424 08 640>mov dword ptr [esp+8], 64
0040101A \. C3 retn
0040101B . 83EC 18 sub esp, 18
0040101E . C70424 761040>mov dword ptr [esp], <jmp.&user32.Me>
00401025 . C74424 04 4E1>mov dword ptr [esp+4], mycall.004010>
0040102D . C74424 08 000>mov dword ptr [esp+8], 0
00401035 . C74424 0C 003>mov dword ptr [esp+C], mycall.004030>; ASCII "call w/o pushin' arguments"
0040103D . C74424 10 000>mov dword ptr [esp+10], 0
00401045 . C74424 14 000>mov dword ptr [esp+14], 0
0040104D . C3 retn
0040104E . 83EC 0C sub esp, 0C
00401051 . C70424 6A1040>mov dword ptr [esp], <jmp.&kernel32.>
00401058 . C74424 04 691>mov dword ptr [esp+4], mycall.004010>
00401060 . C74424 08 000>mov dword ptr [esp+8], 0
00401068 . C3 retn
00401069 CC int3
0040106A .- FF25 04204000 jmp [<&kernel32.ExitProcess>] ; kernel32.ExitProcess
00401070 .- FF25 00204000 jmp [<&kernel32.Sleep>] ; kernel32.Sleep
00401076 .- FF25 0C204000 jmp [<&user32.MessageBoxA>] ; user32.MessageBoxA
|
能力值:
( LV12,RANK:250 )
|
-
-
6 楼
对付静态逆向,还有点迷惑性。
但骗不过OD,在API头上下断,所有参数照样列举。
动态逆向而言,只是一个小阻碍。
现在编译器开完全优化,那优化后的代码反而更加恶心。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
能骗过杀软 嘿嘿
|
能力值:
( LV12,RANK:360 )
|
-
-
8 楼
这招太牛了...学习啊 可惜俺不懂宏,不知道去哪学?
|
能力值:
( LV12,RANK:360 )
|
-
-
9 楼
想问下..这招是不是已经过时了...而且过时了5年?
|
能力值:
( LV6,RANK:80 )
|
-
-
10 楼
没什么过时的说法吧。太单一了。
masm的第一个m指的就是macro 可是那些各种各样的教程却千方百计的阻止别人用macro
fasm的所以汇编指令也可以说其实就是macro 比如你可以自己写个变形后的push代替原来的push。把所有的变形后的指令宏写在同一个头文件中,当要发布软件的时候直接include 这样直接编译出来的就是变形后的代码。 可惜fasm宏里面没有随机数
|
能力值:
(RANK:1060 )
|
-
-
11 楼
用macro写个LCG就行了。
|
能力值:
( LV12,RANK:360 )
|
-
-
12 楼
是啊 ,目前还没看到有汇编书上有教写宏的.....
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
目前gcc编译push参数就是这样的啊
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
过时了
|
能力值:
( LV4,RANK:50 )
|
-
-
15 楼
mov GetModuleHandleret,a123
push GetModuleHandle
retn
a123:
这样好理解些
|
能力值:
( LV4,RANK:50 )
|
-
-
16 楼
把源码改一下更好理解,红色为更改后的源码内容
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
.data
str1 db '信息框测试!--------123456',0
str2 db '信息框标题!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
_NewCallAPI proc ;此构造缺点是,你不能随便申请一个与CALL无关的局部变量
local utype,lpcption,lptext,hwnd,MessageBoxret ;申请API局部变量参数要倒着来,返回地址写最后
local lpModuleHandle,GetModuleHandleret
mov ecx,7 ;局部变量个数,必需是DD类的
xor eax,eax
push edi
lea edi,GetModuleHandleret
rep stosd ;初始化局部变量值
pop edi
mov lpModuleHandle,0
mov utype,MB_YESNO
mov lpcption,offset str2
mov lptext,offset str1
mov GetModuleHandleret,a123
push GetModuleHandle
retn
a123:
mov eax,eax
mov MessageBoxret,$+13
push MessageBox
retn
;push ExitProcess
;retn
leave
retn
_NewCallAPI endp
start:
invoke _NewCallAPI
invoke ExitProcess,NULL
end start
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
mark。。。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
mark 以后学习下
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
实际上是做一个压栈后的堆栈状态~~~~~,直接add esp -n , mov [esp],xxxxxxxx , mov [esp+4],xxxxxxxx........push xxxxxxxx , retn 不是更方便~~
|
能力值:
( LV3,RANK:20 )
|
-
-
20 楼
间接的push与间接的call
|
|
|