Skip to content

Commit 224b4fc

Browse files
authored
Merge pull request #83 from calledit/patch-3
Fix issue caused by WriteProcessMemory not always writing all bytes
2 parents a031c4d + 06ccc7d commit 224b4fc

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

winappdbg/process.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1833,9 +1833,12 @@ def poke(self, lpBaseAddress, lpBuffer):
18331833
prot = win32.PAGE_EXECUTE_READWRITE
18341834
else:
18351835
prot = win32.PAGE_READWRITE
1836+
org_length = len(lpBuffer)
1837+
org_lpBaseAddress = lpBaseAddress
1838+
length = org_length
18361839
if prot is not None:
18371840
try:
1838-
self.mprotect(lpBaseAddress, len(lpBuffer), prot)
1841+
self.mprotect(org_lpBaseAddress, org_length, prot)
18391842
except Exception:
18401843
prot = None
18411844
msg = (
@@ -1848,11 +1851,17 @@ def poke(self, lpBaseAddress, lpBuffer):
18481851
)
18491852
warnings.warn(msg, RuntimeWarning)
18501853
try:
1851-
r = win32.WriteProcessMemory(hProcess, lpBaseAddress, lpBuffer)
1854+
while length:
1855+
r = win32.WriteProcessMemory(hProcess, lpBaseAddress, lpBuffer)
1856+
if r == 0:
1857+
break
1858+
length -= r
1859+
lpBaseAddress += r
1860+
lpBuffer = lpBuffer[r:]
18521861
finally:
18531862
if prot is not None:
1854-
self.mprotect(lpBaseAddress, len(lpBuffer), mbi.Protect)
1855-
return r
1863+
self.mprotect(org_lpBaseAddress, org_length, mbi.Protect)
1864+
return org_length
18561865

18571866
def peek_char(self, lpBaseAddress):
18581867
"""
@@ -4681,3 +4690,8 @@ def _notify_exit_process(self, event):
46814690
if dwProcessId in self.__processDict:
46824691
self._del_process(dwProcessId)
46834692
return True
4693+
4694+
4695+
4696+
4697+

0 commit comments

Comments
 (0)