banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Read và Write Process Memory , làm sao tránh tranh chấp  XML
  [Programming]   Read và Write Process Memory , làm sao tránh tranh chấp 30/07/2006 00:50:06 (+0700) | #1 | 10947
[Avatar]
LQV0604
Elite Member

[Minus]    0    [Plus]
Joined: 29/12/2003 14:54:13
Messages: 59
Offline
[Profile] [PM]
Khi mình sử dụng hàm ReadProcessMemory và hàm WriteProcessMemory , làm sao tránh được trường hợp tranh chấp đọc ghi dữ liệu .
Mình có 2 process :
process A : là chương trình của mình viết
process B : là process mình cần đọc và ghi trên memory của nó .
Từ A mình gọi hàm WriteProcessMemory để ghi vào một ô nhớ nào đó trên B.
Nhưng mình không biết cách nào để cho trong khi mình ghi thì B ko được thao tác trên ô nhớ đó .
Các bạn có thể chỉ mình cách để tránh trường hợp đó (hoặc tài liệu để đọc) hoặc những cách tương đương (hoặc hàm tương đương ) để làm .
PS :
Hiện tại mình có thể dùng cách hook vào B ( WM_WNDPROC ) . Rồi trong hàm hook gọi hàm readprocessmemory và writeprocessmemory để tránh xung đột đươc không . Mình không muốn chương trình B bị dừng lại trong quá trình gọi các hàm read hoặc write ( nghĩa là B vẫn chạy như bình thường)

