MCPcopy Create free account
hub / github.com/NtQuery/Scylla / scanMemoryPage

Method scanMemoryPage

Scylla/IATReferenceScan.cpp:128–184  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

126}
127
128void IATReferenceScan::scanMemoryPage( PVOID BaseAddress, SIZE_T RegionSize )
129{
130 BYTE * dataBuffer = (BYTE *)calloc(RegionSize, 1);
131 BYTE * currentPos = dataBuffer;
132 int currentSize = (int)RegionSize;
133 DWORD_PTR currentOffset = (DWORD_PTR)BaseAddress;
134 _DecodeResult res;
135 unsigned int instructionsCount = 0, next = 0;
136
137 if (!dataBuffer)
138 return;
139
140 if (ProcessAccessHelp::readMemoryFromProcess((DWORD_PTR)BaseAddress, RegionSize, (LPVOID)dataBuffer))
141 {
142 while (1)
143 {
144 ZeroMemory(&ProcessAccessHelp::decomposerCi, sizeof(_CodeInfo));
145 ProcessAccessHelp::decomposerCi.code = currentPos;
146 ProcessAccessHelp::decomposerCi.codeLen = currentSize;
147 ProcessAccessHelp::decomposerCi.dt = ProcessAccessHelp::dt;
148 ProcessAccessHelp::decomposerCi.codeOffset = currentOffset;
149
150 instructionsCount = 0;
151
152 res = distorm_decompose(&ProcessAccessHelp::decomposerCi, ProcessAccessHelp::decomposerResult, sizeof(ProcessAccessHelp::decomposerResult)/sizeof(ProcessAccessHelp::decomposerResult[0]), &instructionsCount);
153
154 if (res == DECRES_INPUTERR)
155 {
156 break;
157 }
158
159 for (unsigned int i = 0; i < instructionsCount; i++)
160 {
161 if (ProcessAccessHelp::decomposerResult[i].flags != FLAG_NOT_DECODABLE)
162 {
163 analyzeInstruction(&ProcessAccessHelp::decomposerResult[i]);
164 }
165 }
166
167 if (res == DECRES_SUCCESS) break; // All instructions were decoded.
168 else if (instructionsCount == 0) break;
169
170 next = (unsigned long)(ProcessAccessHelp::decomposerResult[instructionsCount-1].addr - ProcessAccessHelp::decomposerResult[0].addr);
171
172 if (ProcessAccessHelp::decomposerResult[instructionsCount-1].flags != FLAG_NOT_DECODABLE)
173 {
174 next += ProcessAccessHelp::decomposerResult[instructionsCount-1].size;
175 }
176
177 currentPos += next;
178 currentOffset += next;
179 currentSize -= next;
180 }
181 }
182
183 free(dataBuffer);
184}
185

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected