我为安卓系统制作了一个快速而简单的WPM (WriteProcessMemory)。任何建议都是欢迎的。
bool bChangedProtect;
cout << search_results[cur_result].size() << " found.\n" << endl;
for (int xy = 0; xy < search_results[cur_result].size(); xy++)
{
bChangedProtect = false;
if (ReadProcessMemory(phandle,(void*)search_results[cur_result][xy],&sResult,8,nullptr) == 8)
{
if (sResult==double_val)
{
cout <<"item #" << xy << "\t";
if (VirtualQueryEx(phandle, (void*)search_results[cur_result][xy], &mBI, sizeof(MEMORY_BASIC_INFORMATION)))
{
if ((mBI.Protect & PAGE_WRITECOPY) || (mBI.Protect & PAGE_EXECUTE_WRITECOPY))
{
cout << hex << search_results[cur_result][xy] << " was WRITE_COPY or EXEC_WRITE_COPY ..skipping, just because." << endl;
continue;
}
else if ((mBI.Protect & PAGE_EXECUTE) || (mBI.Protect & PAGE_EXECUTE_READ))
{
if (VirtualProtectEx(phandle,(void*)search_results[cur_result][xy],8,PAGE_EXECUTE_READWRITE,&OLDPROTECT))
{
cout << hex << search_results[cur_result][xy] << " Was EXEC or EXEC_R --> VirtualProtectEx(EXEC_RW) SUCCESS" << endl;
bChangedProtect = true;
}
else
{
cout << hex << search_results[cur_result][xy] << " Was EXEC or EXEC_R --> VirtualProtectEx(EXEC_RW) FAIL. skipping write." << endl;
continue;
}
}
else if (mBI.Protect & PAGE_READONLY)
{
if (VirtualProtectEx(phandle, (void*)search_results[cur_result][xy],8,PAGE_READWRITE,&OLDPROTECT))
{
cout << hex << search_results[cur_result][xy] << " Was READ_ONLY --> VirtualProtectEx(READ_WRITE) SUCCESS" << endl;
bChangedProtect = true;
}
else
{
cout << hex << search_results[cur_result][xy] << " Was READ_ONLY --> VirtualProtectEx(READ_WRITE) FAIL. skipping write." << endl;
continue;
}
}
//if we get here, apparently it's writable (and not copy-forward).
if (!bChangedProtect)
cout << hex << search_results[cur_result][xy]; //will be first time we show the addr. todo: re-work logic because this feels awkward.
if (WriteProcessMemory(phandle,(void*)search_results[cur_result][xy],&double_ans,8,nullptr))
{
cout << " WriteProcessMemory() OK!" << endl;
}
else
{
cout << " WriteProcessMemory() FAIL!" << endl;
if (VirtualQueryEx(phandle,(void*)search_results[cur_result][xy],&mBI,sizeof(MEMORY_BASIC_INFORMATION)))
{
cout <<"Current Protect: " << hex << mBI.Protect << endl;
}
else
{
cout <<"Current Protect: Unknown. VirtualQueryEx() Failed -- but why? -- does this happen?" << endl;
}
}
if (bChangedProtect)
{
DWORD idk = 0;
if (VirtualProtectEx(phandle,(void*)search_results[cur_result][xy],8,OLDPROTECT,&idk)) //not sure if you should use same var for old and new protect. will it set 'oldProtect' to the old protection before writing. is a temporary used? idk. try if you care.
{
cout << hex << search_results[cur_result][xy] << " VirtualProtectEx(ORIG) SUCCESS" << endl;
}
else
{
cout << hex << search_results[cur_result][xy] << " VirtualProtectEx(ORIG) FAIL -- does this happen?" << endl;
}
}
}
else
{
cout <<"VirtualQueryEx FAILED for " << hex << search_results[cur_result][xy] << ". Skipping." << endl;
}
}
else
{
cout << hex << search_results[cur_result][xy] << " sResult != double_val ... It was when we scanned, but not now. Skipped." << endl;
}
}
else
{
cout << hex << search_results[cur_result][xy] << " ReadProcessMemory() fails" << endl;
}
}发布于 2015-11-05 22:33:14
std::hex在应用到流直到显式反任务后才会继续存在吗?search_results[cur_result]的引用,除了可能具有更高的性能外,还会大大减少代码。在每个循环开始时,thatexpression[xy]也是如此。实际上,如果您由于某种原因不需要xy,那么使用范围换循环就更好了。using namespace std;是个坏主意,避免它:为什么“使用命名空间性病;”被认为是不好的做法?sizeof的参数,而是使用适当的表达式。 (sizeof mBI而不是sizeof(MEMORY_BASIC_INFORMATION))OLDPROTECT (为什么是大写的?)这不是宏!)在那里使用是安全的。void*使用所有C风格的转换?我非常怀疑类型转换,因为我不知道search_results[cur_result][xy]的类型,我不知道强制转换是否只是多余的和糟糕的形式,是由于错误的类型选择而必需的,还是编译器不礼貌地抱怨一个彻底的错误。在应用了所有我可以确定的工作之后(也不是第12条,而是在第11条上赌博):
auto&& srcr = search_results[cur_result];
using std::cout;
cout << std::hex << srcr.size() << " found.\n\n";
for (int xy = 0; xy < srcr.size(); xy++) {
auto&& current = srcr[xy];
if (ReadProcessMemory(phandle,(void*)current,&sResult,8,nullptr) != 8) {
cout << current << " ReadProcessMemory() fails\n";
continue;
}
if (sResult!=double_val) {
cout << current << " sResult != double_val ... It was when we scanned, but not now. Skipped.\n";
continue;
}
cout <<"item #" << xy << "\t";
if (!VirtualQueryEx(phandle, (void*)current, &mBI, sizeof mBI)) {
cout <<"VirtualQueryEx FAILED for " << current << ". Skipping.\n";
continue;
}
if (mBI.Protect & (PAGE_WRITECOPY | PAGE_EXECUTE_WRITECOPY)) {
cout << current << " was WRITE_COPY or EXEC_WRITE_COPY ..skipping, just because.\n";
continue;
}
bool bChangedProtect = false;
if (mBI.Protect & (PAGE_EXECUTE | PAGE_EXECUTE_READ)) {
if (!VirtualProtectEx(phandle,(void*)current,8,PAGE_EXECUTE_READWRITE,&OLDPROTECT)) {
cout << current << " Was EXEC or EXEC_R --> VirtualProtectEx(EXEC_RW) FAIL. skipping write.\n";
continue;
}
cout << current << " Was EXEC or EXEC_R --> VirtualProtectEx(EXEC_RW) SUCCESS\n";
bChangedProtect = true;
} else if (mBI.Protect & PAGE_READONLY) {
if (!VirtualProtectEx(phandle, (void*)current,8,PAGE_READWRITE,&OLDPROTECT)) {
cout << current << " Was READ_ONLY --> VirtualProtectEx(READ_WRITE) FAIL. skipping write.\n";
continue;
}
cout << current << " Was READ_ONLY --> VirtualProtectEx(READ_WRITE) SUCCESS\n";
bChangedProtect = true;
}
//if we get here, apparently it's writable (and not copy-forward).
if (!bChangedProtect)
cout << current; //will be first time we show the addr. todo: re-work logic because this feels awkward.
if (WriteProcessMemory(phandle,(void*)current,&double_ans,8,nullptr)) {
cout << " WriteProcessMemory() OK!\n";
} else {
cout << " WriteProcessMemory() FAIL!\n";
if (VirtualQueryEx(phandle,(void*)current,&mBI,sizeof mBI))
cout <<"Current Protect: " << mBI.Protect << '\n';
else
cout <<"Current Protect: Unknown. VirtualQueryEx() Failed -- but why? -- does this happen?\n";
}
if (bChangedProtect) {
if (VirtualProtectEx(phandle,(void*)current,8,OLDPROTECT,&OLDPROTECT))
cout << current << " VirtualProtectEx(ORIG) SUCCESS\n";
else
cout << current << " VirtualProtectEx(ORIG) FAIL -- does this happen?\n";
}
}https://codereview.stackexchange.com/questions/109931
复制相似问题