[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 30/07/2006 06:14:09 (+0700) | #2 | 11009
LeVuHoang
HVA Friend

Joined: 08/03/2003 16:54:07
Messages: 1155
Offline
[Profile] [PM]
Hoàng nghĩ ta có thể tạm thời suspend cái process lại để ghi. Sau đó Resume để tránh tình trạng xung đột.
Ngoài ra, theo Hoàng nghĩ còn 1 cách nữa nhưng phức tạp hơn. Là hook vào ReadProcessMemory và WriteProcessMemory. Nếu chương trình B sử dụng 2 hàm này thì không cho truy xuất. Đến khi chương trình của mình ghi xong thì cho phép lại.
[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 30/07/2006 11:26:32 (+0700) | #3 | 11055
[Avatar]
LQV0604
Elite Member

[Minus]    0    [Plus]
Joined: 29/12/2003 14:54:13
Messages: 59
Offline
[Profile] [PM]
Mình không muốn suspend chương trình B tại vì B là chương trình ứng dụng mạng . Khi mình suspend sẽ gây lỗi chương trình chạy sai .
Còn cách hook vào API readprocessmemory và writeprocessmemory thì không được vì nó khá phức tạp và thứ 2 : do mình truy xuất vào memory của B mà B không chỉ dùng readprocessmemory hoặc writeprocessmemory để ghi lên bộ nhớ của nó ( nó có thể dùng các hàm khác để làm ) cho nên hook vào 2 hàm này không có tác dụng gì nhiều . Bạn có thể giới thiệu những cách khác để từ A mình có thể truy xuất vào vùng nhớ của B mà không gây ảnh hưởng đến hoạt động của B .
Thanks LVH đã góp ý
[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 30/07/2006 11:41:57 (+0700) | #4 | 11058
[Avatar]
Z0rr0
Q+WRtaW5pc3RyYXRvc+g

Joined: 14/08/2002 12:52:01
Messages: 1323
Location: Underground
Offline
[Profile] [PM] [WWW] [Yahoo!]

LeVuHoang wrote:
Hoàng nghĩ ta có thể tạm thời suspend cái process lại để ghi. Sau đó Resume để tránh tình trạng xung đột.
Ngoài ra, theo Hoàng nghĩ còn 1 cách nữa nhưng phức tạp hơn. Là hook vào ReadProcessMemory và WriteProcessMemory. Nếu chương trình B sử dụng 2 hàm này thì không cho truy xuất. Đến khi chương trình của mình ghi xong thì cho phép lại. 


Suspend process thì chắc là lựa chọn cuối cùng smilie
Có cách mà các game trainer hoặc cụ thể là các c/trình đánh game tự động VLTK hay làm là:
- Start process của mình với quyền DEBUG - quyền DEBUG sẽ cho phép process can thiệp vào address space của các process khác trên các hệ Windows NT/2k/xp
- Sử dụng OpenProcess với access right PROCESS_ALL_ACCESS
- Sử dụng ReadProcessMemory và WriteProcessMemory với địa chỉ virtual memory (logical) cụ thể
- Hook API WriteProcessMemory để chặn các lời gọi update không phải của bạn

Tham thảo thêm mấy bác chuyên viết trainer game xem sao smilie
Hibernating
[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 30/07/2006 16:43:57 (+0700) | #5 | 11075
LeVuHoang
HVA Friend

Joined: 08/03/2003 16:54:07
Messages: 1155
Offline
[Profile] [PM]

LQV0604 wrote:
Mình không muốn suspend chương trình B tại vì B là chương trình ứng dụng mạng . Khi mình suspend sẽ gây lỗi chương trình chạy sai .
Còn cách hook vào API readprocessmemory và writeprocessmemory thì không được vì nó khá phức tạp và thứ 2 : do mình truy xuất vào memory của B mà B không chỉ dùng readprocessmemory hoặc writeprocessmemory để ghi lên bộ nhớ của nó ( nó có thể dùng các hàm khác để làm ) cho nên hook vào 2 hàm này không có tác dụng gì nhiều . Bạn có thể giới thiệu những cách khác để từ A mình có thể truy xuất vào vùng nhớ của B mà không gây ảnh hưởng đến hoạt động của B .
Thanks LVH đã góp ý
 

Pó tay. Thường thì tốc độ ghi dữ liệu cũng không nhiều nên chuyện tranh chấp ghi cùng lúc giữa A & B cũng rất khó xảy ra.
[Up] [Print Copy]
  [Question]   Re: Read và Write Process Memory , làm sao tránh tranh chấp 30/07/2006 17:33:49 (+0700) | #6 | 11077
ptalksoft
Member

[Minus]    0    [Plus]
Joined: 26/07/2006 01:41:46
Messages: 5
Offline
[Profile] [PM]
theo tôi hiểu ý bạn .. là 2 phần mềm bị đụng nhau tiếng anh gọi là bị INTERFACE CONFLICTTION . bạn có thể xài CLASSID , WINDOW FRAME ID basic là: #3..... và thứ ba nữa là xài check forum ID PRoCESS in task ..
3 thứ đó là hạn chế tránh sự đụng chạm nhau giữa cái này và cái kia
[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 31/07/2006 00:16:01 (+0700) | #7 | 11120
mfeng
Researcher

Joined: 29/10/2004 15:16:29
Messages: 243
Offline
[Profile] [PM]
A & B cùng truy xuất chung một ô nhớ, do đó cần có cơ chế điều khiển tương tranh. Trong trường hợp cả hai chương trình đều do bạn viết, cơ chế này được thực hiện qua các kĩ thuật inter-processes synchronization (dùng semaphore, mutex...). Theo mình hiểu thì LQV0604 muốn A là một dạng tool trainer, còn B là một game nào đó, cho nên điều khiển B hạn chế truy cập vào vùng nhớ chung sẽ gặp khó khăn.

B truy cập vùng nhớ không nhất thiết phải thực hiện qua hàm Read/WriteProcessMemory: vì đây là vùng nhớ ngay chính trong process, có thể là biến local trong stack, biến static, global hay heap..., có thể truy cập trực tiếp bằng con trỏ.

Giải pháp của các trainer hiện tại đa số không quan tâm tới tranh chấp khi truy cập, khi cần patch process memory sẽ gọi trực tiếp hàm Write.
[Up] [Print Copy]
  [Question]   Re: Read và Write Process Memory , làm sao tránh tranh chấp 31/07/2006 05:20:03 (+0700) | #8 | 11193
LeVuHoang
HVA Friend

Joined: 08/03/2003 16:54:07
Messages: 1155
Offline
[Profile] [PM]

ptalksoft wrote:
theo tôi hiểu ý bạn .. là 2 phần mềm bị đụng nhau tiếng anh gọi là bị INTERFACE CONFLICTTION . bạn có thể xài CLASSID , WINDOW FRAME ID basic là: #3..... và thứ ba nữa là xài check forum ID PRoCESS in task ..
3 thứ đó là hạn chế tránh sự đụng chạm nhau giữa cái này và cái kia 

Hoàng không hiểu bạn muốn nói gì ?

light.phoenix wrote:

A & B cùng truy xuất chung một ô nhớ, do đó cần có cơ chế điều khiển tương tranh. Trong trường hợp cả hai chương trình đều do bạn viết, cơ chế này được thực hiện qua các kĩ thuật inter-processes synchronization (dùng semaphore, mutex...). Theo mình hiểu thì LQV0604 muốn A là một dạng tool trainer, còn B là một game nào đó, cho nên điều khiển B hạn chế truy cập vào vùng nhớ chung sẽ gặp khó khăn.

B truy cập vùng nhớ không nhất thiết phải thực hiện qua hàm Read/WriteProcessMemory: vì đây là vùng nhớ ngay chính trong process, có thể là biến local trong stack, biến static, global hay heap..., có thể truy cập trực tiếp bằng con trỏ.

Giải pháp của các trainer hiện tại đa số không quan tâm tới tranh chấp khi truy cập, khi cần patch process memory sẽ gọi trực tiếp hàm Write.
 

Theo như LQV0604 thì chương trình A của mình, B của người ta smilie
Và B là 1 network application.
[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 01/08/2006 06:49:41 (+0700) | #9 | 11502
[Avatar]
LQV0604
Elite Member

[Minus]    0    [Plus]
Joined: 29/12/2003 14:54:13
Messages: 59
Offline
[Profile] [PM]
Đúng như Hoàng nói , ý của mình như sau :
A : là một process do mình viết
B : là một ứng dụng của người khác và B là một ứng dụng network application

@ light.phoenix :
1.Việc không quan tâm đến việc tranh chấp khi gọi các hàm WriteProcessMemory là sai , nó có thể khiến hệ thống chạy không đúng đặc biệt nếu ứng dụng chạy liên tục trong thời gian dài
2.Việc sử dụng hook API ( cho hàm writeprocessmemory và readprocessmemory ) là không khả thi đúng như bạn nói vì B có thể sử dụng con trỏ hoặc các hàm read write trên memory do B quản lý

@ptalksoft : Mình cũng không hiểu ý của bạn . Bạn có thể nói rõ hơn được không .

PS : Hàm ReadProcessMemory và WriteProcessMemory hình như yêu cầu có quyền administrator mới sử dụng được . Không biết có cách nào vượt qua không . Theo mình thì mình có thể tự nâng quyền của mình lên để có quyền debug rồi gọi hàm này có khả thi không .
Do đây là hàm debug nên có một số ứng dụng B có thể sử dụng hàm IsDebug của NT để chống debug . Không biết có cách nào vượt qua.
Việc hook API cho các hàm WriteProcessMemory và ReadProcessMemory là một ý rất hay trong việc crack phần mềm . ^^ .
Thanks mọi người góp ý .
[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 01/08/2006 17:21:53 (+0700) | #10 | 11582
LeVuHoang
HVA Friend

Joined: 08/03/2003 16:54:07
Messages: 1155
Offline
[Profile] [PM]
còn 1 cách nữa là monitor vùng nhớ đó và không cho B ghi đè lên smilie Hễ B ghi lên thì... mình ghi lại smilie

Hàm ReadProcessMemory và WriteProcessMemory hình như yêu cầu có quyền administrator mới sử dụng được
 

chỉ đúng với Admin Process. Với những process chạy cùng account thì vẫn có thể.

Do đây là hàm debug nên có một số ứng dụng B có thể sử dụng hàm IsDebug của NT để chống debug . Không biết có cách nào vượt qua.
 

Mấy cái này phải tham khảo các lão REA rồi :p. Thế sao không hook vào IsDebug để nó trả về là... mọi việc vẫn bình yên smilie
[Up] [Print Copy]
  [Question]   Re: Read và Write Process Memory , làm sao tránh tranh chấp 02/08/2006 20:55:52 (+0700) | #11 | 11906
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]
hay là set thread priority cho nó lên real time rồi read write gì đó nhỉ , làm xong lại restore lại normal.
[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 03/08/2006 20:29:39 (+0700) | #12 | 12078
[Avatar]
LQV0604
Elite Member

[Minus]    0    [Plus]
Joined: 29/12/2003 14:54:13
Messages: 59
Offline
[Profile] [PM]
Set thread priority đâu có tác dụng trong việc tránh tranh chấp bộ nhớ . Nó chỉ làm thread có quyền cao hơn mà thôi .
[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 04/08/2006 22:48:42 (+0700) | #13 | 12312
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]
thế thì nếu không can thiệp (có thể overwrite) vào 1 ít code của B thì chỉ có cách suppend nó lại , không thì vô phương (i think).
[Up] [Print Copy]
  [Question]   Re: Read và Write Process Memory , làm sao tránh tranh chấp 08/08/2006 21:27:32 (+0700) | #14 | 13220
evh
Member

[Minus]    0    [Plus]
Joined: 05/07/2005 14:51:51
Messages: 4
Offline
[Profile] [PM]
Chỉ còn cách là cài đặt Seriable cho 2 Threading thôi,
khi khai báo thì bạn cài đặt luôn ,
với java thì Extend thằng Seriable
còn với C++ thì bạn tự đọc trong MSDN nhé , mình chưa bao giờ chơi trò này trong .net cả , mình đã từng làm kiểu này với Java rồi
[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 23/08/2006 11:04:57 (+0700) | #15 | 17223
TQN
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 22:28:01
Messages: 888
Location: Biết làm chi ?
Offline
[Profile] [PM] [WWW] [Yahoo!]
Nếu bạn dùng process A để Read/Write lên process B thì khả năng thất bại rất cao, do nhiều lý do. Process B của bạn là ứng dụng real time phải không. Giả sử nó liên tục read/write lên 1 address nào đó của nó, thì khả năng conflict là rất cao.
Theo "ngu ý/quên ý" của tui, bạn cố gắng reverse thử process B, ngoài việc xác định addr sẽ read/write, bạn xác định nó là singlethread hay multithread, nếu là multithread thì có dùng cơ chế share-lock nào đó để read/write không, nếu có dùng share-lock thì nó dùng cơ chế nào: CriticalSection cho single process hay Mutex/Semaphore.. cho multiprocess. Đồng thời xác định cơ chế read/write nó ra sao, khi nào, ở đâu.
Giả sử nó có dùng cơ chế share-lock, thì khả năng thành công của bạn là gần 100%. Nếu dùng CriticalSection, bạn inject code hay inject dll vào process B, sau đó EnterCriticalSection, read/write, rồi LeaveCritcalSection. Còn nếu nó dùng share-lock cho multiprocess thì khoẻ nửa, xác định name của lock object (Mutex, Semaphore...), rồi bên process A dùng OpenMutex hay OpenSemaphore, rồi WaitForSingleObject, rồi read/write thoả mái, rồi unlock đi (unlock ra sao thì quên mất tiêu rồi, bỏ code lâu quá rồi, bạn đọc thêm trong MSDN).
Còn nếu process B không dùng cơ chế share-lock thì hơi khó cho cậu đấy, cố gắng RE đi.
Bét rìga.
[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 25/08/2006 20:48:57 (+0700) | #16 | 17918
[Avatar]
LQV0604
Elite Member

[Minus]    0    [Plus]
Joined: 29/12/2003 14:54:13
Messages: 59
Offline
[Profile] [PM]
Thanks các bạn secmask,evh,ThangCuEm đã trả lời .
Cho tới hiện giờ thì cách tốt nhất mình nghĩ có thể được là sử dụng dll injection để gắn code của mình vào process B và ngồi hy vọng smilie . Trong dll thì mình chỉ đảm bảo được việc ghi hoặc đọc của mình không bị vấn đề gì nhưng không đảm bảo được code của process B ghi vào trong lúc dll của mình đang ghi . Mình cũng thử reverse code của B và đang tìm hiểu thêm xem nó co sử dụng cơ chế lock không . Kết quả chưa tìm xong ( code tùm lum , dll quá trời ... ) .
@evh : thật tình hông hiểu cách của bạn đưa ra. Chắc bạn hiểu nhầm vấn đề rồi .
@secmask : override ít code vào B là sao . Bạn có thể nói rõ hơn được không . Hiện tại mình đang sử dụng dll injection . Nhưng vẫn còn bị đụng độ.
Chắc chỉ còn cách reverse chương trình để tìm ra hàm trong nào trong process B truy cập vào địa chỉ đó và gọi nó từ dll hoặc xem nó có dùng share-lock không
[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 26/08/2006 08:33:20 (+0700) | #17 | 18140
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]
hihi , thực ra cách này cũng hơi khó , như ThangCuEm đã nói nếu nó sử dụng mutex,semaphore .. thì ta có thể lock nó lại đúng không , nếu như nó không có thì ta làm cho nó có , overwrite code để nó wait một Object nào đó mà ta tạo ra. Cách này hơi khó bởi vì nếu có quá nhiều đoạn code tham chiếu đến vùng nhớ này . secmask đang nghĩ đến một cách khác là ta monitor vùng nhớ đó như các chương trình debug làm . Secmask cũng bắt đầu thấy có hứng thú với cái vụ này đây smilie
[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 26/08/2006 12:24:22 (+0700) | #18 | 18185
[Avatar]
LQV0604
Elite Member

[Minus]    0    [Plus]
Joined: 29/12/2003 14:54:13
Messages: 59
Offline
[Profile] [PM]

secmask wrote:
hihi , thực ra cách này cũng hơi khó , như ThangCuEm đã nói nếu nó sử dụng mutex,semaphore .. thì ta có thể lock nó lại đúng không , nếu như nó không có thì ta làm cho nó có , overwrite code để nó wait một Object nào đó mà ta tạo ra. Cách này hơi khó bởi vì nếu có quá nhiều đoạn code tham chiếu đến vùng nhớ này . secmask đang nghĩ đến một cách khác là ta monitor vùng nhớ đó như các chương trình debug làm . Secmask cũng bắt đầu thấy có hứng thú với cái vụ này đây smilie 


^^ . Dùng cách gì cũng được nhưng có yêu cầu không được làm suppend thread hay làm chậm performance . Tại đây là ứng dụng real time .
Debug không khả thi lắm nếu như phải dừng process B lại .
[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 29/08/2006 12:45:47 (+0700) | #19 | 18919
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]
LQV có cho wait for object cũng là 1 cách làm chậm performance không nhỉ , nếu thế thì thật sự khó đấy.
[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 30/08/2006 02:09:37 (+0700) | #20 | 19030
[Avatar]
LQV0604
Elite Member

[Minus]    0    [Plus]
Joined: 29/12/2003 14:54:13
Messages: 59
Offline
[Profile] [PM]
Nếu mình sử dụng hàm waitforobject bên trong bản thân processB thì thread nào sử dụng hàm wait mới bị dừng . Do chương trình sử dụng multithread và network nên các thread khác vẫn có thể chạy bình thường . Xét ở mức độ nào đó , việc wait trên process B không ảnh hưởng lớn lắm đến performance . Mình nghĩ là vẫn có thể chạy tốt .
Như vậy theo các bài post trước thì xu hướng hiện giờ là sử dụng injnection code vào process B , thay vì sử dụng debug function : readprocessmemory với writeprocessmemory để đọc process B . Vậy vấn đề hiện giờ là làm sao mình tạo được mutex,semaphore ... trong process B để sử dụng

[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 30/08/2006 07:57:20 (+0700) | #21 | 19126
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]
Về việc tạo object trong B thì OK , dùng luôn trong DLL ịnection , việc còn lại là tìm thread , overwrite code để bắt nó đợi object . Nếu cần thì để secmask giúp 1 tay . good luck
[Up] [Print Copy]
  [Question]   Read và Write Process Memory , làm sao tránh tranh chấp 01/09/2006 06:01:05 (+0700) | #22 | 19638
TQN
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 22:28:01
Messages: 888
Location: Biết làm chi ?
Offline
[Profile] [PM] [WWW] [Yahoo!]
Chỉ dùng Dll inject khi process B có dùng Critical Section, còn nếu process B dùng cái khác như mutex, event, semaphore thì khỏi cần dùng Dll inject. Wait for object đó trên A, rồi trên A read/write (ReadProcessMemory/WriteProcessMemory) thoả mái. Vấn đề quan trọng nhất không phải là kỹ thuật code, mà là kỹ thuật RE để hiểu rõ về cơ chế đọc, ghi của process B lên vùng nhớ đó.
Critical Section chỉ lock được các thread trong cùng 1 process. Nó là 1 user object. Còn các lock object còn lại là kernel object, có thể lock các thread trên các process khác nhau. Vd: process B khởi tạo 1 mutex với tên là :"ThangChaNo", có hai thread: main thread và 1 working thread. 2 thread này luân phiên read/write lên addr X, dùng mutex trên. Bên process A, open mutex cũng phải với tên "ThangChaNo" (bắt buộc), rồi wait trên mutex trả về, thì cuối cùng cả 3 thread: main thread của A, main thread của B và working thread của B đều có khả năng lock bởi mutex "ThangChaNo". Nếu 3 thread đều wait trên mutex này thì tại mọi thời điểm, chỉ có 1 thread được run, 2 thread còn lại bị wait.
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|