vc++【内联汇编】如何传递全局变量的值

AINID 2019-01-07 11:21:53
以下代码 是 用在 "xxx.exe" 其他进程的 远程注入用

int dizhi; //全局变量 读取数据 存放给 dizhi

dizhi = 一级偏移 - 77; // dizhi= 十六进制为"02311C03" 此值 会变化 读取一次 变化一次.
-------------------------------------------------------------------------------------
下面是我尝试的写法 都不行,
void usegoods()
{
_asm
{
错误1
mov eax, dizhi
这样写 不行, 在 "xxx.exe" 反汇编查看 等于 mov eax,[0032657C]----0032657C 此地址 是自身进程里的全局变量地址 而不是我想要的 02311C03
[0032657C]里面的值 不是 02311C03。
错误2:
mov eax, OFFSET dizhi
和上面结果一样 只是没有 mov eax,0032657C,方框号
}
}
//申请内存空间
LPVOID callbase = VirtualAllocEx(hprocess, NULL, 0x3000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
//写入数据
::WriteProcessMemory(hprocess, callbase, usegoods, 0x3000, 0))
DWORD tid;
//远程创建
CreateRemoteThread(hprocess, NULL, 0, (LPTHREAD_START_ROUTINE)callbase, 0, 0, &tid);

全局变量的值 是变化的 所以不能用 常量
人物基址 是 “模块+偏移” ------不能写固定的 如 #define 人物基址 0x 0059E3B0
int dizhi = 0x2311C03; 不能这样写
#define dizhi 0x2311C03 不能这样写


网上也查了许多 虽然有 这样的问题 但是 没有解决 办法
不知 该如何写
...全文
230 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2019-01-09
  • 打赏
  • 举报
回复
如果你的dll没有注入目标exe进程 , 那你你读写数据 , 都只能使用远程访问API, 不能直接访问内存地址. 如果你的dll已经注入到目标exe的进程中, 那么, 你是可以直接访问它的内存地址的, 就不需要你这个的代码了. 要游戏基址可配置, 完全可以用配置文件啊, 在你的dll模块中动态加载就行了. 动态加载 方式 就很多了. 最简单的就是配置文件, 高级点就是自己搜索游戏内存, 使用特征代码来搜索基地址.
schlafenhamster 2019-01-08
  • 打赏
  • 举报
回复
例子

LPMYLVITEM CRemoteListCtrlDlg::RemoteLVGetItem(int index,HWND hLvWnd)
{//
m_hHdWnd=ListView_GetHeader(m_hLvWnd);
int nColumn=::SendMessage(m_hHdWnd,HDM_GETITEMCOUNT,0,0);
// Get hProcess
DWORD pid;
GetWindowThreadProcessId(m_hLvWnd,&pid);
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
//
LPMYLVITEM pRemoteItem = (LPMYLVITEM)VirtualAllocEx(hProcess, NULL, nColumn*sizeof(MYLVITEM), MEM_COMMIT, PAGE_READWRITE);
if (!pRemoteItem)
{
::MessageBox(NULL, "无法分配内存!", "错误!", NULL);
CloseHandle(hProcess);
return 0;
}
// local
LPMYLVITEM pLocalItem=new MYLVITEM[nColumn];
memset(pLocalItem,0,nColumn*sizeof(MYLVITEM));
for(int i=0; i<nColumn; i++)
{
pLocalItem[i].oldItem.mask=LVIF_TEXT | LVIF_STATE;//
pLocalItem[i].oldItem.iItem=index;//
pLocalItem[i].oldItem.iSubItem=i; //
pLocalItem[i].oldItem.cchTextMax=80;
pLocalItem[i].oldItem.pszText=pRemoteItem[i].text;// not pLocalItem[i].text
if(!WriteProcessMemory(hProcess, &pRemoteItem[i], &pLocalItem[i], sizeof(MYLVITEM), NULL))
{
::MessageBox(NULL, "WriteProcessMemory!", "错误!", NULL);
CloseHandle(hProcess);
return 0;
}
ListView_GetItem(m_hLvWnd,&pRemoteItem[i]);
// ::SendMessage(m_hLvWnd, LVM_GETITEM, (WPARAM)i, (LPARAM)&pRemoteItem[i]);
if(!ReadProcessMemory(hProcess, &pRemoteItem[i], &pLocalItem[i], sizeof(MYLVITEM), NULL))
{
::MessageBox(NULL, "ReadProcessMemory!", "错误!", NULL);
CloseHandle(hProcess);
return 0;
}
// !!!
pLocalItem[i].oldItem.pszText=pLocalItem[i].text;
// afxDump << pLocalItem[i].text << "\n";
}
//释放内存
CloseHandle(hProcess);
VirtualFreeEx(hProcess, pRemoteItem , 0, MEM_RELEASE);
return pLocalItem;
}
蒋晟 2019-01-08
  • 打赏
  • 举报
