能力值:
( LV12,RANK:210 )
|
-
-
2 楼
本来昨天晚上就应该发出来,可惜学校停电了~~
今天早晨起来看了笨笨雄老大的程序,真让人自叹不如哦~~~~
看来我们还要继续努力了~~~~
我还是帖出来我的方法吧,大家别笑话我`~~
#include <windows.h>
#include<stdio.h>
#include<stdafx.h>
//...由于难度增加可以适当在这里加些代码
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
char* str="hello world\n";
//...这里添加代码,让IDA打开后不能直接看到调用的是MessageBoxA这个函数
(*(int (__cdecl *)(HWND,LPCTSTR,LPCTSTR,UINT))((DWORD)MoveWindow+0x3299E))(0,str,0,0);
return 0;
}
这样写程序会有异常,我也没有找到问题在哪里,可能是我用函数指针的时候,转换的有问题吧`~(C没有学好,丢人了~~ )
所以,我用汇编写了一个没有问题的:
#include <windows.h>
#include<stdio.h>
#include<stdafx.h>
//...由于难度增加可以适当在这里加些代码
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
char* str="hello world\n";
//...这里添加代码,让IDA打开后不能直接看到调用的是MessageBoxA这个函数
_asm{
pushad;
mov eax,MoveWindow;
add eax,0x3299E;
push 0;
push 0;
push str;
push 0;
call eax;
}
return 0;
}
方法是这样的!
我先用OD调了USER32.DLL,纪录了下面的信息:
名称位于 USER32, 条目 676 地址=77D1DBEC 区段=.text 类型=输出 (已知) 名称=MoveWindow
名称位于 USER32, 条目 660 地址=77D5058A 区段=.text 类型=输出 (已知) 名称=MessageBoxA 于是就有了上面的程序~
|
能力值:
(RANK:570 )
|
-
-
3 楼
char*str="hello world\n";
typedef VOID (CALLBACK *MYMSGBOX)( __in_opt HWND hWnd,
__in_opt LPCSTR lpText,
__in_opt LPCSTR lpCaption,
__in UINT uType);
char szApiName[] = "\x0MessageBoxA";
char szLibName[] = "\x0user32.dll";
#define MessageBoxA(a,b,c,d) MYMSGBOX myMsgBox = (MYMSGBOX)GetProcAddress(LoadLibraryA(&szLibName[1]), &szApiName[1]); \
myMsgBox(a,b,c,d);
MessageBoxA(0,str,0,0);
|
能力值:
( LV12,RANK:1010 )
|
-
-
4 楼
学习~
|
能力值:
(RANK:1060 )
|
-
-
5 楼
#include <windows.h>
#include <stdio.h>
//...由于难度增加可以适当在这里加些代码
void main()
{
char* str="hello world\n";
//...这里添加代码,让IDA打开后不能直接看到调用的是MessageBoxA这个函数
return;
MessageBoxA(0,str,0,0);
}
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
return太强了
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
笨笨雄
果然不简单,这么快就能完成。可不是一般的人啦
我认为这题是比第一题难度要高的。你的答案,我能说什么呢。顶
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
美丽破船
也是很强啦
(*(int (__cdecl *)(HWND,LPCTSTR,LPCTSTR,UINT))((DWORD)MoveWindow+0x3299E))(0,str,0,0);
__cdecl 改成 __stdcall
用你的原理帮你改好点
#include <windows.h>
#include <stdio.h>
typedef int (__stdcall *MyMessageBoxA)(HANDLE hWnd,char* lpText,char* lpCaption,UINT uType);
void main()
{
char* str="hello world\n";
DWORD MsgAddress;
_asm{
mov eax,MoveWindow;
add eax,0x3299E;
mov MsgAddress,eax
}
MyMessageBoxA MessageBoxA=(MyMessageBoxA)MsgAddress;
MessageBoxA(0,str,0,0);
}
|
能力值:
( LV9,RANK:180 )
|
-
-
9 楼
int main()
{
char *str="hello world\n";
masm {
call $+5
pop eax
add eax, 6
jmp eax
}
MessageBoxA(0,str,0,0);
}
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
sessiondiy 的方法很妙
masm 改 __asm
我想你原是想这样的,right?
|
能力值:
(RANK:280 )
|
-
-
11 楼
如果只是跳转到下一条指令,IDA第二次深度分析代码的时候还是会显示的函数调用的,这时候JMP EAX之后的的下一个字节会自动被测试是否为合法的opcode
下面的代码会使得IDA把之后的调用视为数据处理
_asm {
call $+5
add dword ptr [esp], 0x0B
jmp short $+3
jmp $+0xFFFFFFC8
}
|
能力值:
( LV11,RANK:188 )
|
-
-
12 楼
膜拜forget。。
试了试在USER32里面找个 CALL MessageBoxW玩,觉得还是会搜到,罢
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
mstwugui
又见证了新的方法
不同的编程技术经验有不同的方法 不同的代码
向你学习啦
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
学习一下。。。
|
能力值:
(RANK:570 )
|
-
-
15 楼
我也是来学习的
|
能力值:
( LV12,RANK:760 )
|
-
-
16 楼
用脚本可以成功去花~~
对抗去花脚本的才行~~
|
能力值:
(RANK:280 )
|
-
-
17 楼
我们应该是只是在讨论两句代码中插入的问题,前提是不改变之前和之后的代码,#define是一种很有意思的思路,另一种思路应该就是用花指令欺骗IDA
这个问题如果考虑脚本的话那就几乎没有意义了,理论上说任何代码如果要保持原始功能都可以用脚本分析绕过或翻译出来
|
能力值:
( LV15,RANK:2473 )
|
-
-
18 楼
#include <windows.h>
#include <stdio.h>
//...由于难度增加可以适当在这里加些代码
extern "C" void mainCRTStartup()
{
ExitProcess(0);
}
void main()
{
char* str="hello world\n";
//...这里添加代码,让IDA打开后不能直接看到调用的是MessageBoxA这个函数
MessageBoxA(0,str,0,0);
}
|
能力值:
( LV12,RANK:210 )
|
-
-
19 楼
越来越精彩了`
|
能力值:
( LV12,RANK:760 )
|
-
-
20 楼
太黄了~~
XX黄~~
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
#include <windows.h>
#include <stdio.h>
//...由于难度增加可以适当在这里加些代码
void main()
{
char* str="hello world\n";
//...这里添加代码,让IDA打开后不能直接看到调用的是MessageBoxA这个函数
void * Addr ; //---------
DWORD old; //此段
_asm{ //作用:
call next //修改
next: //代码
pop ebx //段为
mov Addr, ebx //可写
} //
VirtualProtect(Addr, 0x1000, PAGE_EXECUTE_READWRITE, &old);//-----------
_asm{ //=========
mov word ptr[ebx+0x1f], 0x9090; //nop掉后面2个字节
//debug 版为 ebx+0x29 //
_emit 0xeb //扰乱ida分析
_emit 0x10 //的关键2个字节
} //========
MessageBoxA(0,str,0,0);
}
窃以为,第二题与第一题区别在于,一个是数据,一个是代码,而代码段与数据段不同,默认不可写。
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
expmonking
well done
这题还有好几种答案,当初我定题之时分析了好几种
有些你们做出了,有些我还未见到 有些是我没做过的
多研究点,期待你的成功.
我很希望能在这里看到更让人佩服的答案
大家相互学习
我的答案如果没有人做出,我曾在周未之后帖出
之后进行出第三题,还有好几天时间有不明白别人帖出的答案的
你学习一下,最好问他本人,这比我回答好多啦keep moving
|
能力值:
( LV5,RANK:70 )
|
-
-
23 楼
来迟了,贴一下我做的,也是用的#define #include <windows.h>
#include <stdio.h>
//...由于难度增加可以适当在这里加些代码
int Mess(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)
{
return MessageBox(hWnd, lpText, lpCaption, uType);
}
#define MessageBoxA(hWnd,lpText,lpCaption,uType) Mess((hWnd),(lpText),(lpCaption), (uType)); void main()
{
char* str="hello world\n";
//...这里添加代码,让IDA打开后不能直接看到调用的是MessageBoxA这个函数
MessageBoxA(0,str,0,0);
}
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
加花指令吧,呵呵
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
很多高手都帖出了不同的答案,让大家互相学习了
原说过这题有多种答案,下面我列出了上面没有的另一种
#include <windows.h>
#include <stdio.h>
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
}UNICODE_STRING,*PUNICODE_STRING;
int MsgBoxAddr(ULONG ebp_00,ULONG ebp_04,ULONG ebp_08,ULONG ebp_0c,
ULONG* ebp_10,ULONG ebp_14,ULONG* ebp_18)
{
int status;
_asm
{
mov eax,ebp_00
lea edx,ebp_04
int 0x2E
mov status,eax
}
return status;
}
int MessageBoxA(HWND hWnd,char* lpText,char* lpCaption,UINT uType)
{
ULONG Msg[] = {0,0,0};
ULONG ReturnValue;
UNICODE_STRING Text;
UNICODE_STRING Caption;
wchar_t m_Text[128];
mbstowcs(m_Text,lpText,128);
Text.Buffer=m_Text;
Text.Length=24;
Text.MaximumLength=24;
Caption.Buffer=L"";
Caption.Length=0;
Caption.MaximumLength=0;
Msg[0] = (ULONG)&Text;
Msg[1] = (ULONG)&Caption;
return MsgBoxAddr(0xB6,0x50000018,3,3,Msg,0,&ReturnValue);
}
void main()
{
char* str="hello world\n";
MessageBoxA(0,str,0,0);
}
如果还有那位高手有不同的答案代码,欢迎跟帖
第三题将会出现 keep moving
|
|
|