July 01, 2017
On Saturday, 1 July 2017 at 00:40:11 UTC, ag0aep6g wrote:
> On 07/01/2017 02:30 AM, bauss wrote:
>> On Saturday, 1 July 2017 at 00:23:36 UTC, ag0aep6g wrote:
>>> On 07/01/2017 01:41 AM, bauss wrote:
> [...]
>>>>    if (!ReadProcessMemory(process,
>>>>      cast(PCVOID)address, cast(PVOID)&data,
>>>
>>> The second cast still looks suspicious. PVOID is void*, right? Then any mutable pointer type should implicitly convert to PVOID and you shouldn't need the cast.
> [...]
>> Well the address is not a pointer. It's DWORD which is uint, so the cast is necessary since it stores the address.
>
> Not that one. The other one. This one: `cast(PVOID)&data`.
>
> I don't expect it to be related to your problem, but it shouldn't be necessary as far as I see.

Yeah, the cast was unnecessary.

So this is my code after the changes:
string ReadWinString(HANDLE process, DWORD address, size_t stringSize, string defaultValue = "") {
  if (!process || !address) {
    return defaultValue;
  }

  SIZE_T bytesRead;
  char[1024] data;

  if (!ReadProcessMemory(process,
    cast(LPCVOID)address, &data,
    stringSize, &bytesRead)) {
    return defaultValue;
  }

  auto s = cast(string)data[0 .. stringSize].idup;

  return s ? s : defaultValue;
}

Results are still garbage data, correct length in bytesRead however.

I tried to pass the address with the main module's base address because I saw some posts online suggesting you might need to do that.

If I do that however I just get error 299 (ERROR_PARTIAL_COPY), so I don't think I needed the base address, but still can't figure out what exactly is wrong with my code and why I can't read the string from the address I give it, when it's a static address. Every time I look with ollydbg the address is the same and ollydbg can find the string just fine.
July 01, 2017
On Saturday, 1 July 2017 at 00:48:01 UTC, bauss wrote:
> On Saturday, 1 July 2017 at 00:40:11 UTC, ag0aep6g wrote:
>> [...]
>
> Yeah, the cast was unnecessary.
>
> So this is my code after the changes:
> string ReadWinString(HANDLE process, DWORD address, size_t stringSize, string defaultValue = "") {
>   if (!process || !address) {
>     return defaultValue;
>   }
>
> [...]

I have solved the problem. It was caused by an invalid address, so the code actually worked fine.
1 2
Next ›   Last »