文章目录

打开IDA
从桌面打开IDA

选择文件(我一般选择Go比较多,因为拖拽的方式太方便了)



搜索弹窗的字符串
打开字符串窗口
快捷键是 Shift+F12

设置字符串的类型
按截图上的设置即可,否则不显示中文。
(注意的是:不是所有的字符串都能搜索,遇到字符串加密或者非硬编码字符串就无法搜索到)

搜索字符串
输入 过期 第一个就是,双击进入

显示中文字符串
双击后是乱码,因为没有设置字符串编码
设置字符串编码
打开菜单 Options - String Literals…
快捷键是 Alt+A

选择 Unicode C-style


查找字符串引用
右键字符串 asc_4EEC9C ,选择 Jump to xref to operand…(快捷键是X) ,就能看到引用该字符串的代码

这里有两个引用了该字符串,弹窗是 第二个

分析汇编代码
看了下这是个弹窗函数,所以还需要找调用该函数的地方
右键函数头再按 X ,找到调用的代码

为了方便分析,可以增加 注释

按 F5 生成伪代码

对应的汇编代码

显示字节码
没有显示字节码就需要手动设置一下
打开菜单 Options - General
在 Number of opcode bytes (non-graph) 填写 9 ,点 OK 完成


写代码修改字节码
有了地址跟字节码,就可以自由发挥了!
之前改过一个,所以就拿之前的代码来用了。
先根据 字节码 定位 地址 ,然后对 地址 写入 修改的字节码 。

示例代码:CPP
// 扫描过期窗口地址
// 83 BE 1C 1A 00 00 00
BYTE expiration_window_buffer[]{ 0x83, 0xBE, 0x1C, 0x1A, 0x00, 0x00, 0x00 };
temp_address = MemorySearch((BYTE*)game_data, expiration_window_buffer, image_size, sizeof(expiration_window_buffer));
if (temp_address == NULL)
{
cout << "Error: 无法找到<过期窗口>数据..." << endl;
free(game_data);
CloseHandle(process_handle); // 找不到模块,关闭进程句柄
system("pause");
return 0;
}
expiration_window_address = (DWORD)temp_address - (DWORD)game_data + (DWORD)module_info.lpBaseOfDll + 0xA;
// -> 屏蔽登录时过期窗口
address = expiration_window_address;
BYTE code6[] = { 0xEB };
if (WriteProcessMemory(process_handle, (LPVOID)address, &code6, sizeof(code6), nullptr)) cout << "Success: 屏蔽过期窗口成功" << endl;
else cout << "Error: 屏蔽过期窗口失败 错误代码->" << GetLastError() << endl;
版权声明:本文为qq_39277419原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。