forum.ge
reklama
FORUM.GE წესები  · დახმარება  · ძებნა  · წევრები  · კალენდარი  · ფოსტა  · ჩატი
  გამოხმაურება · ახალი თემა · ახალი გამოკითხვა

> ნუბური შეკითხვები С-ში
ბიჭური
Super Crazy Member +


*******
ჯგუფი: Members
წერილები: 13036
წევრი No.: 157590
რეგისტრ.: 20-December 12

გამოგზავნილია: 23 Jul 2017, 14:52  #51015302      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
ყველამ გახსნა და მეც გავხსნი.

ამ თემაში დაწერეთ ნებისმიერი შეკითხვები რაც C-ს შეეხება და შევეცდები გიპასუხოთ.
მხოლოდ C. გეობა C++-ს თავისი თემა აქვს და იქ დაწერეთ მაგის შეკითხვები.
ამ თემაში განვიხილავთ თანამედროვე პროგრამირების ენების მამას და ყველაფერს რაც მასთან არის დაკავშირებული. ჩვენ არ ვიყენებთ გეობა cout-ს რადგანაც გვაქვს ფორმატირების საუკეთესო საშუალება printf, სხვა გეობებსაც არ ვიყენებთ !


ჩვენ არ ვწერთ გეობებს, ჩვენ ვწერთ Linux-ს, Git-ს, PostgreSQL-ს, Wireshark-ს, Windows Kernel-ს და სხვა კაცურ სოფტს.

gigi.gif


» სპოილერის ნახვისთვის დააწკაპუნეთ აქ «


--------------------
ჩანიძე
Member


***
ჯგუფი: Registered
წერილები: 66
წევრი No.: 234016
რეგისტრ.: 22-July 17

გამოგზავნილია: 23 Jul 2017, 15:40  #51015530      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
QUOTE
ყველამ გახსნა და მეც გავხსნი.

მარტო გახსნა რომ შველოდეს biggrin.gif
სამწუხაროდ არაა აქტიური განყოფილება, როგორც შევატყე.

წლების წინ კი ვსწავლობდი C-ს ან C++-ს (კარგად არც მახსოვს, თან ჰგვანან სახელებით biggrin.gif)
როგორც ხდება ხოლმე, ცოტა ხანი ძაან დაინტერესებული ვიყავი, მერე მომბეზრდა და სულ მივანებე თავი.

ახლა ჯავათი დავიწყე
ვნახოთ სადამდე გავქაჩავ givi.gif


--------------------
დღეს დილით ავდექი და ვფიქრობდი

რა უდედისმტყვნელესი გრძნობაა როცა ფეხბურთის ისტორიაში საუკეთესო კლუბის გულშემატკივარი ხარ :love:
letmedodiss
Junior Member


**
ჯგუფი: Registered
წერილები: 10
წევრი No.: 233974
რეგისტრ.: 20-July 17

გამოგზავნილია: 23 Jul 2017, 15:43  #51015555      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
ბიჭური

malloc > new ! biggrin.gif

2 განზომილებიანი მასივი მარტივი რიცხვებით რო შევავსო 2 ციკლია ხო საჭირო ?

