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 不能这样写


网上也查了许多 虽然有 这样的问题 但是 没有解决 办法
不知 该如何写
...全文
172 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:[地址] 这样写不行

1,649

社区成员

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

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