الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال : حول تمثيل البيانات الخاصة بدوال Apiبالاسمبلي

مغلق
بدأه capture في 18 نوفمبر 2007 · 13 رد · 2,409 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم اخواني:

عندي سؤال حول كيفية تعريف البيانات بالاسمبلي فانا ليس لدي اي معرفة مسبقة باي لغة برمجية

ولا حتى السي ++ اللتي سمعت ان الmasm32 يشبه في كثير من الطرق السي ++

مثلا:

الدالة

BOOL InternetGetConnectedStateEx(
  LPDWORD lpdwFlags,
  LPTSTR lpszConnectionName,
  DWORD dwNameLen,
  DWORD dwReserved
);

حسب تجربتي شفت ان اذا كانت القيمة المدخلة[in] نضعها في data.،

واذا كانت [out] نضعها في ?data. فقط عند بداية استخدامها لنا ، لا أعرف اذا كان الكلام هذا سليم او لا

lpszConnectionName 
[out] Pointer to a string value that receives the connection name.

المشكلة عندي هي LPTSTR كيف استطيع ان امثلها في ال masm

يعني اضعها في قسم ?data. علي اي شكل مثلا هكذا يعني

xxxxxxxxxxx					db							 dup(30) ?

ولا كيف هذه المشكلة تزعجني في كتابة الدوال واضطر دائما الى البحث عن اكواد ل masm

لأقوم باخذها جاهزة انا اريد ان اعرف الطريقة العامة في تمثيل البيانات الخاصة بالدوال

حاولت من هذا الرابط من msdn ولكن لم استفيد

Windows Data Types

وشكرا لكم

امتــــــــحـــــــــــــــــــانــــــــــــــــــــــــــــــــــــات

استر يا رب (ادعولنا).

#2

ان كانت السلسلة لن تتجاوز طولا معينا تستطيع حجز جزء من الذاكرة لها من خلال

.data?
xxxxxx		 db 30 dup (?)

اما لو كانت السلسلة قد تختلف في الطول وليس لها حد معين اذن قم بوضعها ضمن مكان ما في الذاكرة من خلال استدعاء داله مثل GlobalAlloc او VirtualAlloc

lptstr هي عبارة عن سلسلة نصية بالتالي هي سلسلة بايتات اذن تستخدم الشكل السابق.

السلام عليكم

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3

السلام عليكم

لا اعرف ان كانت فهمت ما تريده بالضبط ام لا ,لكن هذا مثال ربما يساعدك :

سنأخذ الدالة MessageBox كمثال

int MessageBox(
	HWND hWnd,	// handle of owner window
	LPCTSTR lpText,	// address of text in message box
	LPCTSTR lpCaption,	// address of title of message box  
	UINT uType 	// style of message box
 );

يتم تنفيذها كالآتي :

.data
lpText  BYTE  "welcome capture to asm",0
lpCaption  BYTE  "Hey",0

.code
push 0
push offset lpCaption
push offset lpText
push 0
Call MessageBox

---------------------------------------------------------------------------

مثال اخر لدالة ترجع لك خرج هي الدالة GetModuleFileName

DWORD GetModuleFileName(
	HMODULE hModule,	// handle to module to find filename for 
	LPTSTR lpFilename,	// pointer to buffer for module path 
	DWORD nSize 	// size of buffer, in characters 
   );

يتم اجرائها كالأتي

.data?
lpFilename  BYTE 512 dup (?)

.code
push 0
Call GetModuleHandle

push 512
push offset lpFilename
push eax
Call GetModuleFileName

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#4

شكرا لكم اخواني

أخي Junkie هل تقصد أن اقوم باستدعاء GlobalAlloc او VirtualAlloc قبل الدالة التي اريد

استدعاءها ثم اشير بالEAX اليها (يعني نعمل هذه اللفة عشان نتجنب الحجز غير المعروف من الذاكرة)؟؟

أهلا اخوي GamingMasteR الظاهر من ردك انك فهمت علي

هي المشكلة عندي ليس فقط في ال LPTSTR

ولكن في اي نوع من انواع البيانات بالنسبة ، للهواندل handle شفت دائما انها من نوع DWORD

.data?
xxxxx				dd				?

واي هاندل اشير اليه بهذه الطريقة (HFILE,HICON,HINSTANCE,HKEY)

ولكن في انواع اخرى مثل VirtualAlloc التي اشرت اليها Junkie

LPVOID VirtualAlloc(
  LPVOID lpAddress,
  SIZE_T dwSize,
  DWORD flAllocationType,
  DWORD flProtect
);

LPVOID :blink:

SIZE_T :wacko:

على فكرة اخي Junkie بسبب هذه المشكلة قمت بلطش العديد من الاكواد منك :lol: وخصوصا كنت

