{"id":426650,"date":"2024-07-19T09:00:22","date_gmt":"2024-07-19T09:00:22","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=426650"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=426650","title":{"rendered":"<span>\u041d\u0435\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 DLL. \u0421\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432 LoadLibrary<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u043e\u0431\u043e\u043b\u0435\u043b \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043a\u0443\u0440\u0441\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0443\u0447\u0435\u0431\u044b \u0432 \u0438\u043d\u0441\u0442\u0438\u0442\u0443\u0442\u0435, \u0438 \u0432\u043e\u0442, \u0441\u043f\u0443\u0441\u0442\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u044f \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0440\u0435\u0448\u0438\u043b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u0432 \u041e\u0421 Windows \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f DLL \u043e\u0442 LoadLibrary \u0434\u043e \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u041f\u043e\u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438, \u044f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Github \u00a0paskalian  <a href=\"https:\/\/(https:\/\/github.com\/paskalian\/WID_LoadLibrary\" rel=\"noopener noreferrer nofollow\">WID_LoadLibrary<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0430\u0432\u0442\u043e\u0440 \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u043b \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435\u0445 \u044d\u0442\u0430\u043f\u043e\u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041e\u0434\u043d\u0430\u043a\u043e, \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f, \u0441 \u043f\u043e\u043b\u0442\u044b\u0447\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0435 \u0437\u0430\u0432\u043e\u0434\u0438\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0440\u0430\u043d\u044c\u0448\u0435 \u0442\u0440\u0430\u0432\u0430 \u0431\u044b\u043b\u0430 \u0437\u0435\u043b\u0435\u043d\u0435\u0435.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442, \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f API \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443:<\/p>\n<pre><code class=\"cpp\"> #include \"Windows.h\"  int main() {     LoadLibraryA(\"user32.dll\"); } <\/code><\/pre>\n<p>\u0421\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u0432 IDA \u0438 \u043f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u043e\u043c<\/p>\n<p>\u0412\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0434\u043b\u044f kernel32, ntdll \u0438 kernelbase<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3eb\/9c8\/80a\/3eb9c880a01fe1a97d05ba188d08fd68.png\" width=\"416\" height=\"348\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3eb\/9c8\/80a\/3eb9c880a01fe1a97d05ba188d08fd68.png\"\/><\/figure>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c\u0441\u044f ProcessHacker \u0438 \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ac4\/e46\/5dc\/ac4e465dc1f82b6a744c6618bdaf4eeb.png\" width=\"595\" height=\"355\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ac4\/e46\/5dc\/ac4e465dc1f82b6a744c6618bdaf4eeb.png\"\/><\/figure>\n<p>\u0418\u0442\u0430\u043a, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 LoadLibraryA \u0432 kernel32:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c83\/e0a\/fdc\/c83e0afdcd1a4625838983da5ef39885.png\" width=\"428\" height=\"131\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c83\/e0a\/fdc\/c83e0afdcd1a4625838983da5ef39885.png\"\/><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/422\/cc7\/d16\/422cc7d16e89c90d72153f1d3228e259.png\" width=\"845\" height=\"122\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/422\/cc7\/d16\/422cc7d16e89c90d72153f1d3228e259.png\"\/><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u043e\u0432 LoadLibraryA \u0432 kernelbase.<\/p>\n<p>Kernelbase_LoadLibraryA:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/760\/cbc\/565\/760cbc56576f579a9bd1f50306aa50a7.png\" width=\"974\" height=\"453\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/760\/cbc\/565\/760cbc56576f579a9bd1f50306aa50a7.png\"\/><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0438\u0434\u0438\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 twain_32.dll. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u00abtwain_32.dll\u00bb, \u043a\u00a0\u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u00abC:\\Windows\\\u00bb \u0438 \u0441\u043d\u043e\u0432\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f kernelbase_LoadLibraryA.<\/p>\n<p>\u0418\u043d\u0430\u0447\u0435, \u0432\u044b\u0437\u043e\u0432 \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 kernelbase_LoadLibraryExA \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 0, 0 (\u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438 \u043f\u0443\u0441\u0442\u044b\u0435 \u0444\u043b\u0430\u0433\u0438) <\/p>\n<p>kernelbase_LoadLibraryExA:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2f3\/219\/255\/2f3219255c2e9df321d35d901ca51d83.png\" width=\"974\" height=\"343\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2f3\/219\/255\/2f3219255c2e9df321d35d901ca51d83.png\"\/><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0431\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438 \u0432\u044b\u0437\u043e\u0432 \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 LoadLibraryExW.<\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 UNICODE_STRING \u0438 LLExW \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f UNICODE_STRING.Buffer, 0, dwFlags.<\/p>\n<p>kernelbase_LoadLibraryExW:<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/48f\/dcc\/ca1\/48fdccca1ca277ecfd3f58547fa5f918.png\" width=\"974\" height=\"129\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/48f\/dcc\/ca1\/48fdccca1ca277ecfd3f58547fa5f918.png\"\/><\/figure>\n<pre><code class=\"cpp\">if (!lpLibFileName || hFile || ((dwFlags &amp; 0xFFFF0000) != 0) || (DatafileFlags == LLEXW_ASDATAFILE))<\/code><\/pre>\n<p>\u0418 \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0430 0xC000000D    <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/aab\/2f2\/257\/aab2f2257082ac78fd0b61a975722567.png\" width=\"974\" height=\"151\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/aab\/2f2\/257\/aab2f2257082ac78fd0b61a975722567.png\"\/><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 UNICODE_STRING \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435 \u0431\u0443\u0444\u0435\u0440\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c:<\/p>\n<p>\u0414\u043b\u0438\u043d\u0430 \u043d\u0435 0, \u0438\u043d\u0430\u0447\u0435\u00a0\u2014 \u043e\u0448\u0438\u0431\u043a\u0430<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u043f\u0440\u043e\u0431\u0435\u043b\u044b, \u043e\u043d\u0438 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0434\u043e\u0443\u0434\u0430\u043b\u044f\u043b\u0438\u0441\u044c \u0441\u043d\u043e\u0432\u0430 \u0434\u043e \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0442\u043e \u0441\u043d\u043e\u0432\u0430 \u043e\u0448\u0438\u0431\u043a\u0430<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c42\/9b0\/677\/c429b067791f26fe58a6b18832fdf015.png\" width=\"974\" height=\"535\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c42\/9b0\/677\/c429b067791f26fe58a6b18832fdf015.png\"\/><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0435\u0441\u043b\u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0444\u043b\u0430\u0433 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043a\u0430\u043a DataFile, \u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f LdrGetDllPath, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0430\u044f \u043f\u0443\u0442\u044c \u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0438, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 BasepLoadLibraryAsDataFileInternal \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f, \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3d9\/838\/746\/3d9838746e78c14bc585ff4b47f2fe5c.png\" width=\"974\" height=\"277\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3d9\/838\/746\/3d9838746e78c14bc585ff4b47f2fe5c.png\"\/><\/figure>\n<p>\u0418\u043d\u0430\u0447\u0435, \u0444\u043b\u0430\u0433\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043d\u0430 DONT_RESOLVE_DLL_REFERENCES, LOAD_PACKAGED_LIBRARY, LOAD_LIBRARY_REQUIRE_SIGNED_TARGET, LOAD_LIBRARY_OS_INTEGRITY_CONTINUITY<\/p>\n<p>\u0418 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 LdrLoadDll. \u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0445\u0443\u043a\u0430\u044e\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0440\u0435\u0434\u043a\u043e \u0441\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0433\u043b\u0443\u0431\u0436\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8ac\/fe0\/feb\/8acfe0feb8aab7bbef9c376aa1ec8aad.png\" width=\"974\" height=\"676\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8ac\/fe0\/feb\/8acfe0feb8aab7bbef9c376aa1ec8aad.png\"\/><\/figure>\n<p>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">typedef NTSTATUS(WINAPI* pLdrLoadDll)(PWCHAR PathToFile, ULONG Flags, PUNICODE_STRING ModuleFileName, PHANDLE ModuleHandle);<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a LdrLoadDll:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/de5\/4b0\/165\/de54b0165784bf908157d4e09946695f.png\" width=\"495\" height=\"467\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/de5\/4b0\/165\/de54b0165784bf908157d4e09946695f.png\"\/><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0444\u043b\u0430\u0433\u043e\u0432<\/p>\n<p>\u0418 \u0434\u0430\u043b\u0435\u0435 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 LdrpInitializeDllPath, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e paskalian \u043e\u043f\u0438\u0441\u0430\u043b \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">struct LDR_UNKSTRUCT { PWSTR pInitNameMaybe; __declspec(align(16)) PWSTR Buffer; int Flags; PWSTR pDllName; char Pad1[84]; BOOLEAN IsInitedMaybe; char Pad2[3]; }; <\/code><\/pre>\n<p>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">typedef NTSTATUS(__fastcall* pLdrpInitializeDllPath)(PWSTR DllName, PWSTR DllPath, LDR_UNKSTRUCT* DllPathInited);<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 LdrpLoadDll<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d76\/a81\/81e\/d76a8181e0cab26efb4d54ff99fa5de9.png\" width=\"680\" height=\"421\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d76\/a81\/81e\/d76a8181e0cab26efb4d54ff99fa5de9.png\"\/><\/figure>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u0430\u043a \u0438 \u0432\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435, \u0443\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0438 \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0435\u0434\u043a\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435.<\/p>\n<p>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">typedef NTSTATUS(__fastcall* pLdrpLoadDll)(PUNICODE_STRING DllName, LDR_UNKSTRUCT* DllPathInited, ULONG Flags, LDR_DATA_TABLE_ENTRY** DllEntry);<\/code><\/pre>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0443\u0442\u0438 \u043a Dll \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/p>\n<p>LdrpPreprocessDllName, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442\u0441\u044f \u0438\u043c\u044f, \u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442 \u0438\u043c\u0451\u043d, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0440\u0435\u0437\u043e\u043b\u0432\u044f\u0442\u0441\u044f DOS-\u043f\u0443\u0442\u0438.<\/p>\n<p>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f:<\/p>\n<pre><code class=\"cpp\">typedef NTSTATUS(__fastcall* pLdrpPreprocessDllName)(PUNICODE_STRING DllName, PUNICODE_STRING ResName, PULONG pZero, PULONG pFlags);<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0443\u0442\u044c, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e LdrpLoadDllInternal<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dcb\/ab4\/498\/dcbab449894234c4778215be38315fba.png\" width=\"974\" height=\"581\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dcb\/ab4\/498\/dcbab449894234c4778215be38315fba.png\"\/><\/figure>\n<p>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">typedef NTSTATUS(__fastcall* pLdrpLoadDllInternal)(PUNICODE_STRING FullPath, LDR_UNKSTRUCT* DllPathInited, ULONG Flags, ULONG LdrFlags, PLDR_DATA_TABLE_ENTRY LdrEntry, PLDR_DATA_TABLE_ENTRY LdrEntry2, PLDR_DATA_TABLE_ENTRY* DllEntry, NTSTATUS* pStatus);<\/code><\/pre>\n<p>LdrFlags \u0438 LdrEntry \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0432\u043d\u044b 0<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435:<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f, \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u043b\u0438 dll \u0440\u0430\u043d\u0435\u0435 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e LdrpFastpthReloadedDll.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fe4\/c52\/2e3\/fe4c522e3f0e5a71b32ad07d70208dc3.png\" width=\"956\" height=\"214\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fe4\/c52\/2e3\/fe4c522e3f0e5a71b32ad07d70208dc3.png\"\/><\/figure>\n<p>\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u043c \u043d\u0435 \u0432\u0430\u0436\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \ud83d\ude42<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f LdrpFindOrPrepareLoadingModule, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f, \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u043b\u0438 \u0443\u0436\u0435 dll \u043a\u0443\u0434\u0430-\u043b\u0438\u0431\u043e, \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043b\u0438 \u043e\u043d\u0430 KnownDll, \u043b\u0438\u0431\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f placeholder \u0434\u043b\u044f dll.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c dll \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435, \u043a\u0430\u043a \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u0430\u044f (\u043a\u0430\u043a \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 user32.dll), \u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/159\/87e\/ae9\/15987eae997818ed6e7d223bc76cbacb.png\" width=\"753\" height=\"402\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/159\/87e\/ae9\/15987eae997818ed6e7d223bc76cbacb.png\"\/><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d23\/077\/968\/d230779688c0f54c97f9d76920142f7a.png\" width=\"714\" height=\"431\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d23\/077\/968\/d230779688c0f54c97f9d76920142f7a.png\"\/><\/figure>\n<p>\u0415\u0441\u043b\u0438 DLL \u043d\u0435 \u0431\u044b\u043b\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u043a\u0430\u043a \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u043d\u0435\u0435, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f LdrpProcessWork, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/71a\/462\/fea\/71a462fea005a9a9740209fb8f6ba19a.png\" width=\"974\" height=\"202\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/71a\/462\/fea\/71a462fea005a9a9740209fb8f6ba19a.png\"\/><\/figure>\n<p>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">typedef NTSTATUS(__fastcall* pLdrpProcessWork)(PLDRP_LOAD_CONTEXT LoadContext, BOOLEAN IsLoadOwner);<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0442\u0443\u0442 \u0436\u0435, \u0432 LdrpLoadDllInternal \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Dll, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u043e \u0432\u0441\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/19f\/d35\/b43\/19fd35b438c7da94cb679c9fa6886cae.png\" width=\"573\" height=\"483\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/19f\/d35\/b43\/19fd35b438c7da94cb679c9fa6886cae.png\"\/><\/figure>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a LdrpProcessWork:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d1b\/986\/c85\/d1b986c85a6798482bcf50ae2d59d05f.png\" width=\"974\" height=\"712\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d1b\/986\/c85\/d1b986c85a6798482bcf50ae2d59d05f.png\"\/><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c. \u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0435\u043a\u0446\u0438\u0439 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u042d\u0442\u043e \u0443\u0436\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u0435\u043c\u0430, \u043a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c. \u0412 \u0446\u0435\u043b\u043e\u043c, \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u0440\u043e \u0440\u0443\u0447\u043d\u043e\u0439 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e. \u0415\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e, \u0442\u043e \u0432\u043e\u0442:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/01c\/94a\/b97\/01c94ab974140d30a71730f5c71dec53.png\" width=\"428\" height=\"152\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/01c\/94a\/b97\/01c94ab974140d30a71730f5c71dec53.png\"\/><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/75a\/4b0\/6e7\/75a4b06e71823b184f8d216081f6ec18.png\" width=\"431\" height=\"104\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/75a\/4b0\/6e7\/75a4b06e71823b184f8d216081f6ec18.png\"\/><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/48f\/58e\/b9a\/48f58eb9ad6fcafb7c797e1d0d71a7df.png\" width=\"433\" height=\"88\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/48f\/58e\/b9a\/48f58eb9ad6fcafb7c797e1d0d71a7df.png\"\/><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/515\/7b6\/fbd\/5157b6fbd39d5667cd511727e2b6c8b1.png\" width=\"428\" height=\"123\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/515\/7b6\/fbd\/5157b6fbd39d5667cd511727e2b6c8b1.png\"\/><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2ac\/27f\/301\/2ac27f3013b5264da156e0be74a8f9e7.png\" width=\"904\" height=\"252\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2ac\/27f\/301\/2ac27f3013b5264da156e0be74a8f9e7.png\"\/><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8b4\/dbf\/1da\/8b4dbf1da1b1b590f62f951fa43984d4.png\" width=\"441\" height=\"156\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8b4\/dbf\/1da\/8b4dbf1da1b1b590f62f951fa43984d4.png\"\/><\/figure>\n<p>\u0418\u0442\u0430\u043a, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0432\u0448\u0438\u0441\u044c \u0441\u043e \u0441\u0442\u0435\u043a\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0430 \u0438\u043c\u0435\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0442\u0430\u043a\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>LoadLibrary(A,W)<\/p>\n<\/li>\n<li>\n<p>LoadLibraryEx(A,W)<\/p>\n<\/li>\n<li>\n<p>LdrLoadDll<\/p>\n<\/li>\n<li>\n<p>LdrpLoadDll<\/p>\n<\/li>\n<li>\n<p>LdrpLoadDllInternal<\/p>\n<\/li>\n<li>\n<p>LdrpProcessWork<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u0441 LoadLibrary \u0438 LoadLibraryEx \u0432\u0441\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0442\u043e LdrLoadDll \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"cpp\">HMODULE hNtdll = LoadLibraryA(\"ntdll.dll\"); pLdrLoadDll fnLdrLoadDll = (pLdrLoadDll)GetProcAddress(hNtdll, \"LdrLoadDll\"); UNICODE_STRING ModuleFileName; RtlInitUnicodeStringEx(&amp;ModuleFileName,L\"user32.dll\"); HANDLE hModule = NULL; NTSTATUS status = fnLdrLoadDll((PWSTR)(0x7F08 | 1), 0, &amp;ModuleFileName, &amp;hModule);<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0443\u0436\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e LdrpLoadDll.<\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 \u0432 \u0432\u0438\u0434\u0435 \u0431\u0430\u0439\u0442\u043e\u0432 \u043d\u0430\u0447\u0430\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/p>\n<p>\u041e\u0442\u043a\u0440\u043e\u0435\u043c IDA, \u043d\u0430\u0439\u0434\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 ntdll \u0438 \u043e\u0442\u043a\u0440\u043e\u0435\u043c \u044d\u0442\u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u0432 Hex View:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/956\/d05\/129\/956d05129febae2f532037c1185b8c01.png\" width=\"758\" height=\"314\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/956\/d05\/129\/956d05129febae2f532037c1185b8c01.png\"\/><\/figure>\n<p>\u041e\u0442\u0441\u044e\u0434\u0430 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">BYTE ldrpLoadDllStart[] = { 0x40, 0x55, 0x53, 0x56, 0x57, 0x41, 0x56, 0x41, 0x57, 0x48, 0x8D, 0x6C, 0x24, 0x88, 0x48, 0x81, 0xEC, 0x78, 0x01, 0x00, 0x00, 0x48, 0x8B, 0x05, 0xB8, 0xD1, 0x16, 0x00,  0x48, 0x33, 0xC4, 0x48, 0x89, 0x45, 0x60, 0x48 };<\/code><\/pre>\n<p>\u0418 \u0438\u0449\u0435\u043c \u044d\u0442\u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435:<\/p>\n<pre><code class=\"cpp\">MODULEINFO modinfo = {}; HMODULE hNtdll = LoadLibraryA(\"ntdll.dll\"); GetModuleInformation(GetCurrentProcess(), hNtdll, &amp;modinfo, sizeof(modinfo)); void* addressLdrpLoadDllStart = 0; int size = sizeof(ldrpLoadDllStart); for (int i = 0; i &lt; modinfo.SizeOfImage - size; i++) { if (memcmp((BYTE*)(modinfo.lpBaseOfDll) + i, ldrpLoadDllStart, size) == 0) { addressLdrpLoadDllStart = (BYTE*)(modinfo.lpBaseOfDll) + i; break; } }<\/code><\/pre>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"cpp\">pLdrpLoadDll ldrpLoadDll = (pLdrpLoadDll)addressLdrpLoadDllStart;<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435, \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f ldrpInitializeDllPath, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435.<\/p>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c:<\/p>\n<pre><code class=\"cpp\">LDR_UNKSTRUCT someStruct = {}; LDR_DATA_TABLE_ENTRY* DllEntry = {}; ULONG flags = 0; WCHAR origDllPath[] = L\"user32.dll\"; UNICODE_STRING uniOrigDllName; RtlInitUnicodeStringEx(&amp;uniOrigDllName, origDllPath); ldrpInitializeDllPath(uniOrigDllName.Buffer, (PWSTR)(0x7F08 | 1), &amp;someStruct); ldrpLoadDll(&amp;uniOrigDllName, &amp;someStruct, NULL, &amp;DllEntry);<\/code><\/pre>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443.<\/p>\n<p>\u0422\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u043e\u0441\u0442, \u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0438 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 Windows, \u0442.\u043a. \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u043a\u043e\u0434 paskalian \u0441\u0435\u0439\u0447\u0430\u0441 \u0438 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u043f\u0440\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043e\u0442 <a href=\"https:\/\/habr.com\/ru\/users\/MichelleVermishelle\/\" rel=\"noopener noreferrer nofollow\">@MichelleVermishelle<\/a> \u00a0<a href=\"https:\/\/github.com\/MzHmO\/SymProcAddress\" rel=\"noopener noreferrer nofollow\">SymProcAddress <\/a><\/p>\n<p>\u042d\u0442\u043e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.<\/p>\n<p>\u041c\u0438\u0445\u0430\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0435\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0430 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0431\u0435\u0437 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u043e\u0432. \u041c\u044b \u0436\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0438\u0434\u0435\u044e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u043d\u0435\u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0434\u0435\u044e \u041c\u0438\u0445\u0430\u0438\u043b\u0430 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435\u043c. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043d\u0443\u0436\u043d\u044b\u0445 \u043d\u0430\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043e\u0442\u043a\u0443\u0434\u0430 IDA \u043a\u0430\u0447\u0430\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u044b:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dec\/cd1\/b60\/deccd1b60511471dce7efb73c0c9ace9.png\" width=\"974\" height=\"92\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dec\/cd1\/b60\/deccd1b60511471dce7efb73c0c9ace9.png\"\/><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0432\u0438\u0434\u0430 <a href=\"http:\/\/msdl.microsoft.com\/download\/symbols\/%7bmodule_name%7d.pdb\/%7b%D0%BD%D0%B5%D0%BA%D0%B8%D0%B9_hash%7d\/%7bmodulename%7d.pdb\" rel=\"noopener noreferrer nofollow\">http:\/\/msdl.microsoft.com\/download\/symbols\/{module_name}.pdb\/{\u043d\u0435\u043a\u0438\u0439_hash}\/{modulename}.pdb<\/a><\/p>\n<p>\u042d\u0442\u043e\u0442 \u0445\u044d\u0448 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>GetPdbSignature<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">bool GetPdbSignature(const std::string&amp; dllPath, GUID&amp; pdbGuid, DWORD&amp; pdbAge) { if (!SymInitialize(GetCurrentProcess(), NULL,TRUE)) { return false; } HMODULE hModule = LoadLibraryExA(dllPath.c_str(), NULL, DONT_RESOLVE_DLL_REFERENCES); if (!hModule) { SymCleanup(GetCurrentProcess()); return false; } MODULEINFO modInfo; if (!GetModuleInformation(GetCurrentProcess(), hModule, &amp;modInfo, sizeof(modInfo))) { FreeLibrary(hModule); SymCleanup(GetCurrentProcess()); return false; } DWORD64 baseAddr = reinterpret_cast&lt;DWORD64>(modInfo.lpBaseOfDll); IMAGEHLP_MODULE64 moduleInfo; ZeroMemory(&amp;moduleInfo, sizeof(moduleInfo)); moduleInfo.SizeOfStruct = sizeof(moduleInfo);  if (!SymGetModuleInfo64(GetCurrentProcess(), (DWORD64)modInfo.lpBaseOfDll, &amp;moduleInfo)) { FreeLibrary(hModule); SymCleanup(GetCurrentProcess()); return false; } pdbGuid = moduleInfo.PdbSig70; pdbAge = moduleInfo.PdbAge; FreeLibrary(hModule); SymCleanup(GetCurrentProcess());  return true; } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0431\u0443\u0434\u0435\u043c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438 \u0443\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0442\u0430\u043c, \u0433\u0434\u0435 \u043c\u044b \u0438\u0445 \u043f\u043e\u043b\u043e\u0436\u0438\u043c.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c GUID \u0438 AGE \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u00ab\u0445\u044d\u0448\u00bb:<\/p>\n<pre><code class=\"cpp\">GUID pdbGuid; DWORD pdbAge; GetPdbSignature(dllPath, pdbGuid, pdbAge); wchar_t guid_string[MAX_PATH] = {}; swprintf( guid_string, sizeof(guid_string) \/ sizeof(guid_string[0]), L\"%08x%04x%04x%02x%02x%02x%02x%02x%02x%02x%02x%01x\", pdbGuid.Data1, pdbGuid.Data2, pdbGuid.Data3, pdbGuid.Data4[0], pdbGuid.Data4[1], pdbGuid.Data4[2], pdbGuid.Data4[3], pdbGuid.Data4[4], pdbGuid.Data4[5], pdbGuid.Data4[6], pdbGuid.Data4[7], pdbAge);<\/code><\/pre>\n<p>\u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c URL \u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u0444\u0430\u0439\u043b:<\/p>\n<details class=\"spoiler\">\n<summary>downloadDebugSymbols<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">bool downloadDebugSymbols(const std::wstring&amp; guid, const std::wstring&amp; filename) { std::wstring baseUrl = L\"https:\/\/msdl.microsoft.com\/download\/symbols\"; std::wstring pdbUrl = baseUrl + L\"\/\" + filename + L\"\/\" + guid + L\"\/\" + filename;  HRESULT hr = URLDownloadToFileW( NULL, pdbUrl.c_str(), filename.c_str(), 0, NULL );  return SUCCEEDED(hr); } bool success = downloadDebugSymbols(guid_string, L\"ntdll.pdb\"); <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043d\u0443\u0436\u043d\u043e\u0439 \u043d\u0430\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<details class=\"spoiler\">\n<summary>GetAddressFromSymbols<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">FARPROC GetAddressFromSymbols(HANDLE hProcess, LPCSTR fullModulePath, LPCSTR pdbPath, LPCSTR lpProcName) { if (!SymInitialize(hProcess, NULL, TRUE)) { printf(\"SymInitialize failed: %lu\\n\", GetLastError()); return 0; } if (!SymSetSearchPath(hProcess, pdbPath)) { printf(\"SymSetSearchPath failed: %lu\\n\", GetLastError()); SymCleanup(hProcess); return 0; } DWORD64 baseOfDll = SymLoadModuleEx(hProcess, NULL, fullModulePath, NULL, 0, 0, NULL, 0); if (baseOfDll == 0) { printf(\"SymLoadModuleEx failed: %lu\\n\", GetLastError()); SymCleanup(hProcess); return 0; } SYMBOL_INFO* symbol = (SYMBOL_INFO*)malloc(sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)); symbol->MaxNameLen = MAX_SYM_NAME; symbol->SizeOfStruct = sizeof(SYMBOL_INFO); if (SymFromName(hProcess, lpProcName, symbol)) { printf(\"Symbol found: %s at address 0x%0llX\\n\", symbol->Name, symbol->Address); FARPROC result = (FARPROC)symbol->Address; free(symbol); SymCleanup(hProcess); return result; } else { printf(\"SymFromName failed: %lu\\n\", GetLastError()); } free(symbol); SymCleanup(hProcess); return 0; } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 DLL<\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">typedef struct _LSA_UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR  Buffer; } LSA_UNICODE_STRING, * PLSA_UNICODE_STRING, UNICODE_STRING, * PUNICODE_STRING;  struct LDR_UNKSTRUCT { PWSTR pInitNameMaybe; __declspec(align(16)) PWSTR Buffer; int Flags; PWSTR pDllName; char Pad1[84]; BOOLEAN IsInitedMaybe; char Pad2[3]; }; typedef BOOLEAN(NTAPI* PLDR_INIT_ROUTINE)( _In_ PVOID DllHandle, _In_ ULONG Reason, _In_opt_ PVOID Context ); typedef struct _LDR_SERVICE_TAG_RECORD { struct _LDR_SERVICE_TAG_RECORD* Next; ULONG ServiceTag; } LDR_SERVICE_TAG_RECORD, * PLDR_SERVICE_TAG_RECORD; typedef struct _LDRP_CSLIST { PSINGLE_LIST_ENTRY Tail; } LDRP_CSLIST, * PLDRP_CSLIST; typedef enum _LDR_DDAG_STATE { LdrModulesMerged = -5, LdrModulesInitError = -4, LdrModulesSnapError = -3, LdrModulesUnloaded = -2, LdrModulesUnloading = -1, LdrModulesPlaceHolder = 0, LdrModulesMapping = 1, LdrModulesMapped = 2, LdrModulesWaitingForDependencies = 3, LdrModulesSnapping = 4, LdrModulesSnapped = 5, LdrModulesCondensed = 6, LdrModulesReadyToInit = 7, LdrModulesInitializing = 8, LdrModulesReadyToRun = 9 } LDR_DDAG_STATE; typedef struct _LDR_DDAG_NODE { LIST_ENTRY Modules; PLDR_SERVICE_TAG_RECORD ServiceTagList; ULONG LoadCount; ULONG LoadWhileUnloadingCount; ULONG LowestLink; union { LDRP_CSLIST Dependencies; SINGLE_LIST_ENTRY* RemovalLink; }; LDRP_CSLIST IncomingDependencies; LDR_DDAG_STATE State; SINGLE_LIST_ENTRY* CondenseLink; ULONG PreorderNumber; ULONG Pad; } LDR_DDAG_NODE, * PLDR_DDAG_NODE; typedef struct _RTL_BALANCED_NODE { union { struct _RTL_BALANCED_NODE* Children[2];                              struct { struct _RTL_BALANCED_NODE* Left;                                 struct _RTL_BALANCED_NODE* Right;                                }; }; union { struct { UCHAR Red : 1;                                                     UCHAR Balance : 2;                                                 }; ULONG ParentValue;                                                   }; } RTL_BALANCED_NODE, * PRTL_BALANCED_NODE; typedef enum _LDR_DLL_LOAD_REASON { LoadReasonStaticDependency, LoadReasonStaticForwarderDependency, LoadReasonDynamicForwarderDependency, LoadReasonDelayloadDependency, LoadReasonDynamicLoad, LoadReasonAsImageLoad, LoadReasonAsDataLoad, LoadReasonEnclavePrimary,  LoadReasonEnclaveDependency, LoadReasonPatchImage,  LoadReasonUnknown = -1 } LDR_DLL_LOAD_REASON, * PLDR_DLL_LOAD_REASON; typedef enum _LDR_HOT_PATCH_STATE { LdrHotPatchBaseImage, LdrHotPatchNotApplied, LdrHotPatchAppliedReverse, LdrHotPatchAppliedForward, LdrHotPatchFailedToPatch, LdrHotPatchStateMax, } LDR_HOT_PATCH_STATE, * PLDR_HOT_PATCH_STATE; typedef struct _LDRP_LOAD_CONTEXT { UNICODE_STRING BaseDllName; LDR_UNKSTRUCT* UnkStruct; HANDLE SectionHandle; DWORD Flags; NTSTATUS* pStatus; LDR_DATA_TABLE_ENTRY* Entry; _LIST_ENTRY WorkQueueListEntry; LDR_DATA_TABLE_ENTRY* ReplacedEntry; LDR_DATA_TABLE_ENTRY** pvImports; LDR_DATA_TABLE_ENTRY** IATCheck; PVOID pvIAT; ULONG SizeOfIAT; ULONG CurrentDll; PIMAGE_IMPORT_DESCRIPTOR pImageImportDescriptor; ULONG ImageImportDescriptorLen; __declspec(align(8)) ULONG OriginalIATProtect; PVOID GuardCFCheckFunctionPointer; __int64 GuardFlags; __int64 DllNameLenCompare; __int64 UnknownFunc; SIZE_T Size; __int64 UnknownPtr; HANDLE FileHandle; PIMAGE_DOS_HEADER ImageBase; wchar_t BaseDllNameBuffer[260]; } LDRP_LOAD_CONTEXT, * PLDRP_LOAD_CONTEXT; typedef struct _LDR_DATA_TABLE_ENTRY { LIST_ENTRY InLoadOrderLinks; LIST_ENTRY InMemoryOrderLinks; union { LIST_ENTRY InInitializationOrderLinks; LIST_ENTRY InProgressLinks; }; PIMAGE_DOS_HEADER DllBase; PLDR_INIT_ROUTINE EntryPoint; ULONG SizeOfImage; UNICODE_STRING FullDllName; UNICODE_STRING BaseDllName; union { UCHAR FlagGroup[4]; ULONG Flags; struct { ULONG PackagedBinary : 1; ULONG MarkedForRemoval : 1; ULONG ImageDll : 1; ULONG LoadNotificationsSent : 1; ULONG TelemetryEntryProcessed : 1; ULONG ProcessStaticImport : 1; ULONG InLegacyLists : 1; ULONG InIndexes : 1; ULONG ShimDll : 1; ULONG InExceptionTable : 1; ULONG ReservedFlags1 : 2; ULONG LoadInProgress : 1; ULONG LoadConfigProcessed : 1; ULONG EntryProcessed : 1; ULONG ProtectDelayLoad : 1; ULONG ReservedFlags3 : 2; ULONG DontCallForThreads : 1; ULONG ProcessAttachCalled : 1; ULONG ProcessAttachFailed : 1; ULONG CorDeferredValidate : 1; ULONG CorImage : 1; ULONG DontRelocate : 1; ULONG CorILOnly : 1; ULONG ChpeImage : 1; ULONG ChpeEmulatorImage : 1; ULONG ReservedFlags5 : 1; ULONG Redirected : 1; ULONG ReservedFlags6 : 2; ULONG CompatDatabaseProcessed : 1; }; }; USHORT ObsoleteLoadCount; USHORT TlsIndex; LIST_ENTRY HashLinks; ULONG TimeDateStamp; struct _ACTIVATION_CONTEXT* EntryPointActivationContext; PVOID Lock;  PLDR_DDAG_NODE DdagNode; LIST_ENTRY NodeModuleLink; struct _LDRP_LOAD_CONTEXT* LoadContext; PVOID ParentDllBase; PVOID SwitchBackContext; RTL_BALANCED_NODE BaseAddressIndexNode; RTL_BALANCED_NODE MappingInfoIndexNode; ULONG_PTR OriginalBase; LARGE_INTEGER LoadTime; ULONG BaseNameHashValue; LDR_DLL_LOAD_REASON LoadReason;  ULONG ImplicitPathOptions; ULONG ReferenceCount;  ULONG DependentLoadFlags; UCHAR SigningLevel;  ULONG CheckSum;  PVOID ActivePatchImageBase; LDR_HOT_PATCH_STATE HotPatchState; } LDR_DATA_TABLE_ENTRY, * PLDR_DATA_TABLE_ENTRY;  typedef NTSTATUS(__fastcall* pRtlInitUnicodeStringEx)(PUNICODE_STRING target, PCWSTR source); typedef NTSTATUS(__fastcall* pLdrpLoadDll)(PUNICODE_STRING DllName, LDR_UNKSTRUCT* DllPathInited, ULONG Flags, LDR_DATA_TABLE_ENTRY** DllEntry); typedef NTSTATUS(WINAPI* pfnLdrLoadDll)(PWCHAR PathToFile, ULONG Flags, PUNICODE_STRING ModuleFileName, PHANDLE ModuleHandle); typedef NTSTATUS(__fastcall* pLdrpLoadDllInternal)(PUNICODE_STRING FullPath, LDR_UNKSTRUCT* DllPathInited, ULONG Flags, ULONG LdrFlags, PLDR_DATA_TABLE_ENTRY LdrEntry, PLDR_DATA_TABLE_ENTRY LdrEntry2, PLDR_DATA_TABLE_ENTRY* DllEntry, NTSTATUS* pStatus); typedef NTSTATUS(__fastcall* pLdrpInitializeDllPath)(PWSTR DllName, PWSTR DllPath, LDR_UNKSTRUCT* DllPathInited); typedef NTSTATUS(__fastcall* pLdrpPreprocessDllName)(PUNICODE_STRING DllName, PUNICODE_STRING ResName, PULONG pZero, PULONG pFlags); typedef NTSTATUS(__fastcall* pLdrpFindOrPrepareLoadingModule)(PUNICODE_STRING FullPath, LDR_UNKSTRUCT* DllPathInited, ULONG Flags, ULONG LdrFlags, PLDR_DATA_TABLE_ENTRY LdrEntry, PLDR_DATA_TABLE_ENTRY* pLdrEntryLoaded, NTSTATUS* pStatus); typedef NTSTATUS(__fastcall* pLdrpProcessWork)(PLDRP_LOAD_CONTEXT LoadContext, BOOLEAN IsLoadOwner); <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0430\u0440\u0443 DEFINE-\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 DLL:<\/p>\n<pre><code class=\"cpp\">#define MODE_LOADLIBRARYA 0 #define MODE_LOADLIBRARYEXA 1 #define MODE_LDRLOADDLL 2 #define MODE_LDRPLOADDLL 3 #define MODE_LDRPLOADDLLINTERNAL 4 #define MODE_LDRPPROCESSWORK 5<\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432\u0441\u0435\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">switch (mode) { case MODE_LOADLIBRARYA: { hResModule = LoadLibraryA(dllName); break; } case MODE_LOADLIBRARYEXA: { hResModule = LoadLibraryExA(dllName, 0, 0); break; } case MODE_LDRLOADDLL: { pLdrLoadDll fnLdrLoadDll = (pLdrLoadDll)GetProcAddress(hNtDll, \"LdrLoadDll\"); UNICODE_STRING ModuleFileName; RtlInitUnicodeStringEx(&amp;ModuleFileName, GetWC(dllName)); HANDLE hModule = NULL; NTSTATUS status = fnLdrLoadDll((PWSTR)(0x7F08 | 1), 0, &amp;ModuleFileName, &amp;hModule); break; } case MODE_LDRPLOADDLL: { LDR_UNKSTRUCT someStruct = {}; LDR_DATA_TABLE_ENTRY* DllEntry = {}; ULONG flags = 0; UNICODE_STRING uniDllName; RtlInitUnicodeStringEx(&amp;uniDllName, GetWC(dllName)); pLdrpInitializeDllPath ldrpInitializeDllPath = (pLdrpInitializeDllPath)(GetAddressFromSymbols(GetCurrentProcess(), \"C:\\\\Windows\\\\System32\\\\ntdll.dll\", \".\/ntdll.pdb\", \"LdrpInitializeDllPath\")); ldrpInitializeDllPath(uniDllName.Buffer, (PWSTR)(0x7F08 | 1), &amp;someStruct); pLdrpLoadDll ldrpLoadDll = (pLdrpLoadDll)(GetAddressFromSymbols(GetCurrentProcess(), \"C:\\\\Windows\\\\System32\\\\ntdll.dll\", \".\/ntdll.pdb\", \"LdrpLoadDll\")); ldrpLoadDll(&amp;uniDllName, &amp;someStruct, NULL, &amp;DllEntry); break; } case MODE_LDRPLOADDLLINTERNAL: { LDR_UNKSTRUCT someStruct = {}; LDR_DATA_TABLE_ENTRY* DllEntry = {}; ULONG flags = 0; UNICODE_STRING uniDllName; RtlInitUnicodeStringEx(&amp;uniDllName, GetWC(dllName)); UNICODE_STRING FullDllPath; WCHAR Buffer[128]; FullDllPath.Length = 0; FullDllPath.MaximumLength = MAX_PATH - 4; FullDllPath.Buffer = Buffer; Buffer[0] = 0; pLdrpPreprocessDllName ldrpPreprocessDllName = (pLdrpPreprocessDllName)(GetAddressFromSymbols(GetCurrentProcess(), \"C:\\\\Windows\\\\System32\\\\ntdll.dll\", \".\/ntdll.pdb\", \"LdrpPreprocessDllName\")); pLdrpLoadDllInternal ldrpLoadDllInternal = (pLdrpLoadDllInternal)(GetAddressFromSymbols(GetCurrentProcess(), \"C:\\\\Windows\\\\System32\\\\ntdll.dll\", \".\/ntdll.pdb\", \"LdrpLoadDllInternal\"));  NTSTATUS res = ldrpPreprocessDllName(&amp;uniDllName, &amp;FullDllPath, 0, &amp;flags); ldrpLoadDllInternal(&amp;FullDllPath, &amp;someStruct, flags, 0x4, 0, 0, &amp;DllEntry, &amp;res);  break; } case MODE_LDRPPROCESSWORK: { LDR_DATA_TABLE_ENTRY* pLdrEntryLoaded = 0; LDR_UNKSTRUCT undefStruct = {}; UNICODE_STRING uniDllName; RtlInitUnicodeStringEx(&amp;uniDllName, GetWC(dllName)); pLdrpInitializeDllPath ldrpInitializeDllPath = (pLdrpInitializeDllPath)(GetAddressFromSymbols(GetCurrentProcess(), \"C:\\\\Windows\\\\System32\\\\ntdll.dll\", \".\/ntdll.pdb\", \"LdrpInitializeDllPath\")); ldrpInitializeDllPath(uniDllName.Buffer, (PWSTR)(0x7F08 | 1), &amp;undefStruct); ULONG flags = 0; UNICODE_STRING FullDllPath; WCHAR Buffer[128]; FullDllPath.Length = 0; FullDllPath.MaximumLength = MAX_PATH - 4; FullDllPath.Buffer = Buffer; Buffer[0] = 0; pLdrpPreprocessDllName ldrpPreprocessDllName = (pLdrpPreprocessDllName)(GetAddressFromSymbols(GetCurrentProcess(), \"C:\\\\Windows\\\\System32\\\\ntdll.dll\", \".\/ntdll.pdb\", \"LdrpPreprocessDllName\")); NTSTATUS res = ldrpPreprocessDllName(&amp;uniDllName, &amp;FullDllPath, 0, &amp;flags); pLdrpFindOrPrepareLoadingModule ldrpFindOrPrepareLoadingModule = (pLdrpFindOrPrepareLoadingModule)(GetAddressFromSymbols(GetCurrentProcess(), \"C:\\\\Windows\\\\System32\\\\ntdll.dll\", \".\/ntdll.pdb\", \"LdrpFindOrPrepareLoadingModule\")); NTSTATUS Status = ldrpFindOrPrepareLoadingModule(&amp;FullDllPath, &amp;undefStruct, flags, 0x4, 0, &amp;pLdrEntryLoaded, &amp;res); pLdrpProcessWork ldrpProcessWork = (pLdrpProcessWork)(GetAddressFromSymbols(GetCurrentProcess(), \"C:\\\\Windows\\\\System32\\\\ntdll.dll\", \".\/ntdll.pdb\", \"LdrpProcessWork\"));  if (Status == STATUS_DLL_NOT_FOUND) NTSTATUS res = ldrpProcessWork(pLdrEntryLoaded->LoadContext, TRUE); break; } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0438\u043c\u0435\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6f4\/15f\/750\/6f415f7504ae90f8f82c2fc8ea3e2bdd.png\" width=\"974\" height=\"494\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6f4\/15f\/750\/6f415f7504ae90f8f82c2fc8ea3e2bdd.png\"\/><\/figure>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e paskalian \u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435. \u041c\u043d\u043e\u0433\u043e\u0435 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435.<\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e <a href=\"https:\/\/habr.com\/ru\/users\/MichelleVermishelle\/\" rel=\"noopener noreferrer nofollow\">@MichelleVermishelle<\/a> \u0437\u0430 \u0438\u0434\u0435\u044e \u0441 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438.<\/p>\n<blockquote>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 \u043c\u043e\u0435\u043c <a href=\"https:\/\/github.com\/FunnyWhaleDev\/AlterLoadDll\" rel=\"noopener noreferrer nofollow\">GitHub<\/a><\/p>\n<\/blockquote>\n<p>\u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 \u043d\u0430\u0448 telegram-\u043a\u0430\u043d\u0430\u043b <a href=\"https:\/\/t.me\/authoritywear\" rel=\"noopener noreferrer nofollow\">AUTHORITY<\/a><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/829892\/\"> https:\/\/habr.com\/ru\/articles\/829892\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u043e\u0431\u043e\u043b\u0435\u043b \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043a\u0443\u0440\u0441\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0443\u0447\u0435\u0431\u044b \u0432 \u0438\u043d\u0441\u0442\u0438\u0442\u0443\u0442\u0435, \u0438 \u0432\u043e\u0442, \u0441\u043f\u0443\u0441\u0442\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u044f \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0440\u0435\u0448\u0438\u043b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u0432 \u041e\u0421 Windows \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f DLL \u043e\u0442 LoadLibrary \u0434\u043e \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u041f\u043e\u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438, \u044f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Github \u00a0paskalian  <a href=\"https:\/\/(https:\/\/github.com\/paskalian\/WID_LoadLibrary\" rel=\"noopener noreferrer nofollow\">WID_LoadLibrary<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0430\u0432\u0442\u043e\u0440 \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u043b \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435\u0445 \u044d\u0442\u0430\u043f\u043e\u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041e\u0434\u043d\u0430\u043a\u043e, \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f, \u0441 \u043f\u043e\u043b\u0442\u044b\u0447\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0435 \u0437\u0430\u0432\u043e\u0434\u0438\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0440\u0430\u043d\u044c\u0448\u0435 \u0442\u0440\u0430\u0432\u0430 \u0431\u044b\u043b\u0430 \u0437\u0435\u043b\u0435\u043d\u0435\u0435.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442, \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f API \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443:<\/p>\n<pre><code class=\"cpp\"> #include \"Windows.h\"  int main() {     LoadLibraryA(\"user32.dll\"); } <\/code><\/pre>\n<p>\u0421\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u0432 IDA \u0438 \u043f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u043e\u043c<\/p>\n<p>\u0412\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0434\u043b\u044f kernel32, ntdll \u0438 kernelbase<\/p>\n<figure class=\"\"><\/figure>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c\u0441\u044f ProcessHacker \u0438 \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0418\u0442\u0430\u043a, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 LoadLibraryA \u0432 kernel32:<\/p>\n<figure class=\"\"><\/figure>\n<figure class=\"full-width\"><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u043e\u0432 LoadLibraryA \u0432 kernelbase.<\/p>\n<p>Kernelbase_LoadLibraryA:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0438\u0434\u0438\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 twain_32.dll. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u00abtwain_32.dll\u00bb, \u043a\u00a0\u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u00abC:\\Windows\\\u00bb \u0438 \u0441\u043d\u043e\u0432\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f kernelbase_LoadLibraryA.<\/p>\n<p>\u0418\u043d\u0430\u0447\u0435, \u0432\u044b\u0437\u043e\u0432 \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 kernelbase_LoadLibraryExA \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 0, 0 (\u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438 \u043f\u0443\u0441\u0442\u044b\u0435 \u0444\u043b\u0430\u0433\u0438) <\/p>\n<p>kernelbase_LoadLibraryExA:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0431\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438 \u0432\u044b\u0437\u043e\u0432 \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 LoadLibraryExW.<\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 UNICODE_STRING \u0438 LLExW \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f UNICODE_STRING.Buffer, 0, dwFlags.<\/p>\n<p>kernelbase_LoadLibraryExW:<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b<\/p>\n<figure class=\"full-width\"><\/figure>\n<pre><code class=\"cpp\">if (!lpLibFileName || hFile || ((dwFlags &amp; 0xFFFF0000) != 0) || (DatafileFlags == LLEXW_ASDATAFILE))<\/code><\/pre>\n<p>\u0418 \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0430 0xC000000D    <\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 UNICODE_STRING \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435 \u0431\u0443\u0444\u0435\u0440\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c:<\/p>\n<p>\u0414\u043b\u0438\u043d\u0430 \u043d\u0435 0, \u0438\u043d\u0430\u0447\u0435\u00a0\u2014 \u043e\u0448\u0438\u0431\u043a\u0430<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u043f\u0440\u043e\u0431\u0435\u043b\u044b, \u043e\u043d\u0438 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0434\u043e\u0443\u0434\u0430\u043b\u044f\u043b\u0438\u0441\u044c \u0441\u043d\u043e\u0432\u0430 \u0434\u043e \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0442\u043e \u0441\u043d\u043e\u0432\u0430 \u043e\u0448\u0438\u0431\u043a\u0430<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0435\u0441\u043b\u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0444\u043b\u0430\u0433 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043a\u0430\u043a DataFile, \u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f LdrGetDllPath, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0430\u044f \u043f\u0443\u0442\u044c \u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0438, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 BasepLoadLibraryAsDataFileInternal \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f, \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0418\u043d\u0430\u0447\u0435, \u0444\u043b\u0430\u0433\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043d\u0430 DONT_RESOLVE_DLL_REFERENCES, LOAD_PACKAGED_LIBRARY, LOAD_LIBRARY_REQUIRE_SIGNED_TARGET, LOAD_LIBRARY_OS_INTEGRITY_CONTINUITY<\/p>\n<p>\u0418 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 LdrLoadDll. \u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0445\u0443\u043a\u0430\u044e\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0440\u0435\u0434\u043a\u043e \u0441\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0433\u043b\u0443\u0431\u0436\u0435.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">typedef NTSTATUS(WINAPI* pLdrLoadDll)(PWCHAR PathToFile, ULONG Flags, PUNICODE_STRING ModuleFileName, PHANDLE ModuleHandle);<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a LdrLoadDll:<\/p>\n<figure class=\"\"><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0444\u043b\u0430\u0433\u043e\u0432<\/p>\n<p>\u0418 \u0434\u0430\u043b\u0435\u0435 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 LdrpInitializeDllPath, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e paskalian \u043e\u043f\u0438\u0441\u0430\u043b \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">struct LDR_UNKSTRUCT { PWSTR pInitNameMaybe; __declspec(align(16)) PWSTR Buffer; int Flags; PWSTR pDllName; char Pad1[84]; BOOLEAN IsInitedMaybe; char Pad2[3]; }; <\/code><\/pre>\n<p>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">typedef NTSTATUS(__fastcall* pLdrpInitializeDllPath)(PWSTR DllName, PWSTR DllPath, LDR_UNKSTRUCT* DllPathInited);<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 LdrpLoadDll<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u0430\u043a \u0438 \u0432\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435, \u0443\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0438 \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0435\u0434\u043a\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435.<\/p>\n<p>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">typedef NTSTATUS(__fastcall* pLdrpLoadDll)(PUNICODE_STRING DllName, LDR_UNKSTRUCT* DllPathInited, ULONG Flags, LDR_DATA_TABLE_ENTRY** DllEntry);<\/code><\/pre>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0443\u0442\u0438 \u043a Dll \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/p>\n<p>LdrpPreprocessDllName, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442\u0441\u044f \u0438\u043c\u044f, \u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442 \u0438\u043c\u0451\u043d, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0440\u0435\u0437\u043e\u043b\u0432\u044f\u0442\u0441\u044f DOS-\u043f\u0443\u0442\u0438.<\/p>\n<p>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f:<\/p>\n<pre><code class=\"cpp\">typedef NTSTATUS(__fastcall* pLdrpPreprocessDllName)(PUNICODE_STRING DllName, PUNICODE_STRING ResName, PULONG pZero, PULONG pFlags);<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0443\u0442\u044c, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e LdrpLoadDllInternal<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">typedef NTSTATUS(__fastcall* pLdrpLoadDllInternal)(PUNICODE_STRING FullPath, LDR_UNKSTRUCT* DllPathInited, ULONG Flags, ULONG LdrFlags, PLDR_DATA_TABLE_ENTRY LdrEntry, PLDR_DATA_TABLE_ENTRY LdrEntry2, PLDR_DATA_TABLE_ENTRY* DllEntry, NTSTATUS* pStatus);<\/code><\/pre>\n<p>LdrFlags \u0438 LdrEntry \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0432\u043d\u044b 0<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435:<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f, \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u043b\u0438 dll \u0440\u0430\u043d\u0435\u0435 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e LdrpFastpthReloadedDll.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u043c \u043d\u0435 \u0432\u0430\u0436\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \ud83d\ude42<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f LdrpFindOrPrepareLoadingModule, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f, \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u043b\u0438 \u0443\u0436\u0435 dll \u043a\u0443\u0434\u0430-\u043b\u0438\u0431\u043e, \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043b\u0438 \u043e\u043d\u0430 KnownDll, \u043b\u0438\u0431\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f placeholder \u0434\u043b\u044f dll.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c dll \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435, \u043a\u0430\u043a \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u0430\u044f (\u043a\u0430\u043a \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 user32.dll), \u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/p>\n<figure class=\"full-width\"><\/figure>\n<figure class=\"full-width\"><\/figure>\n<p>\u0415\u0441\u043b\u0438 DLL \u043d\u0435 \u0431\u044b\u043b\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u043a\u0430\u043a \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u043d\u0435\u0435, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f LdrpProcessWork, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">typedef NTSTATUS(__fastcall* pLdrpProcessWork)(PLDRP_LOAD_CONTEXT LoadContext, BOOLEAN IsLoadOwner);<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0442\u0443\u0442 \u0436\u0435, \u0432 LdrpLoadDllInternal \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Dll, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u043e \u0432\u0441\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a LdrpProcessWork:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c. \u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0435\u043a\u0446\u0438\u0439 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u042d\u0442\u043e \u0443\u0436\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u0435\u043c\u0430, \u043a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c. \u0412 \u0446\u0435\u043b\u043e\u043c, \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u0440\u043e \u0440\u0443\u0447\u043d\u043e\u0439 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e. \u0415\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e, \u0442\u043e \u0432\u043e\u0442:<\/p>\n<figure class=\"\"><\/figure>\n<figure class=\"\"><\/figure>\n<figure class=\"\"><\/figure>\n<figure class=\"\"><\/figure>\n<figure class=\"full-width\"><\/figure>\n<figure class=\"\"><\/figure>\n<p>\u0418\u0442\u0430\u043a, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0432\u0448\u0438\u0441\u044c \u0441\u043e \u0441\u0442\u0435\u043a\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0430 \u0438\u043c\u0435\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0442\u0430\u043a\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>LoadLibrary(A,W)<\/p>\n<\/li>\n<li>\n<p>LoadLibraryEx(A,W)<\/p>\n<\/li>\n<li>\n<p>LdrLoadDll<\/p>\n<\/li>\n<li>\n<p>LdrpLoadDll<\/p>\n<\/li>\n<li>\n<p>LdrpLoadDllInternal<\/p>\n<\/li>\n<li>\n<p>LdrpProcessWork<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u0441 LoadLibrary \u0438 LoadLibraryEx \u0432\u0441\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0442\u043e LdrLoadDll \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"cpp\">HMODULE hNtdll = LoadLibraryA(\"ntdll.dll\"); pLdrLoadDll fnLdrLoadDll = (pLdrLoadDll)GetProcAddress(hNtdll, \"LdrLoadDll\"); UNICODE_STRING ModuleFileName; RtlInitUnicodeStringEx(&amp;ModuleFileName,L\"user32.dll\"); HANDLE hModule = NULL; NTSTATUS status = fnLdrLoadDll((PWSTR)(0x7F08 | 1), 0, &amp;ModuleFileName, &amp;hModule);<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0443\u0436\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e LdrpLoadDll.<\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 \u0432 \u0432\u0438\u0434\u0435 \u0431\u0430\u0439\u0442\u043e\u0432 \u043d\u0430\u0447\u0430\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/p>\n<p>\u041e\u0442\u043a\u0440\u043e\u0435\u043c IDA, \u043d\u0430\u0439\u0434\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 ntdll \u0438 \u043e\u0442\u043a\u0440\u043e\u0435\u043c \u044d\u0442\u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u0432 Hex View:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041e\u0442\u0441\u044e\u0434\u0430 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">BYTE ldrpLoadDllStart[] = { 0x40, 0x55, 0x53, 0x56, 0x57, 0x41, 0x56, 0x41, 0x57, 0x48, 0x8D, 0x6C, 0x24, 0x88, 0x48, 0x81, 0xEC, 0x78, 0x01, 0x00, 0x00, 0x48, 0x8B, 0x05, 0xB8, 0xD1, 0x16, 0x00,  0x48, 0x33, 0xC4, 0x48, 0x89, 0x45, 0x60, 0x48 };<\/code><\/pre>\n<p>\u0418 \u0438\u0449\u0435\u043c \u044d\u0442\u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435:<\/p>\n<pre><code class=\"cpp\">MODULEINFO modinfo = {}; HMODULE hNtdll = LoadLibraryA(\"ntdll.dll\"); GetModuleInformation(GetCurrentProcess(), hNtdll, &amp;modinfo, sizeof(modinfo)); void* addressLdrpLoadDllStart = 0; int size = sizeof(ldrpLoadDllStart); for (int i = 0; i &lt; modinfo.SizeOfImage - size; i++) { if (memcmp((BYTE*)(modinfo.lpBaseOfDll) + i, ldrpLoadDllStart, size) == 0) { addressLdrpLoadDllStart = (BYTE*)(modinfo.lpBaseOfDll) + i; break; } }<\/code><\/pre>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"cpp\">pLdrpLoadDll ldrpLoadDll = (pLdrpLoadDll)addressLdrpLoadDllStart;<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435, \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f ldrpInitializeDllPath, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435.<\/p>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c:<\/p>\n<pre><code class=\"cpp\">LDR_UNKSTRUCT someStruct = {}; LDR_DATA_TABLE_ENTRY* DllEntry = {}; ULONG flags = 0; WCHAR origDllPath[] = L\"user32.dll\"; UNICODE_STRING uniOrigDllName; RtlInitUnicodeStringEx(&amp;uniOrigDllName, origDllPath); ldrpInitializeDllPath(uniOrigDllName.Buffer, (PWSTR)(0x7F08 | 1), &amp;someStruct); ldrpLoadDll(&amp;uniOrigDllName, &amp;someStruct, NULL, &amp;DllEntry);<\/code><\/pre>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443.<\/p>\n<p>\u0422\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u043e\u0441\u0442, \u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0438 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 Windows, \u0442.\u043a. \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u043a\u043e\u0434 paskalian \u0441\u0435\u0439\u0447\u0430\u0441 \u0438 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u043f\u0440\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043e\u0442 <a href=\"https:\/\/habr.com\/ru\/users\/MichelleVermishelle\/\" rel=\"noopener noreferrer nofollow\">@MichelleVermishelle<\/a> \u00a0<a href=\"https:\/\/github.com\/MzHmO\/SymProcAddress\" rel=\"noopener noreferrer nofollow\">SymProcAddress <\/a><\/p>\n<p>\u042d\u0442\u043e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.<\/p>\n<p>\u041c\u0438\u0445\u0430\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0435\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0430 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0431\u0435\u0437 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u043e\u0432. \u041c\u044b \u0436\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0438\u0434\u0435\u044e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u043d\u0435\u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0434\u0435\u044e \u041c\u0438\u0445\u0430\u0438\u043b\u0430 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435\u043c. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043d\u0443\u0436\u043d\u044b\u0445 \u043d\u0430\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043e\u0442\u043a\u0443\u0434\u0430 IDA \u043a\u0430\u0447\u0430\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u044b:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0432\u0438\u0434\u0430 <a href=\"http:\/\/msdl.microsoft.com\/download\/symbols\/%7bmodule_name%7d.pdb\/%7b%D0%BD%D0%B5%D0%BA%D0%B8%D0%B9_hash%7d\/%7bmodulename%7d.pdb\" rel=\"noopener noreferrer nofollow\">http:\/\/msdl.microsoft.com\/download\/symbols\/{module_name}.pdb\/{\u043d\u0435\u043a\u0438\u0439_hash}\/{modulename}.pdb<\/a><\/p>\n<p>\u042d\u0442\u043e\u0442 \u0445\u044d\u0448 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>GetPdbSignature<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">bool GetPdbSignature(const std::string&amp; dllPath, GUID&amp; pdbGuid, DWORD&amp; pdbAge) { if (!SymInitialize(GetCurrentProcess(), NULL,TRUE)) { return false; } HMODULE hModule = LoadLibraryExA(dllPath.c_str(), NULL, DONT_RESOLVE_DLL_REFERENCES); if (!hModule) { SymCleanup(GetCurrentProcess()); return false; } MODULEINFO modInfo; if (!GetModuleInformation(GetCurrentProcess(), hModule, &amp;modInfo, sizeof(modInfo))) { FreeLibrary(hModule); SymCleanup(GetCurrentProcess()); return false; } DWORD64 baseAddr = reinterpret_cast&lt;DWORD64>(modInfo.lpBaseOfDll); IMAGEHLP_MODULE64 moduleInfo; ZeroMemory(&amp;moduleInfo, sizeof(moduleInfo)); moduleInfo.SizeOfStruct = sizeof(moduleInfo);  if (!SymGetModuleInfo64(GetCurrentProcess(), (DWORD64)modInfo.lpBaseOfDll, &amp;moduleInfo)) { FreeLibrary(hModule); SymCleanup(GetCurrentProcess()); return false; } pdbGuid = moduleInfo.PdbSig70; pdbAge = moduleInfo.PdbAge; FreeLibrary(hModule); SymCleanup(GetCurrentProcess());  return true; } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0431\u0443\u0434\u0435\u043c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438 \u0443\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0442\u0430\u043c, \u0433\u0434\u0435 \u043c\u044b \u0438\u0445 \u043f\u043e\u043b\u043e\u0436\u0438\u043c.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c GUID \u0438 AGE \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u00ab\u0445\u044d\u0448\u00bb:<\/p>\n<pre><code class=\"cpp\">GUID pdbGuid; DWORD pdbAge; GetPdbSignature(dllPath, pdbGuid, pdbAge); wchar_t guid_string[MAX_PATH] = {}; swprintf( guid_string, sizeof(guid_string) \/ sizeof(guid_string[0]),<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-426650","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/426650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=426650"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/426650\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=426650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=426650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=426650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}