回复
注入DLL的时候给DLL传参都是这么干的……随便找个注入DLL的示例就行了。
schlafenhamster 2019-01-07
  • 打赏
  • 举报
回复
那 ds ? 即 申请的内存地址 的 基地址 ?
AINID 2019-01-07
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
"其他进程的"
不是一个 地址空间 !



是的 那怎么解决呢


我也试了 在"其他进程"申请一块内存-- 把全局变量的值 写进去
但是 到 _asm
{
mov eax, [申请的内存地址]//在其他进程 查看 还是不行
}

schlafenhamster 2019-01-07
  • 打赏
  • 举报
回复
"其他进程的"
不是一个 地址空间 !
AINID 2019-01-07
  • 打赏
  • 举报
回复
引用 5 楼 zgl7903 的回复:
CreateRemoteThread 不是可以传递参数么? 而且线程也接收参数的呀 DWORD WINAPI ThreadProc( _In_ LPVOID lpParameter );
个人想法 在注入进程中分配内存,并写入参数, CreateRemoteThread 将分配的内存的地址传递进去,线程中依据这个地址去取


能给个 例子?

zgl7903 2019-01-07
  • 打赏
  • 举报
回复
CreateRemoteThread 不是可以传递参数么? 而且线程也接收参数的呀 DWORD WINAPI ThreadProc( _In_ LPVOID lpParameter );
个人想法 在注入进程中分配内存,并写入参数, CreateRemoteThread 将分配的内存的地址传递进去,线程中依据这个地址去取




AINID 2019-01-07
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
那 ds ? 即 申请的内存地址 的 基地址 ?



申请的内存地址 的 基地址
mov eax,0x02311C03 这样写 重开程序 这个地址就没用了


mov eax, dword ptr ds:[地址] 这样写不行
代码转载自:https://pan.quark.cn/s/8ce4326d996e 对于在 CentOS 7 系统中修改网卡配置文件后无法使设置生效的情况,经过实践验证,可以通过使用 nmcli 命令来进行调整。完成修改之后,需要重新启动虚拟机以使更改生效,这样操作流程即告完成。如果设置仍然无法生效,则表明虚拟机在启动过程中所获取的 IP 地址配置并非针对 eth0,此时可以对其它网卡的配置文件进行修改或将其移除。在 CentOS 7 系统中,网络配置的管理机制与早期版本存在差异,主要体现为采用了 Network Manager 服务来负责网络接口的管理。在某些情形下,尽管修改了 `/etc/sysconfig/network-scripts` 目录下的 `ifcfg-eth0` 文件,但网络配置却未能即时生效。此类问题的发生通常源于 CentOS 7 采用了不同于以往的配置读取方法。接下来将具体阐述如何借助 nmcli 命令来处理这一挑战。 以 root 用户身份登录系统并打开终端界面。nmcli 是 Network Manager 提供的命令行界面工具,它支持在命令行环境下执行网络连接的建立、编辑、查询及管理任务。针对修改 eth0 网卡配置的需求,可以遵循以下步骤进行操作: 1. 导航至 `/etc/sysconfig/network-scripts` 目录: ``` cd /etc/sysconfig/network-scripts ``` 2. 检查该目录内是否存在 `ifcfg-eth0.bak` 文件,该备份文件可能是先前调整配置时遗留下来的,若存在可能造成冲突。若发现该文件,可以选择将其删除: ``` [root@localhost netw...

1,662

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