أشوف كيف تعرفها بمقاطع البيانات ولم اتوصل كيف أمكنك التعامل مع الدالة بسرعة.

سؤال جانبي الدالة InternetGetConnectedState بدون Ex لا تعطيني كيفية الاتصال بالانترنت (حينما اتتبعها ب olly)

وتعطيني اذا كنت متصل او لا

وهذا الكود

.586
.model flat,stdcall
option casemap:none

	include ..\include\windows.inc
	include ..\include\kernel32.inc
	include ..\include\Wininet.inc
	include ..\include\user32.inc

	includelib ..\lib\kernel32.lib
	includelib ..\lib\Wininet.lib
	includelib ..\lib\user32.lib

.data?
	connection	dd	?

.data
	Text1		db	"Connected To Internet",0
	lTitle		db	"Connection State",0
	Text2		db	"No Connection Detected",0
.code
start:
invoke	InternetGetConnectedState, connection, 0
test	eax,eax
jz	@notConnected
invoke	MessageBox, NULL, addr Text1, addr lTitle, MB_OK
jmp	@exit
@notConnected:
invoke	MessageBox, NULL, addr Text2, addr lTitle, MB_OK
@exit:
invoke	ExitProcess, 0
end start

أحد جرب هذه الدالة وين المشكلة.

وشكرا لكم اتعاونكم

امتــــــــحـــــــــــــــــــانــــــــــــــــــــــــــــــــــــات

استر يا رب (ادعولنا).

#5

لا اعرف اين الخطأ فعند التنقيح لا يتم ملئ بفر الـFlags بعكس ما يقول msdn ربما لعدم فهمي الدالة جيدا :wacko:

بالنسبة لـLPVOID اقول لك اولا حاول ان تنسى السي قليلا لتتأقلم مع الاسمبلي اسرع .. معظم تعاملنا اما يكون byte-word-dword او حجم مخصص

الهاندل مثلا يمكن تمثيله بـDWORD ... لكن لا تقلق يمكنك ان تجد ما في السي في الاسمبلي ايضا :lol:

جرب مثلا تغيير هذا السطر من الكود السابق

	connection	dd	?

الى

	connection	LPDWORD	 ?

ستجد انه لا فرق في الحقيقة

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#6
capture كتب:
شكرا لكم اخواني

أخي Junkie هل تقصد أن اقوم باستدعاء GlobalAlloc او VirtualAlloc قبل الدالة التي اريد

استدعاءها ثم اشير بالEAX اليها (يعني نعمل هذه اللفة عشان نتجنب الحجز غير المعروف من الذاكرة)؟؟

نعم تستدعي مثل هذه الدوال وتقوم بحجز حجم معين في الذاكرة لا باس فيه وتقوم بتوجيه البيانات اليه وعند الانتهاء منه تقوم بعمل VirtualFree او GlobalFree لتفريغه.

كي لا تحجز قسم كبير من البرنامج قد لا يستخدم.

اقتباس
LPVOID VirtualAlloc(

LPVOID lpAddress,

SIZE_T dwSize,

DWORD flAllocationType,

DWORD flProtect

);

LPVOID :blink:

SIZE_T :wacko:

لست مبرمج C ايضا, ولا اعلم الكثير عن تصريحاتها, لكن ما اعرفه هو تصريحات الاسمبلي التي استطيع التعامل معها.

لذلك الحجم الذي اتعامل معه هو dword, dd, سلسلة بايتات بطول ما, tword, float

ولم يخب ظني في التصريحات الى الان, عندما تقرأ شرح كل دالة عدة مرات تحفظ اطوال بارامتراتها ولا تغدو مشكلة لاحقاً

الخطأ والتكرار, trial and error :)

اقتباس
سؤال جانبي الدالة InternetGetConnectedState بدون Ex لا تعطيني كيفية الاتصال بالانترنت (حينما اتتبعها ب olly)

وتعطيني اذا كنت متصل او لا

وهذا الكود

.586

.model flat,stdcall

option casemap:none

include ..\include\windows.inc

include ..\include\kernel32.inc

include ..\include\Wininet.inc

include ..\include\user32.inc

includelib ..\lib\kernel32.lib

includelib ..\lib\Wininet.lib

includelib ..\lib\user32.lib

.data?

connection dd ?

.data

Text1 db "Connected To Internet",0

lTitle db "Connection State",0

Text2 db "No Connection Detected",0

.code

start:

invoke InternetGetConnectedState, connection, 0

test eax,eax

jz @notConnected

invoke MessageBox, NULL, addr Text1, addr lTitle, MB_OK

jmp @exit

@notConnected:

invoke MessageBox, NULL, addr Text2, addr lTitle, MB_OK

@exit:

