-
-
[旧帖] [分享][分享]2.1.1、CALL的概念(远程调用CALL) 0.00雪花
-
发表于: 2012-8-11 00:33 1983
-
近期学习上稍作改动,利用工作之余把郁金香的课程好好学完先。知识在于积累,可能我写的内容很简单,希望大牛们不要嘲笑我。
2.1.1、CALL的概念(远程调用CALL)
a、写个调用示例(假想游戏客户端)
b、用OD找CALL,初探(用OD找出我们自己写的CALL)
C、代码注入器,远程CALL调用
a.开始写我们的假想游戏客户端:
1.打开VC6.0,新建一个基于对话框的MFC可执行程序的工程,删除上面所有附带的控件,然后加入一个编辑框,和两个Button按钮。将编辑框关联一个控件类型的变量m_edt1。
2.从界面右键->“Events”->WM_INITDIALOG,进入界面的初始化程序部分,找到下面一行代码:
// TODO: Add extra initialization here
这个地方,我们添加如下代码:
char s[33];
itoa(BoolValue,s,10); // 整型 转 字符串.
m_edt1.SetWindowText(s);
其中, BoolValue 为我们的血值,把它定义到程序的最顶部去:
int BoolValue=3000; // 血值.
然后F7编译,F5执行,就可以看到一个对话框跳出来,编辑框里面显示的3000.
3.接下来,我们实现加血和减血的功能,把界面的两个控件分别改成“加血”和“减血”。
双击"加血"按钮,进入程序编辑模式,我们在此函数外面再写一个单独的加血函数,如下:
void addBlood()
{
char s[33];
BoolValue+=22;
itoa(BoolValue,s,10); // 整型 转 字符串.
m_edt1.SetWindowText(s);
}
然后在我们的 void CMyGameDlg::OnButton1() 函数里面加入: addBlood();
编译,会出现报错。这个是因为我们在 addBlood()函数里面直接调用了类的成员变量m_edt1,基于这点,我们需要将这个编辑框导出成对象来操作。
在全局定义出处,定义我们想构建的对象: HWND edit_hwnd;
然后,在 BOOL CMyGameDlg::OnInitDialog()函数的末尾,加入: edit_hwnd=m_edt1.m_hWnd;
来给我们的对象赋值。
最后将我们的addBlood()函数重写为:
void addBlood()
{
char s[33];
BoolValue+=22;
itoa(BoolValue,s,10); // 整型 转 字符串.
SetWindowText(edit_hwnd,s);
}
编译,执行,点击"加血",就可以看到效果了。(血值,每次点击增加22)。
4.用同样的方法,我们加入"减血"的功能。双击"减血"功能按钮,进入代码编辑模式,写一个单独的减血函数,如下:
void decBlood()
{
char s[33];
BoolValue-=22;
itoa(BoolValue,s,10); // 整型 转 字符串.
SetWindowText(edit_hwnd,s);
}
然后在我们的 void CMyGameDlg::OnButton1() 函数里面加入: decBlood();
编译,执行,点击"减血",就可以看到效果了。(血值,每次点击减少22)。
这样,我们的假想游戏客户端就算完成了。
b、用OD找CALL,初探(用OD找出我们自己写的CALL)
1.先用Cheat_Engine找到血值变量的基址。
运行我们写好的程序,然后打开Cheat_Engine,然后绑定我们程序的进程,在数值里面输入3000,回车,就可以看到左侧,已经找到两处了:然后点击"加血",可以看到有一个基址对应的数值在变动,而且是增加了22,说明这个就是我们需要找到的变量了。我找到的是:0x004166B0.
好了,把这个地址记好,就可以关掉Cheat_Engine和我们的程序了。
2.用OD查找CALL:
首先用OD载入我们的程序,在OD的底部有一个Command的命令行输入框,我们输入:
hw 4166B0 ,然后回车,这样我们就成功下了一个硬件断点。好的运行程序,点击加血,发现OD跳转了,找到函数的头部,是00402360,然后打开OD工具栏里面的代码注入器,输入:
call 402360 ,选择目标进程,注入远程代码,就可以看到,每点击一次"注入远程代码",就会加血一次。
用同样的方法找出"减血"的CALL,为: call 4023d0 .
C、代码注入器,远程CALL调用
上面的操作,我们是用的工具栏里面的“代码注入器”,其实其实现函数为 :
HANDLE CreateRemoteThread(
HANDLE hProcess, // OpenProcess
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全结构指针 NULL
DWORD dwStackSize, // 0
LPTHREAD_START_ROUTINE lpStartAddress, // 指向我们的CALL 地址
LPVOID lpParameter, // 传递的参数指针 NULL
DWORD dwCreationFlags, // 0
LPDWORD lpThreadId // 返回一个 线程ID标识
);
好啦,我今天就这么多,算是一份学习后交的作业吧。
2.1.1、CALL的概念(远程调用CALL)
a、写个调用示例(假想游戏客户端)
b、用OD找CALL,初探(用OD找出我们自己写的CALL)
C、代码注入器,远程CALL调用
a.开始写我们的假想游戏客户端:
1.打开VC6.0,新建一个基于对话框的MFC可执行程序的工程,删除上面所有附带的控件,然后加入一个编辑框,和两个Button按钮。将编辑框关联一个控件类型的变量m_edt1。
2.从界面右键->“Events”->WM_INITDIALOG,进入界面的初始化程序部分,找到下面一行代码:
// TODO: Add extra initialization here
这个地方,我们添加如下代码:
char s[33];
itoa(BoolValue,s,10); // 整型 转 字符串.
m_edt1.SetWindowText(s);
其中, BoolValue 为我们的血值,把它定义到程序的最顶部去:
int BoolValue=3000; // 血值.
然后F7编译,F5执行,就可以看到一个对话框跳出来,编辑框里面显示的3000.
3.接下来,我们实现加血和减血的功能,把界面的两个控件分别改成“加血”和“减血”。
双击"加血"按钮,进入程序编辑模式,我们在此函数外面再写一个单独的加血函数,如下:
void addBlood()
{
char s[33];
BoolValue+=22;
itoa(BoolValue,s,10); // 整型 转 字符串.
m_edt1.SetWindowText(s);
}
然后在我们的 void CMyGameDlg::OnButton1() 函数里面加入: addBlood();
编译,会出现报错。这个是因为我们在 addBlood()函数里面直接调用了类的成员变量m_edt1,基于这点,我们需要将这个编辑框导出成对象来操作。
在全局定义出处,定义我们想构建的对象: HWND edit_hwnd;
然后,在 BOOL CMyGameDlg::OnInitDialog()函数的末尾,加入: edit_hwnd=m_edt1.m_hWnd;
来给我们的对象赋值。
最后将我们的addBlood()函数重写为:
void addBlood()
{
char s[33];
BoolValue+=22;
itoa(BoolValue,s,10); // 整型 转 字符串.
SetWindowText(edit_hwnd,s);
}
编译,执行,点击"加血",就可以看到效果了。(血值,每次点击增加22)。
4.用同样的方法,我们加入"减血"的功能。双击"减血"功能按钮,进入代码编辑模式,写一个单独的减血函数,如下:
void decBlood()
{
char s[33];
BoolValue-=22;
itoa(BoolValue,s,10); // 整型 转 字符串.
SetWindowText(edit_hwnd,s);
}
然后在我们的 void CMyGameDlg::OnButton1() 函数里面加入: decBlood();
编译,执行,点击"减血",就可以看到效果了。(血值,每次点击减少22)。
这样,我们的假想游戏客户端就算完成了。
b、用OD找CALL,初探(用OD找出我们自己写的CALL)
1.先用Cheat_Engine找到血值变量的基址。
运行我们写好的程序,然后打开Cheat_Engine,然后绑定我们程序的进程,在数值里面输入3000,回车,就可以看到左侧,已经找到两处了:然后点击"加血",可以看到有一个基址对应的数值在变动,而且是增加了22,说明这个就是我们需要找到的变量了。我找到的是:0x004166B0.
好了,把这个地址记好,就可以关掉Cheat_Engine和我们的程序了。
2.用OD查找CALL:
首先用OD载入我们的程序,在OD的底部有一个Command的命令行输入框,我们输入:
hw 4166B0 ,然后回车,这样我们就成功下了一个硬件断点。好的运行程序,点击加血,发现OD跳转了,找到函数的头部,是00402360,然后打开OD工具栏里面的代码注入器,输入:
call 402360 ,选择目标进程,注入远程代码,就可以看到,每点击一次"注入远程代码",就会加血一次。
用同样的方法找出"减血"的CALL,为: call 4023d0 .
C、代码注入器,远程CALL调用
上面的操作,我们是用的工具栏里面的“代码注入器”,其实其实现函数为 :
HANDLE CreateRemoteThread(
HANDLE hProcess, // OpenProcess
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全结构指针 NULL
DWORD dwStackSize, // 0
LPTHREAD_START_ROUTINE lpStartAddress, // 指向我们的CALL 地址
LPVOID lpParameter, // 传递的参数指针 NULL
DWORD dwCreationFlags, // 0
LPDWORD lpThreadId // 返回一个 线程ID标识
);
好啦,我今天就这么多,算是一份学习后交的作业吧。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
看原图
赞赏
雪币:
留言: