首页
社区
课程
招聘
[讨论]反逆向学习(2)
2008-8-31 21:13 15576

[讨论]反逆向学习(2)

2008-8-31 21:13
15576

第二题出来啦,我认为有点难度哦 keep moving

#include <windows.h>
#include <stdio.h>

//...由于难度增加可以适当在这里加些代码

void main()
{
         char* str="hello world\n";

         //...这里添加代码,让IDA打开后不能直接看到调用的是MessageBoxA这个函数

         MessageBoxA(0,str,0,0);
}
跟帖写上你的答案

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞7
打赏
分享
最新回复 (25)
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
美丽破船 5 2008-8-31 21:17
2
0
本来昨天晚上就应该发出来,可惜学校停电了~~
今天早晨起来看了笨笨雄老大的程序,真让人自叹不如哦~~~~
看来我们还要继续努力了~~~~
我还是帖出来我的方法吧,大家别笑话我`~~
#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
于是就有了上面的程序~
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2008-8-31 22:13
3
0
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);
雪    币: 709
活跃值: (2240)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 25 2008-8-31 22:31
4
0
学习~
雪    币: 6073
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2008-8-31 22:31
5
0
#include <windows.h>
#include <stdio.h>

//...由于难度增加可以适当在这里加些代码

void main()
{
         char* str="hello world\n";

         //...这里添加代码,让IDA打开后不能直接看到调用的是MessageBoxA这个函数

         return;

         MessageBoxA(0,str,0,0);
}
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lOOp 2008-8-31 22:53
6
0
return太强了
雪    币: 342
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
haras 2008-8-31 23:03
7
0
笨笨雄
果然不简单,这么快就能完成。可不是一般的人啦
我认为这题是比第一题难度要高的。你的答案,我能说什么呢。顶
雪    币: 342
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
haras 2008-9-1 09:59
8
0
美丽破船
也是很强啦


        (*(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);
}
雪    币: 2071
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
sessiondiy 4 2008-9-1 10:26
9
0
int main()
{
  char *str="hello world\n";
  masm {
  call  $+5
  pop   eax
  add   eax, 6
  jmp   eax
  }  
  MessageBoxA(0,str,0,0);
}
雪    币: 342
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
haras 2008-9-1 10:38
10
0
sessiondiy 的方法很妙

masm __asm

我想你原是想这样的,right?
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
mstwugui 6 2008-9-1 11:54
11
0
如果只是跳转到下一条指令,IDA第二次深度分析代码的时候还是会显示的函数调用的,这时候JMP EAX之后的的下一个字节会自动被测试是否为合法的opcode

下面的代码会使得IDA把之后的调用视为数据处理
_asm {
        call                $+5
        add    dword ptr    [esp], 0x0B
        jmp    short        $+3
        jmp                 $+0xFFFFFFC8
}
雪    币: 242
活跃值: (418)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
XPoy 3 2008-9-1 12:13
12
0
膜拜forget。。

试了试在USER32里面找个 CALL MessageBoxW玩,觉得还是会搜到,罢
雪    币: 342
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
haras 2008-9-1 13:05
13
0
mstwugui

又见证了新的方法
不同的编程技术经验有不同的方法 不同的代码
向你学习啦
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lOOp 2008-9-1 13:21
14
0
学习一下。。。
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2008-9-1 14:33
15
0
我也是来学习的
雪    币: 8861
活跃值: (2369)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2008-9-1 16:15
16
0
用脚本可以成功去花~~

对抗去花脚本的才行~~
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
mstwugui 6 2008-9-1 16:31
17
0
我们应该是只是在讨论两句代码中插入的问题,前提是不改变之前和之后的代码,#define是一种很有意思的思路,另一种思路应该就是用花指令欺骗IDA
这个问题如果考虑脚本的话那就几乎没有意义了,理论上说任何代码如果要保持原始功能都可以用脚本分析绕过或翻译出来
雪    币: 8188
活跃值: (4243)
能力值: ( LV15,RANK:2459 )
在线值:
发帖
回帖
粉丝
ccfer 16 2008-9-1 17:28
18
0
#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);
}
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
美丽破船 5 2008-9-1 18:56
19
0
越来越精彩了`
雪    币: 8861
活跃值: (2369)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2008-9-1 20:33
20
0
太黄了~~
XX黄~~
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
expmonking 2008-9-2 08:54
21
0
#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);
}

窃以为,第二题与第一题区别在于,一个是数据,一个是代码,而代码段与数据段不同,默认不可写。
雪    币: 342
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
haras 2008-9-2 23:10
22
0
expmonking
well done
这题还有好几种答案,当初我定题之时分析了好几种
有些你们做出了,有些我还未见到 有些是我没做过的
多研究点,期待你的成功.
我很希望能在这里看到更让人佩服的答案
大家相互学习
我的答案如果没有人做出,我曾在周未之后帖出
之后进行出第三题,还有好几天时间有不明白别人帖出的答案的
你学习一下,最好问他本人,这比我回答好多啦keep moving
雪    币: 62
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
creakerzgz 1 2008-9-3 21:07
23
0
来迟了,贴一下我做的,也是用的#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);
}
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
龙星 2008-9-4 14:36
24
0
加花指令吧,呵呵
雪    币: 342
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
haras 2008-9-5 18:26
25
0
很多高手都帖出了不同的答案,让大家互相学习了
原说过这题有多种答案,下面我列出了上面没有的另一种

#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
游客
登录 | 注册 方可回帖
返回