invoke ExitProcess, 0

end start

أحد جرب هذه الدالة وين المشكلة.

connection حجمها dw ليس dd

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#7
G~M كتب:
بالنسبة لـLPVOID اقول لك اولا حاول ان تنسى السي قليلا لتتأقلم مع الاسمبلي اسرع .. معظم تعاملنا اما يكون byte-word-dword او حجم مخصص
Junkie كتب:
لست مبرمج C ايضا, ولا اعلم الكثير عن تصريحاتها, لكن ما اعرفه هو تصريحات الاسمبلي التي استطيع التعامل معها.

لذلك الحجم الذي اتعامل معه هو dword, dd, سلسلة بايتات بطول ما, tword, float

ولم يخب ظني في التصريحات الى الان, عندما تقرأ شرح كل دالة عدة مرات تحفظ اطوال بارامتراتها ولا تغدو مشكلة لاحقاً

الخطأ والتكرار, trial and error :)

هذه النقطة التي كنت ابحث عنها ان اقوم بالتصريح ب dw,dd,db وحجم مخصص

شكرا لكم وساحاول اكثر بالتجربة على الدوال

اخي Junkie قمت بالتصريح عن connection ب dw فتعطل البرنامج ولم تعطي الدالة قيمة صحيحة

ولكن مع dd أعطتني نتائج صحيحة؟

وهذا كود لاستغلال جميع وظائف الدالة وعرض قيمها

ولكن لايتم ابدا وضع قيمة في بفر ال Flag!!!؟؟

.586
.model flat,stdcall
option casemap:none

	include ..\include\windows.inc
	include ..\include\kernel32.inc
	include ..\include\Wininet.inc
	include ..\include\user32.inc

	includelib ..\lib\kernel32.lib
	includelib ..\lib\Wininet.lib
	includelib ..\lib\user32.lib

.data?
	connection	dd	?

.data
	lTitle		db	"Connection State",0
	Text1		db	"Connected To Internet",0
	Text2		db	"No Connection Detected",0
	Text3		db	"Local system has a valid connection to the Internet, but it might or might not be currently connected.",0
	Text4		db	"Local system uses a local area network to connect to the Internet.",0
	Text5		db	"Local system uses a modem to connect to the Internet.",0
	Text6		db	"No longer used.",0
	Text7		db	"Local system is in offline mode.",0
	Text8		db	"Local system uses a proxy server to connect to the Internet.",0
	Text9		db	"Local system has RAS installed.",0
	Text10		db	"Error Flag Not Set",0
.code
start:
invoke	InternetGetConnectedState, connection, 0

.if eax==1
invoke	MessageBox, NULL, addr Text1, addr lTitle, MB_OK
.else
invoke	MessageBox, NULL, addr Text2, addr lTitle, MB_OK
jmp	@exit
.endif

.if connection==40h
invoke	MessageBox, NULL, addr Text3, addr lTitle, MB_OK
.elseif connection==2h
invoke	MessageBox, NULL, addr Text4, addr lTitle, MB_OK
.ELSEIF connection==1h
invoke	MessageBox, NULL, addr Text5, addr lTitle, MB_OK
.ELSEIF connection==8h
invoke	MessageBox, NULL, addr Text6, addr lTitle, MB_OK
.elseif connection==20h
invoke	MessageBox, NULL, addr Text7, addr lTitle, MB_OK
.ELSEIF connection==4h
invoke	MessageBox, NULL, addr Text8, addr lTitle, MB_OK
.ELSEIF connection==10h
invoke	MessageBox, NULL, addr Text9, addr lTitle, MB_OK
.ELSEIF connection==0
invoke	MessageBox, NULL, addr Text10, addr lTitle, MB_OK
.ENDIF

@exit:
invoke	ExitProcess, 0
end start

امتــــــــحـــــــــــــــــــانــــــــــــــــــــــــــــــــــــات

استر يا رب (ادعولنا).

#8

الخطأ في هذا السطر

invoke	InternetGetConnectedState, connection, 0

في السطر السابق انت لم تشر الى connection كبفر للـFlags بل اشرت اليه كـPointer يشير الى بفر آخر (وبما ان connection تحتوي على اصفار اذن انت اعطيت الدالة مكان البفر هو 0x00000000 )

هذا الخطأ كثيرا ما أقع فيه :lol: ولحل المشكلة :

invoke	InternetGetConnectedState, addr connection, 0

I ADDR xxxxx >>>>>>>>>>> address of label"xxxxx" I

والله الموفق

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#9

جيد أخي GamingMasteR محاولة ناجحة شكرا لك

ولكن معي نجحت وفشلت ،

نجحت في استعادة قيمة لبفر ال Flag ،وفشلت في انها لم تعيد اي قيمة من القيم المذكورة في msdn تعيد 51h فقط