დაახლოებით ასე : for (int i = 0; i < 20; i++) {
for (int j = 0; j < 20; j++) {

if (ნუ რაღაცა მარტივი რიცხვის ფუნქცია რაც იქნება(m[i][j])) {
printf("%02d ", m[i][j]);


--------------------
I WANT TO INSPIRE PEOPLE. I WANT SOMEONE TO LOOK AT ME AND SAY BECAUSE OF YOU , I DIDN'T GIVE UP.
syaruna
Crazy Member


*****
ჯგუფი: Members
წერილები: 3111
წევრი No.: 154790
რეგისტრ.: 5-October 12

გამოგზავნილია: 23 Jul 2017, 15:56  #51015627      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
სი-ში cout-ს და sin-ს და ეგეთებს რო ვიყენებ არ ვარგა?
ბიჭური
Super Crazy Member +


*******
ჯგუფი: Members
წერილები: 13036
წევრი No.: 157590
რეგისტრ.: 20-December 12

გამოგზავნილია: 23 Jul 2017, 15:59  #51015642      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
ჩანიძე

CODE
როგორც ხდება ხოლმე, ცოტა ხანი ძაან დაინტერესებული ვიყავი, მერე მომბეზრდა და სულ მივანებე თავი.


მეც ეგრე დავხტოდი ენიდან ენაზე, არაუშავს. რომელიღაც აუცილებლად მოგეწონება (თუ ინტერესი გაქვს, რა თქმა უნდა) და კარგად ჩაუჯდები.

letmedodiss

CODE
malloc > new !



malloc კარგი კი არის, მაგრამ ვინდოუსზე თუ წერ, უფრო უკეთესი ვარიანტებიც არის smile.gif
მაგალითად malloc-ით შეიძლება საერთოდ ვერ გამოყო გარკვეულო მეხსიერება იმიტომ რომ დაცულია რეგიონი.

ამ შემთხვევაში Winapi იძლევა Microsoft-ის რეალიზაციას, VirtualAlloc ფუნქციას. რომელსაც უამრავი პარამეტრი აქვს დამატებითი, უფრო დეტალურად : https://msdn.microsoft.com/ru-ru/library/wi...7(v=vs.85).aspx

VirtualProtect-თან ერთად იყენებ და მეხსიერების მანიპულაციების/მაქინაციების ჩატარება აღარაა პრობლემა biggrin.gif


P.s

VirtualAlloc მუშაობს როგორც Calloc() და არა Malloc(), გამოყოფილ რეგიონს 0-ებით ავსებს პირდაპირ.



P.s
ალბათ უფრო ციკლი -> შიგნით მეორე ციკლი, კი


syaruna


ზოგიერთს უფრო cout მოსწონს, სერიოზულად რომ განვიხილოთ, ალბათ უფრო გემოვნების ამბავია smile.gif
ჩემთვის printf-ით ფორმატირება უფრო მარტივი და მისაღებია


ასევე scanf და სხვა C-ს წაკითხვის ფუნქციები მირჩევნია მათ C++ ანალოგებს.

This post has been edited by ბიჭური on 23 Jul 2017, 16:02
syaruna
Crazy Member


*****
ჯგუფი: Members
წერილები: 3111
წევრი No.: 154790
რეგისტრ.: 5-October 12

გამოგზავნილია: 23 Jul 2017, 16:03  #51015666      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
ბიჭური
გასაგებია მე cout უფრო მეთვალჩინება მე მეგონა რამე განსხვავებული დატვირთვები ქონდა..
elodin
Master


*****
ჯგუფი: Members
წერილები: 2560
წევრი No.: 227083
რეგისტრ.: 16-December 16

გამოგზავნილია: 23 Jul 2017, 16:04  #51015671      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
წადი ბიჭო .Net -ს დაუბრუნდი. biggrin.gif


--------------------
თვითონ ისეთი ის იყო.

არანაირი არაფერი.

წამოდი ყავა დავლიოთ.

ხიდები ჩემგან დროშები ჩემგან.
ბიჭური
Super Crazy Member +


*******
ჯგუფი: Members
წერილები: 13036
წევრი No.: 157590
რეგისტრ.: 20-December 12

გამოგზავნილია: 25 Jul 2017, 21:27  #51029403      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
მოკლედ ჩემს ძველ დადებულ კოდს გადავხედე ფორუმზე და ჯერ ერთი არ მუშაობდა, მერე არასწორი კომენტარები ეწერა, ალბათ ინგლისურიც არ ვიცოდი წესიერად მაგ დროს biggrin.gif
პატარა კორექტივები შევიტანე და ავამუშავე ყველაფერი, სტატიაც დავწერე საკმაოდ საინტერესო.

ესეც ლინკი

k3rnelmode.blogspot.com


ამ ბლოგში დავწერ მსგავს სტატიებს, არა მხოლოდ С არამედ С#-ზეც

მიზანი ლიტეატურული/ტექნიკური ენის სქილის დახვეწაა, რომელიც ჯერ ჯერობით ძალიან ცუდი მაქვს. gigi.gif
მიყვარს სტატიების წერა...

სამხედრო თემატიკაზე ძალიან დიდი და პოპულარული ბლოგი მქონდა უცხოური აუდიტორიისთვის, მერე წავშალე

This post has been edited by ბიჭური on 25 Jul 2017, 21:34
Dixtosa
Crazy Member


*****
ჯგუფი: Members
წერილები: 2930
წევრი No.: 95742
რეგისტრ.: 14-July 09

გამოგზავნილია: 26 Jul 2017, 08:09  #51031201      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა · ვებგვერდი
უკვე საკმაოდ დიდი ბიჭი ხარ და გეობა შმეობა ტერმინები რომ ამოიღო დროა.

Wear your big boy pants and deal with it.
ბიჭური


--------------------
25 წლის რომ გავხდები.....
ოცდამეექვსეში შევალ!


გaːψ

There are 10 types of ppl ones who understand binary, ones who don't and ones who know that this list can be endless.
ბიჭური
Super Crazy Member +


*******
ჯგუფი: Members
წერილები: 13036
წევრი No.: 157590
რეგისტრ.: 20-December 12

გამოგზავნილია: 26 Jul 2017, 10:00  #51031532      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
Dixtosa

Why so serious tho? smile.gif

Мы молодые, шутливые..

This post has been edited by ბიჭური on 26 Jul 2017, 10:06
ბიჭური
Super Crazy Member +


*******
ჯგუფი: Members
წერილები: 13036
წევრი No.: 157590
რეგისტრ.: 20-December 12

გამოგზავნილია: 22 Sep 2017, 12:53  #51377131      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
მოკლედ ჩემთვის ვხოდავდი რაღაც მცირე დამხმარე საშუალებას რომელიც შეამცირებს კოდის დუბლირებას სისტემური გამოძახებების დროს.
ე.ი ნებისმიერ NTDLL ფუნქციაზე მოგცემს პირდაპირ პოინტერს და ცალკე აღარ მოგიწევს მაგის ჩალიჩი და პირდაპირ გამოიყენებ

ვაკეთებთ ჰედერ ფაილს სადაც აღვწერთ ყველა სახის ფუნქციას რაც შეიძლება დაგვჭირდეს
(ყველაზე გამოყენებადი ფუნქციები ჩავყარე)

NtHeaders.h

CODE
#pragma once
#include <Windows.h>
#include <winternl.h>

/*Definitions of NTDLL functi0ns and structures*/


typedef struct CLIENT_ID
{
UINT64 UniqueProcess;
UINT64 UniqueThread;
}client_id, *pclient_id;



typedef struct initial_teb
{
void* stack_base;
void* stack_limit;
void* stack_commit;
void* stack_commit_max;
void* stack_reserved;
} initial_teb, *pinitial_teb;

typedef void* (__stdcall* RtlAllocateHeapPtr) (HANDLE heap, ULONG flags, SIZE_T size);

typedef NTSTATUS(__stdcall * NtQuerySystemInformationPtr) (SYSTEM_INFORMATION_CLASS SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength);


typedef NTSTATUS(__stdcall* NtSuspendProcessPtr) (HANDLE ProcessHandle);

typedef NTSTATUS(__stdcall* NtProtectVirtualMemoryPtr) (IN HANDLE ProcessHandle, IN OUT PVOID *BaseAddress, IN OUT PULONG NumberOfBytesToProtect, IN ULONG NewAccessProtection, OUT PULONG OldAccessProtection);

typedef NTSTATUS(__stdcall* NtCreateThreadPtr)(OUT PHANDLE thread_handle, IN ACCESS_MASK desired_access, IN POBJECT_ATTRIBUTES object_attributes, IN HANDLE process_handle, OUT pclient_id client_id, PCONTEXT thread_context,
IN pinitial_teb intitial_teb, IN BOOLEAN create_suspend);

typedef NTSTATUS(__stdcall* NtSuspendThreadPtr)(IN HANDLE thread_handle, OUT PULONG previous_susepdn OPTIONAL);

typedef NTSTATUS(__stdcall* NtTerminateProcessPtr)(IN HANDLE process_handle, IN NTSTATUS exit_status);

typedef NTSTATUS(__stdcall* ZwOpenProcessPtr)(OUT PHANDLE process_handle, IN ACCESS_MASK desired_access,
IN POBJECT_ATTRIBUTES object_attributes,
_In_opt_   pclient_id
client_id);

typedef NTSTATUS(__stdcall * RtlCreateUserThreadPtr)(HANDLE hProcess,
SECURITY_DEscr1ptOR* pSec,
BOOLEAN fCreateSuspended,
SIZE_T StackZeroBits,
SIZE_T* StackReserved,
SIZE_T* StackCommit,
void*,
void*,
HANDLE* pThreadHandle,
pclient_id pResult);

typedef struct _SYSTEM_INFORMATION_CLASS_
{
ULONG NextEntryOffset;
ULONG NumberOfThreads;
LARGE_INTEGER Reserved[3];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ImageName;
ULONG BasePriority;
HANDLE ProcessId;
HANDLE InheritedFromProcessId;
}_SYSTEM_PROCESS_INFORMATION_;




ვაკეთებთ სტრუქტურას რომელიც შეიცავს ამ ფუნქციების სახეებს (პოინტერის ტიპებს)

CODE
typedef struct
{
NtSuspendThreadPtr NtSuspendThread;
NtTerminateProcessPtr NtTerminateProcess;
ZwOpenProcessPtr ZwOpenProcess;
RtlAllocateHeapPtr RtlAllocateHeap;
NtProtectVirtualMemoryPtr NtProtectVirtualMemory;
NtSuspendProcessPtr NtSuspendProcess;
RtlCreateUserThreadPtr RtlCreateUserThread;  
NtQuerySystemInformationPtr NtQuerySystemInformation;

}functi0nPointers;


ვაკეთებთ Enum-ს ყველა პოინტერის ტიპის შესაბამისს, ამას გადავცემთ პარამეტრად ფუნქციას და ის დაგვიბრუნებს ენამის მიხედვით პოინტერს სტრუქტურაზე, რომელიც შეიცავს პოინტერს საჭირო ფუნქციაზე

CODE
typedef enum
{
NtProtectVirtualMemory,
NtSuspendProcess,
NtSuspendThread,
RtlCreateUserThread,
ZwOpenProcess,
QuerySystemInformation
}functi0nType;



ფუნქციის პროტოტიპი

CODE
functi0nPointers * Getfuncti0nPointers(functi0nType type);


იმპლემენტაცია


CODE

functi0nPointers *Getfuncti0nPointers(functi0nType  functi0n)
{
functi0nPointers * func_ptr = (functi0nPointers*) malloc(sizeof(functi0nPointers) * 1);  

const HMODULE _ntdll = GetModuleHandleA("ntdll.dll"); //Get pointer to NTDLL inside our process address space
if (!NT_SUCCESS(_ntdll))
{
 printf("Failed to get NTDLL handle, exiting!\n");
 return func_ptr;
}
switch (functi0n)
{
case NtProtectVirtualMemory:
 func_ptr -> NtProtectVirtualMemory = (NtProtectVirtualMemoryPtr)(GetProcAddress(_ntdll, "NtProtectVirtualMEmory"));
 break;
case NtSuspendProcess:
 func_ptr -> NtSuspendProcess = (NtSuspendProcessPtr)(GetProcAddress(_ntdll, "NtSuspendProcess"));
 break;
case NtSuspendThread:
 func_ptr -> NtSuspendThread = (NtSuspendThreadPtr)(GetProcAddress(_ntdll, "NtSuspendThread"));
 break;
case RtlCreateUserThread:
 func_ptr -> RtlCreateUserThread = (RtlCreateUserThreadPtr)(GetProcAddress(_ntdll, "RtlCreateUserThread"));
 break;
case ZwOpenProcess:
 func_ptr -> ZwOpenProcess = (ZwOpenProcessPtr)(GetProcAddress(_ntdll, "ZwOpenProcess"));
 break;
case QuerySystemInformation:
 func_ptr -> NtQuerySystemInformation = (NtQuerySystemInformationPtr)(GetProcAddress(_ntdll, "NtQuerySystemInformation"));
default:
 return func_ptr;
}
return func_ptr;
}



გამოძახების შემდეგ დააბრუნებს პოინტერს functi0nPointers სტრუქტურაზე, რომელშიც იქნება პოინტერი ფუნქციაზე (როგორც ზემოთ დავწერე გადაცემული ენამის მიხედვით)

გამოძახება შემდეგი გზით

CODE
functi0nPointers *fptr = Getfuncti0nPointers(QuerySystemInformation);


დაგვიბრუნებს პოინტერს სტურქტურაზე რომელიც შეიცავს პოინტერს NtQuerySystemInformation-ზე

გამოყენების მაგალითი
რადგანაც პოინტერს აბრუნებს, ვიყენებთ ასე

CODE
*fptr -> functi0n(args)




სრული მაგალითი ფუნქციის გამოძახებით :

CODE

//Uses NtQuerySystemInformation native functi0n to retrieve system process information
void NtTaskManager()
{
functi0nPointers *fptr = Getfuncti0nPointers(QuerySystemInformation);
void* buffer = (int*)malloc(1500 * 1500);
_SYSTEM_PROCESS_INFORMATION_* info_ptr = (_SYSTEM_PROCESS_INFORMATION_*)buffer;
NTSTATUS status = fptr->NtQuerySystemInformation(SystemProcessInformation, info_ptr, 1500 * 1500, NULL);
NT_SUCCESS(status)
 ? printf("Successfully called NtQuerySystemInformation and got data! \n")
 : printf("Failed to call NtQuerySystemInformation");
int processes = 0;
do
{
 printf("\nProcess : \t %ws | ID: %p | Number of threads : %d \n", info_ptr->ImageName.Buffer, info_ptr->ProcessId, info_ptr->NumberOfThreads);
 info_ptr = (_SYSTEM_PROCESS_INFORMATION_*)((BYTE*)info_ptr + info_ptr->NextEntryOffset);
 ++processes;
} while (info_ptr->NextEntryOffset != (ULONG)NULL);
printf("\nTotal Process count : %d \n", processes);
free(fptr);
}




ნუ რეალურად ისეთი არაფერი უბრალოდ დაყოფის მხრივ უფრო კომფორტული გამოდგა და ყველგან ერთი და იგივე ოპერაციების ჩატარება არ მიწევს, იქნებ ვინმეს გამოგადგეთ ვისაც გაინტერესებთ მსგავსი თემები

P.s


ფორუმი უყლევებს, functi0n სადაც უნდა ეწეროს, functi0n-ით ჩამინაცვლა რატომღაც
facepalm.gif


პ.ს
ერორ ჩექინგია ჩასამატებელი და საერთოდ შით კოდია facepalm.gif

This post has been edited by ბიჭური on 22 Sep 2017, 13:07
0 წევრი ათვალიერებს ამ თემას (0 სტუმარი და 0 უჩინარი წევრი)
0 წევრი:
Topic Options გამოხმაურება · ახალი თემა · ახალი გამოკითხვა

 



ფორუმის სერვერების განთავსებას და ინტერნეტთან კავშირს უზრუნველყოფს: CLOUD9
[ Script Execution time: 0.0192 ]   [ 13 queries used ]   [ GZIP Disabled ]