علما اني استخدم مودم للاتصال ، فهل نجحت معك باسترداد قيمة معروفة؟

بعد قراءة ردك قمت بالبحث والتجربة لأستخلص قاعدة متى نستخدم addr أو لا نستخدمها علما اني بحثت في masm32.hlp ولم اجد شرح كافي

اثناء بحثي صدمت باحد الاقوال

7/29/2005 9:13:43 PM	Re: help please with GetFileAttributesEx 
If you don't know how C works, then you will find using MASM under Windows  

almost impossible.  There are almost no conversions of .h files to .inc.  

There is an old utility, h2inc, that will translate some of them.  

"john klosak" <klosak@mchsi.com> wrote in message  

news:XZxGe.220182$xm3.98223@attbi_s21...

من هنا

تم تعديل هذه المشاركة بواسطة capture في 20 نوفمبر 2007 في 00:42

امتــــــــحـــــــــــــــــــانــــــــــــــــــــــــــــــــــــات

استر يا رب (ادعولنا).

#10

نفس ما حدث معي : عند التنقيح بـOllyDbg يعطي النتيجة الصحيحة لكن عند عدم التنقيح يعطي العلم 0x12

عدلت في الكود ليسمح لي بمعرفة العلم

.data?
	connection	dd	?
	num		dd 2 dup (?)
.data
	format	   db	"Flag:%X",0
	lTitle	   db	"Connection State",0
	Text1		db	"Connected To Internet",0
	Text2		db	"No Connection Detected",0
	Text3		db	"Local system has a valid connection to the Internet, but it might or might not be currently connected.",0
	Text4		db	"Local system uses a local area network to connect to the Internet.",0
	Text5		db	"Local system uses a modem to connect to the Internet.",0
	Text6		db	"No longer used.",0
	Text7		db	"Local system is in offline mode.",0
	Text8		db	"Local system uses a proxy server to connect to the Internet.",0
	Text9		db	"Local system has RAS installed.",0
	Text10	   db	"Error Flag Not Set",0
.code
start:
invoke	InternetGetConnectedState, addr connection, 0
push eax
invoke	wsprintf,addr num,addr format,[connection]
pop eax
.if eax==1
invoke	MessageBox, NULL, addr Text1, addr num, MB_OK
.else
invoke	MessageBox, NULL, addr Text2, addr num, MB_OK
jmp	@exit
.endif

اقتباس
If you don't know how C works, then you will find using MASM under Windows almost impossible

هراااء ... اعرف كثيرون بدأو اسمبلي من الصفر دون اي لغة سابقة او بمعرفة لغة الفيجوال بيسك والتي تزيد الطين بلة ( نعم البيسك زادت معي الطين بلة ولولاها لكان حالي افضل بكثير :angry: )

المهم هو الممارسة

تم تعديل هذه المشاركة بواسطة GamingMasteR في 20 نوفمبر 2007 في 01:38

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#11

مرحبا شباب كيف الحال!

Flags يجب ان يكون dw

مثال InternetGetConnectedState في دلفي

function Conn: String;
var
  Flags:  DWord;
begin
  if InternetGetConnectedState( @Flags, 0) then Begin
	 if (( Flags and INTERNET_CONNECTION_MODEM) <> 0) then Result := 'Modem';
	 if (( Flags and INTERNET_CONNECTION_LAN) <> 0) then Result := 'LAN';
	 if (( Flags and INTERNET_CONNECTION_PROXY) <> 0) then  Result := 'Proxy';
  end else Result:='No Internet Connection';
end;

جربو هذين التعديلين واخبروني بالنتيجة

connection dw 40 dup(?)

 invoke InternetGetConnectedState, offset connection, 0
d4baa0.gif
#12

غريب امر هذه الدالة ... تعمل بمزاجها عندي مرة تعطي بيانات صحيحة ومرة تخرف :wacko:

جربت كودين الاسمبلي والدلفي نفس الشئ يحدث :blink:

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#13

GamingMasteR

كيف مرة تعمل ومرة لا!

تحقق جيدا، ربما نسيت شيئ هنا او هناك

-

capture

في حالة وجود لبس هناك طريقة بسيطة لمعرفة نوع اي Parameter لاي API

اكتب بلغة C برنامج بسيط يستدعى تلك API

ثم استخدم برنامج التنقيح المفظل لديك

او احسن استخدم Disassembler مثل IDA Pro

d4baa0.gif
#14

تعمل احيانا جيدا في المنقح ولا تعمل جيدا من دونه هكذا مرات ثم يحدث Crash لملف نظام svchost.exe المسؤول عن الصوت والنت

لا يهم ... بالتأكيد من نسخة الويندوز عندي ... انسى الامر

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…