The Way Of Life
Google

Sunday, June 23, 2024

VBA Run-time error '-2146697208 (800c0008)': The download of the specified resource has failed.

Run-time error '-2146697208 (800c0008)': The download of the specified resource has failed.

Today. I want to share about the VBA  error that occurs on some users/computers but on others are fine. If you check the code, it was fine, and if you're running the code on some computer is running well, but on some computer occurs like the image above. The error that I’ve found is that the error occurs because the certificate on the server is not installed yet. When I send the HTTP request, it returns error "Run-time error '-2146697208 (800c0008)': The download of the specified resource has failed".

send http request - VBA


The solution is you can open Windows Internet Option, click Content, then open Certificates. Import certificates file ( .CER ) that generated from your server.

Internet Option - Windows

Import Certificate

If you don't have the certificate files from your server, you can generate certificate file first from the same menu ( choose Export ).

And the problem SOLVED.

Good luck, hope this solution will help you.


Operating System :

Windows 10, Windows 11

Software :

Microsoft Excel 2013, Microsoft Office 365

Visual Basic for Application

Labels: , , , ,

Monday, November 20, 2023

Aplikasi untuk Mengirim Pesan WhatsApp Otomatis

Kali ini saya akan sharing tentang bagaimana cara untuk mengirim pesan WhatsApp secara otomatis menggunakan aplikasi yang kita buat sendiri. Ada banyak cara yang bisa anda temukan di internet. Artikel yang saya tulis ini adalah salah satu caranya dan sudah saya buktikan berhasil.

Langkah langkahnya antara lain :

  1. Proses pengambilan data. Pada proses ini ada beberapa cara, antara lain menggunakan koneksi ke database langsung atau menggunakan API ( Application Programming Interface). Cara yang terakhir ini biasanya dipergunakan jika kita mengakses sistem yang dibuat oleh orang/pihak lain.
  2. Proses pengolahan data. Pada proses ini data yang sudah diterima harus diolah dahulu. Misal dalam tema kali ini adalah pengiriman pesan. Maka data mentah yang berupa misal nama,  alamat dan nomor telepon, perlu ditambah kalimat pesan sesuai dengan kebutuhan yang diinginkan.
  3. Proses pengiriman pesan. Pengiriman pesan WA untuk broadcast khususnya saat ini dimungkinkan melalui API yang disediakan rekanan WhatsApp yang ada di indonesia. Untuk saat ini karena kebetulan saya menggunakan produk dari Maxchat. Bukan karena saya ingin mempromosikan maxchat.

IMPLEMENTASI

Karena kebetulan aplikasi yang saya buat adalah menarik data dari sistem pihak lain, maka saya menggunakan API yang telah disediakan oleh vendor. Aplikasi yang saya buat adalah aplikasi Notifikasi WA di sebuah sekolah internasional. Aplikasi ini mengirimkan data ke orang tua murid jika salah satu anaknya masuk ke klinik di sekolah karena sudah hal.

  1. Proses memanggil fungsi API ke Skyward ( Sistem Informasi Akademik yang digunakan sekolah tersebut) saya kebetulan menggunakan bahasa pemogramaman Microsoft Visual Basic. Sebenarnya dengan bahasa pemrograman apa saja juga memungkinkan asal ada fungsi HTPP Request. Proses ini biasanya memerlukan beberapa parameter yaitu, alamat URL, user, password dan token. Ada bisa membaca detail-nya di tulisan saya sebelumnya disini.
  2. Pengolahan data. Setelah data diterima aplikasi (biasanya dalam bentuk JSON ) melalui http request yaitu berupa field student id, student name, status orang tua ( Ayah, Ibu, Guardian, Lain-nya ), Nama Ayah, nomor HP Ayah, Nama Ibu nomor HP Ibu, Nama Guardian, Nomor HP Guardian, Kelas, Tanggal Transaksi, Alasan masuk klinik, treatment, comment, dsb.  Maka perlu ditambahkan pesan tambahan agar pesan enak dan layak dibaca oleh orang tua murid yang nantinya akan menerima pesan WA. Juga untuk penyimpanan data ke database (MySQL/MariaDB) untuk mencatat error log serta mengecek apakah pesan tersebut sudah dikirim atau belum sehingga tidak ada duplikasi pengiriman pesan WA. 
  3. Proses pengiriman data. Kebetulan saya menggunakan API WA dari Maxchat. Sebanarnya ada banyak vendor rekanan WA di Indonesia selain Maxchat. Hanya karena kebetulan saya menggunakan API dari Maxchat maka fitur fitur dari Maxchat yang akan saya bahas. Parameter yang akan diperoleh dari maxchat adalah url endopoint untuk API.

Jika anda sudah mendaftar di maxchat maka anda akan mendapatkan link URL dan authorization key, lalu dokumentasi API yang bisa anda explore. Contoh link ada di bawah ini.

URL : https://core.maxchat.id/ nama-perusahaan /api/messages?skipBusy=true

Authorization : passkey

Dokumentasi : https://core.maxchat.id/nama-perusahaan/docs

  

Contoh format pesan text yang dikirim dalam bentuk JSON:

 {

"to":"0810000000000",

"type":"text",

"text":"Dear, *Mr. xxxx*\n \nWe would like to inform you that *Your Son* has visited school clinic.\n \nDate: 00 Nov 2023\nTime: 07:48:32 am\nOffice Visit Reason(s): Runny Nose\nTreatment(s): Apply Vicks VapoRub\nDisposition(s): Return to Class\nExamined By: Nurse \nComment: \nNotes: \n \n \nThank You.\n School Name \nFor further information please contact the school admin at\nhttps://wa.me/628200000000\n*This is an automated message - do not reply*",

"useTyping": true

}

Di maxchat juga disediakan fitur untuk mengecek apakah sebuah nomor wa aktif atau tidak dengan URL API : https://core.maxchat.id/nama-perusahaan/api/check?phone=081000000000'


Dengan respon balik exists  : true (artinya nomornya Aktif)  / false (Nomornya tidak aktif)

Juga karena ini adalah sebuah sekolah, maka tidak setiap waktu aplikasi ini aktif, program akan mulai aktif jam 7.30 pagi dan non aktif atau "tidur" jam 17.00, pada jam 12.00 siang hanya untuk mengecek bahwa program ini masih aktif berjalan saja. Pesan WA biasanya dikirim ke admin untuk mengetahui program masih berjalan atau error karena banyak sebab.

Demikian gambaran jika anda ingin membuat aplikasi notifikasi WA menggunakan bahasa pemogroman apapun dan API WA dari vendor apapapun karena pada intinya prosesnya akan sama.

Semoga bermanfaat.

 

Software :

Microsoft Visual Basic 6.0

MySQL / MariaDB

WhatsApp

Operating System : Windows 10

API Data : Skyward

API WA : Maxchat

Related links:

API Call Using Visual Basic 6 (JSON Response)

How to Make WhatsApp Office Visit / Clinic Notification on Skyward


Labels: , , , ,

Sunday, July 16, 2023

MySQL Connection Run Time error -2147467259 (80004005)

Run Time error -2147467259 (80004005)

Sometimes, when we are trying to connect MySQL/MariaDB database, it returns an error “[Microsoft] [ODBC Driver Manager] Data source name not found and no default driver specified”

In my case, When I’m using Visual Basic 6 and I never change the line of codes for the connection module, suddenly it returns an error like the above. I’m trying to find the error through the error message. 

Then, after I googled the solution, I found that I must add New Data Source on ODBC. So, I open the ODBC and add New Data Source on the System DSN tab, but it still returned an error. 


Another thought is MySQL Connector driver installed is for 32-bit, but when I checked the version it’s for 64-bit.


Again, adding a parameter on the connection string: Persist Security Info=true, inspired by my old case about the SQL Server connection string, and still not solved.

Finally, IT SOLVED by changing MySQL ODBC Driver from MySQL 8.0 Unicode Driver to MySQL ODBC 5.1 Driver.

MySQL ODBC 5.1 Driver

My Conclusion is that the MySQL ODBC 8.0 Unicode Driver has bugs, that cause when Visual Basic try to connect through the driver, the MSADO library doesn’t recognize the driver and returns an error  “[Microsoft] [ODBC Driver Manager] Data source name not found and no default driver specified”

With the same error pattern, maybe you can change the MySQL driver as I did, and you can also downgrade the driver version. I'm using version 5.01.6 (mysql-connector-odbc-5.1.6-winx64) that works to my case.


Software :

Microsoft Visual Basic 6.0
Microsoft ActiveX Data Object 6.1 Library
Microsoft Windows 10 Pro 64 bit

Labels: , , , , ,

Sunday, April 09, 2023

How to Make WhatsApp Office Visit / Clinic Notification on Skyward


As we know, until this article has been released. On Skyward, we are unable to make notifications through WhatsApp. Like Office Visit / Clinic Notification, Skyward only has e-mail notification. And the good news is, today I will share, how to make Office Visit Notification through WhatsApp using Skyward API and WhatsApp API.

First, you have to download Qmlative SDK from Skyward. If you have not used the Qmlativ SDK Explorer, you can download it by going to the Partner Portal, navigating to Documentation, clicking on Qmlativ, choosing "C# SDK", then choosing "Download" and then clicking the "Click here to download" link.  Once you have downloaded and extracted the .zip file, open up the folder and find the "QmlativSDKExplorer.exe.config" file and replace the following values:

  1. BaseUrl : this should be the API Url that you are using to connect
  2. Key : this should be your client key
  3. Secret : this should be your client secret

Once you've done that save and close the config file, then run the QmlativSDKExplorer.exe file.  Once it launches, simply click "Explore", and you should see something like the following image.

In the box on the left, expand the "Health" node, then scroll down to the "NameOfficeVisit" node and expand it, then expand the "Fields" node, and select each of the fields that you would want to include in the response from that object (note: there may not be many from this object that you're actually interested in at this time).  Scroll a little further down to the "Relationships" node and expand that node, and you will see all the relationships available to the NameOfficeVisit object, such as "Name", expand the nodes that you are interested in pulling data from, and you will notice that they, too, have "Fields" and "Relationships" nodes under them.  Also note, the grayed out nodes are not unavailable, they are usually relationships that will tend to create cartesian products if they are used, so they are not recommended.

Or you can download my xml saved items setting here.

It’s important to save your selected item to generate query on Qmlativ SDK because Skyward have maybe a hundred or thousand fields on the database and connections for sure. From my experience, it is hard to remember the selected field and intuitively choose the correct field. that’s why saving your selected fields is really important.

Skyward Qmlative SDK Explorer

Choosing your selected field on the SDK Explorer.

  • Health
    • NameOfficeVisit
      • Fields
        • NameOfficeVisitID
        • CreatedTime
        • EntityID
        • NameID
      • Relationships
        • Name
          • Demographics.Name
            • Fields
              • FirstName
              • LastName
              • ...

After you have done with the selected field. You can scroll all the way back up to the "NameOfficeVisit" node, and select it (don't uncheck it), and you should see a "Preview Data" button on the right-side of the screen. When you click that "Preview Data" button you will notice that it will open a screen allowing you to preview the data, but it will also add an entry to the bottom panel of the original window with a GET request that you can copy (though it doesn't scroll to the right, so you will want to copy the line and the line below to make sure you get everything).

https://skyward.iscorp.com/yourbaseurlAPI/custom/1/Health/NameOfficeVisit/1/250?searchFields%5B0%5D=NameOfficeVisitID&searchFields%5B1%5D=CreatedTime&searchFields%B2%5D=EntityID&searchFields%5B3%5D=NameID&searchFields%5B4%5D=Name.FirstName&seachFields%5B5%5D=Name.LastName&searchFields%5B6%5D=Name.Student.PrimaryStudentFamily.PrimaryStudentGuardian.NameGuardian.PrimaryNamePhone.PhoneNumber

Using that information, you can then translate it into your POST request by copying the search fields over to your query fields for your POST.  The only thing I would recommend is taking off the "%5B" and "%5D" after the "searchField" as it is unnecessary. But if you still using that code, it will still work, but just makes your query unnecessarily longer.


Now, with postman you can test the link to query data.

API Call Testing - postman

Don't forget to filter the result, for example only today's office visit transaction. you must add some code on the body request like code below.

{

    "SearchSort": [

    {

        "FieldName": "CreatedTime",

        "DocumentationIsComplete": true,

        "Descending": false

    }],

    "SearchCondition": {

        "DateTimeSearchCondition": {

            "ConditionType": "Greater",

            "FieldName": "CreatedTime",

            "Value": "2023-03-29T00:00:00"

        }

    }

}


Then in my project, I’m using Visual Basic 6 to connect with WA API from the provider. The paramater that I’ve used are :

  1. API URL
  2. Authorization 

You can download my code about API Call Using Visual Basic 6 here

And here is the code for call WA API.

url = "https://demo.waapi.id/demo1/api/chats/6281000000000(yourdestinationwanumber)/messages?direct=false"

xmlhttp.Open "POST", url, False

message= "Dear, " + "*" + GridResult.TextMatrix(1, 10) + "*" + "\n"

message = message + " " + "\n"

message = message + "We would like to inform you that " + "*" + GridResult.TextMatrix(1, 3) + "*" + " has visited school clinic." + "\n"

message = message + " " + "\n"

message = message + "Office Visit Reason(s): " + GridResult.TextMatrix(1, 5) + "\n"

message = message + "Treatment(s): " + GridResult.TextMatrix(1, 6) + "\n"

message = message + "Disposition(s): " + GridResult.TextMatrix(1, 4) + "\n"

message = message + "Examined By: " + GridResult.TextMatrix(1, 7) + "\n"

message = message + "Comment: " + GridResult.TextMatrix(1, 8) + "\n"

message = message + " " + "\n"

message = message + " " + "\n"

message = message + "Thank You." + "\n"

message = message + "Your School Name"


'create the body of the POST

sentitybody = "{" + vbCrLf + """text""" & ":""" & message + """" + vbCrLf + "}"


xmlhttp.setRequestHeader "Authorization", "Bearer" & " " & "8jRuDTXCwqqeqwewqkbVdfsderwr"

xmlhttp.setRequestHeader "Content-Type", "application/json"

Visual Basic WhatsApp Clinic Notification

The Image below is the result of the WhatsApp Clinic Notification.


Clinic WhatsApp Notification


Software :

Microsoft Visual Basic 6.0

Postman

WhatsApp API

Skyward Qmlative SDK

Skyward

related links:

Aplikasi untuk Mengirim Pesan WhatsApp Otomatis

Labels: , , ,

Sunday, February 26, 2023

How to send an Image(base64) to an API with Visual Basic

If from my last article, I explained how to make an API Call using Visual Basic. Today I will explain how to send an image to an API with Visual Basic.

The common way to send an image to an API is by using base64 encoding. If you don’t know what is base64 encoding is, you can see it here first.

There are so many ways to encode images in base64 format. But in this article, I’m using Visual Basic 6.0 to encode the image.

Without further ado, let’s read the step below.

First You can download the example base64 VB class here.

With that source code, you can try to upload an image. But that base64 class that I’ve downloaded has a “bug” that causes an error when we send an image to an API.

Here’s why?






That class is generating Enter characters or Carriage Return/CR characters causing an error because base64 encoding results are “dirty”. We can use Ms. Word to see these characters

So, the solution is we should remove all CR characters with Replace function on VB6.

Replace(Bas64.Base64Buf, vbCrLf, "")

You can add this code below to my source code that you can download here.

Base64StringImage = """" & Replace(Bas64.Base64Buf, vbCrLf, "") & """"

sEntityBody = "{" + vbCrLf + """reference_id"":99," + vbCrLf

sEntityBody = sEntityBody & """photo_image""" & ":" & Base64StringImage & vbCrLf & "}"


Good luck and hope this will be useful.


Software :

Windows 10 Pro

Ms. Visual Basic 6.0


Labels: , ,

Saturday, February 11, 2023

API Call Using Visual Basic 6 (JSON Response)


Today. I’m gonna show you how to make API (Application Programming Interface) Call using Microsoft Visual Basic 6. And the first step that you have to do is install Visual Basic, I’m using Visual Basic 6 by the way.

First, you must create Visual Basic Project and then go to Project – References , Add Microsoft XML v6.0 and then click OK.


Make a Procedure let say GetRequest


Public Sub GetRequest

Dim xmlhttp As New MSXML2.XMLHTTP60

Dim url as String

Dim Response as String


‘set url


url  = https://api.yourwebsite.com

xmlhttp.Open “POST”, url, False


‘set header

xmlhttp.setRequestHeader "Host:", "api.your.api.url.destionation.com"

xmlhttp.setRequestHeader " Key:", "xyz"

xmlhttp.setRequestHeader " Token:", "$2a$10$ "

xmlhttp.setRequestHeader "Origin:", "http://web.com"

xmlhttp.setRequestHeader "Content-Type", "application/json"


‘set body

sEntityBody = "{" + vbCrLf + """reference_id"":999," + vbCrLf

sEntityBody = sEntityBody & """image""" & ":" & Base64StringImage & vbCrLf & "}"

xmlhttp.send " " + sEntityBody


‘if status 200 ( success )

If xmlhttp.status = "200" Then

    Response = xmlhttp.responseText

    Set xmlhttp = Nothing

When we receive a response from server than we must parse JSON with JSON Parser

    Set p = JSON.parse(Response)

JSON parser for Visual Basic you can download from here and add to Project Modules.

If we want to extract data from JSON we can user object pointer like below :

Text1.text = P.item(“data” .Item("province").Item("raw")

If we want to extract data from members of the item we can code like this below :

For I = 1 To p.Item("data").Item("member").Count()

p.Item("data").Item("member")(I).Item("name")

Next I

End if


Hope this article help you.

Download Source Code API Call VB 6 here 

Software :

Microsoft Visual basic 6.0

JSON Parser  Class Library

Operating System : 

Windows 10 Pro


related links :

Labels: , ,

Saturday, August 20, 2022

Aplikasi Antrian Penjemputan Anak Sekolah berbasis RFID

Simple Student Pickup System


Kali ini saya akan sharing mengenai aplikasi sederhana yang sudah saya buat. Aplikasi ini adalah solusi untuk masalah yang timbul ketika terjadikan penumpukan antrian kendaraan atau mobil pada saat murid murid di sebuah sekolah pulang dan dijemput oleh orang tua dengan menggunakan mobil. Masalah tersebut timbul karena pada saat orang tua / penjemput datang, si murid yang bersangkutan belum siap  di titik penjemputan sehingga penjemput / mobil harus menunggu murid tersebut.  Atau murid tesebut tidak tahu bahwa orang tua atau penjeput sudah datang. Kalapun tahu misalnya dengan banyaknya antrian penjemput, murid tidak tahu antrian urut berapa mobil yang akan menjemput dia, sehingga akan terjadi waktu menunggu yang cukup lama yang menyebabkan kemacetan.

Hal ini tidak akan terjadi atau jarang terjadi jika sekolah tersebut mempunyai lokasi atau luas lahan yang ideal, akan tetapi jika sekolah tersebut berada di tengah kota atau di dekat jalan raya yang ramai tentu saja akan membuat kemacetan yang cukup panjang.

Nah,  oleh karena itu dengan aplikasi sederhana ini, maka masalah itu bisa terpecahkan. Aplikasi yang saya buat cukup sederhan dan saya mengusahakan less code alias minim baris kode. Aplikasi ini saya buat menggunakan Microsoft Visual basic 6.0 kemudian dikombinasi dengan database server MySQL dan Google Data Studio. Mungkin kalau boleh dibilang dibanding aplikasi yang ada di pasaran, ini aplikasi yang paling sederhana tapi bisa memecahkan masalah yang ada.

Aplikasi ini terdiri dari 3 bagian / modul :

  1. Program pembaca RFID ( RFID reader ) yang saya buat dari Visual Basic 6.0
  2. Database Server ( MySQL ) di Web Server.
  3. Google Data Studio untuk menampilkan antrian murid yang akan dijemput.


Mifare USB RFID Reader


Cara kerja program :

  1. Pertama Aplikasi pembaca RFID akan menerima inputan dari RFID reader yang berupak kode unit kartu RFID atau sejenisnya ( bisa dalam bentuk E-KTP, SIM, atau Kartu RFID dari berbagai macam merk ). Kebetulan RFID reader yang saya gunakan adalah Mifare yang bisa didapatkan atau anda beli secara online hanya seharga ratusan ribu.

    Kemudian kode unik ini saya sambungan dengan database siswa, jadi setiap kartu atau beberapa kartu RFID bisa digunakan oleh satu kode siswa ( many to one relationship ). Hal ini mungkin terjadi jika yang menjemput siswa tersebut bisa dari ayah, ibu atau memang ada driver / penjemput khusus. 
  2. Setelah terbaca maka aplikasi akan mengecek apakah kode kartu tersebut yang sudah masuk database atau belum dan merujuk pada kode siswa yang ada jika tidak ada maka kartu akan ditolak. Tetapi jika ada maka dicek apakah kode murid tersebut sudah masuk dalam tabel antrian atau belum, jika belum maka aplikasi akan menambah record/data murid tersebut ke tabel antrian. Jika sudah maka posisi-nya adalah menghapus data murid tersebut di tabel antrian, agar tidak muncul lagi di antrian.
  3. Kemudian di sisi murid atau guru atau pihak sekolah, bisa melihatnya dari aplikasi Google Data Studio yang sudah berbentuk web based. Sehingga bisa dilihat di laptop, televisi,Smartphone, PC atau sejenisnya hanya dengan membagikan link dan menggunakan browser.

    Tampilan di Google Data Studio ini bisa kita setting untuk refresh data per 10, 20 detik atau berapapapun sesuai kebutuhan. Tampilan di Google Data Studio adalah berbentuk List berisi kolom Nama Murid, Kelas dan bisa ditambah lagi sesuai kebutuhan.
Google Data Studio


Main Goal atau Tujuan Utama dari aplikasi ini adalah “ Students Waiting for the Cars, Not Cars Waiting for the Students ” . Sehingga tidak terjadi penumpukan antrian mobil / kendaraan yang akan merugikan banyak pihak. Dengan aplikasi sederhana ini semoga bisa membuat efek yang besar di kehidupan kita sehari hari.

Hal yang bisa dikembangkan adalah aplikasi mobile untuk membaca RFID, sehingga kita tidak perlu membangun pos berisi komputer dan RFID reader serta jaringan internet untuk mengirim data ke database server. Karena terkadang tidak semua sekolah mempunyai lokasi yang ideal untuk membangun infrastruktur tersebut. Sehingga petugas cukup membawa smartphone untuk membaca kartu dari penjemput dan hanya digunakan pada saat anak sekolah pulang,

Semoga tulisan ini bisa membuat inspirasi bagi banyak orang.


Software :

Microsoft Visual Basic 6.0

Google Data Studio

Windows 10

Hardware :

Mifare RFID Reader USB Plug and Play

PC atau Laptop  yang ditempatkan di titik masuk dan penjemputan.


Labels: , , , ,

Monday, September 13, 2021

Solusi Run-time error Error '50003' : Unexpected error

 

Pesan Error : Run-time error 50003 : Unexpected error

Jika anda menemui error yang sama ketika menjalankan aplikasi yang dibangun dengan Microsoft Visual Basic 6.0. Mungkin pengalaman saya bisa menjadi solusi bagi anda.

Belum lama ini saya membangun aplikasi dengan bantuan Visual Basic 6.0, mungkin agak jadul yang untuk tahun 2021 tapi itu menjadi tantangan tersendiri. Pada saat dijalankan di Windows 7 32 bit dan Windows 10 64 bit, program tersebut aman aman saja, tetapi ketika di-deploy di Windows 7 64 bit, aplikasi jalan, tetapi pada form tertentu muncul Error yaitu “ Run-time error ‘50003’: Unexpected error “ seperti gambar di bawah ini:


Akhirnya saya browsing di internet mengenai error tersebut, munculah beberapa solusi yang ditawarkan oleh beberapa artikel antara lain :

  1. Meregister ulang file comctl32.ocx, comdlg32.ocx menggunakan perintah “regsvr32 C:\Windows\SysWOW64\comctl32.ocx” dan “regsvr32 C:\Windows\SysWOW64\comdlg32.ocx”, hasilnya nihil alias tetap error.                                     
    regsvr32 comctl32.ocx

  2. Meng-copy comctl32.ocx dan comdlg32.ocx dari komputer development ( Windows 10 64 bit ) ke komputer tujuan ( Windows 7 64 bit) hasilnya juga nihil.
  3. Meng-copy semua file ocx yang diperlukan dalam project ke direktori C:\Windows\SysWOW64\ komputer tujuan kemudian meregister ulang menggunakan regsvr32 juga tidak menghasilkan solusi.
  4. Menjalankan aplikasi dengan terlebih dahulu, klik kanan kemudian Run as administrator. Hasilnya juga nihil alias tetap error.
Run as administrator

Akhirnya setelah mencoba berbagai solusi dan trial and error yang tidak bisa saya tuliskan disini. Solusinya adalah mengganti icon form dengan icon default visual basic


Untuk masalah icon ini ada beberapa kemungkinan yaitu icon dengan dimensi tertentu akan bermasalah di Windows 7 64 bit , karena jika aplikasi tersebut dijalankan di Windows 7 32 bit aman aman saja.

Anda mungkin bisa mencoba beberapa pilihan icon dengan resolusi beragam jika ingin riset kecil kecilan dan hasilnya  bisa dishare disini. Tetapi solusi mengganti icon form menjadi icon default Visual Basic 6.0 membuat masalah saya menjadi SOLVED.


Semoga bermanfaat.


Software :

Microsoft Visual Basic 6.0

Operating System :

Microsoft Windows 7 32 bit

Microsoft Windows 7 64 bit

Microsoft Windows 10 64 bit

Labels: , , , ,

Friday, October 12, 2018

Cara Mengetahui Password Pada Aplikasi VB

Sneakers : Film buatan tahun 1992 tentang sekelompok hacker, salah satu film favorit.

Kali ini saya akan berbagi ilmu, tentang cara mengetahui atau membongkar password aplikasi yang menempel pada file executable (.exe) yang dibuat menggunakan Visual Basic 6. Kasus yang akan saya terangkan di sini adalah kasus nyata. Yaitu membongkar aplikasi POS ( Point Of Sales ) yang cukup terkenal. Oleh karena itu ada beberapa data yang saya samarkan karena masalah etika, saya hanya ingin berbagi ini untuk menambah pengetahuan, bukan untuk mengumbar kelemahan aplikasi buatan orang lain. Nanti saya akan berbagi trik juga agar teknik yang saya terangkan ini tidak bisa /sulit digunakan untuk membongkar password pada file exe, tentu saja teknik ringan saja, bukan teknik tingkat tinggi.

Sebenarnya saya tidak ada rencana atau proyek khusus untuk membongkar password, hanya perusahaan tempat saya bekerja mempunyai beberapa restoran yang memakai aplikasi POS dari pengembang software lokal. Pengembang aplikasi POS ini jika saya lihat portofolio-nya sudah lumayan banyak digunakan di Indonesia. Karena personil IT yang sebelumnya bertugas di divisi restoran resign, sehingga saya ditugaskan untuk membackup troubleshooting aplikasi POS tersebut. Aplikasi ini lumayan bagus, fiturnya juga lumayan lengkap, ada menu Front Office yang GUI-nya sudah mendukung pemakaian dengan touch screen, kemudian ada menu Kitchen, Back Office, dan masih banyak lagi. Aplikasi ini menggunakan database server MySQL. Kemudian saya menanyakan atasan saya, apakah kita diberi password database-nya? Dia mengatakan kita tidak diberi password database. Tiba - tiba indra laba laba saya bergetar hebat, naluri hacker muncul alias rasa ingin ngintip password muncul. Dari sinilah timbul keinginan saya untuk menjebol username dan password database aplikasi ini. Berikut akan saya terangkan langkah langkah saya dalam membobol/menjebol/menembus atau apapun istilahnya. Beberapa langkah saya buat samar, karena saya sebagai programer juga tidak ingin aplikasi saya dijebol kemudian diperbanyak tanpa sepengetahuan saya. Programmer juga butuh makan :).

Hal pertama yang saya lakukan adalah mengendus/sniff user database yang dikirimkan oleh aplikasi ke server, pertama saya gunakan aplikasi WireShark. Hanya karena tampilanya terlalu rumit akhirnya saya gunakan aplikasi Cain and Abel yang lebih "user friendly". Dari aplikasi ini saya mendapatkan username database MySQL yang digunakan aplikasi POS ini. Awalnya saya berharap mendapatkan username dan password, akan tetapi password-nya menggunakan hashing atau memang tidak terlacak oleh aplikasi Cain and Abel seperti terlihat pada gambar di bawah.

Cain and Abel - Sniffer



Sebagai tambahan informasi, kode hashing sendiri tidak bisa di-decode balik untuk menghasilkan string password. Tidak seperti ketika kita mengkodekan password misal huruf A menjadi 1, huruf B menjadi 2. Yang bisa dilakukan adalah mengecek hasil kode hashing yang kita generate apakah sama dengan hasil kode hashing yang ada, jika sama maka password kita benar. Dan tentu saja ini memakan waktu yang sangat lama. Pada aplikasi Cain and Abel fasilitas Cracking ini ada.

Cain and Abel - MySQL Hashes


Brute Force Attack - Jika password panjang bisa bertahun tahun lama-nya

Seteleh ketemu, kemudian saya mencoba crack menggunakan aplikasi Cain and Abel hanya tentu saja ini memakan waktu lama, akhirnya saya memutuskan untuk menggunakan teknik lain yaitu membongkar aplikasi POS-nya. Pertama saya cek aplikasi POS ini dibuat dengan menggunakan bahasa pemrograman apa, kemudian baru saya gunakan aplikasi decompiler untuk melihat isinya. Memang saya tidak akan mengecek keseluruhan program, tetapi hanya mencari string password dengan modal username yang sudah saya dapatkan lebih dahulu. Hal ini tentu saja untuk mempercepat pencarian, bisa saja anda mencari langsung dari hasil decompiler tersebut, hanya itu memakan waktu dan anda juga harus mempunyai pengetahuan yang cukup mengenai bahasa pemrograman tersebut.

Setelah aplikasi saya jalankan, saya menggunakan command tasklist untuk mengecek aplikasi POS ini dibuat dengan bahasa pemrogramana apa.Yaitu kita masuk pada command prompt, kemudian kita ketik tasklist / m, lalu kita cek aplikasi POS tersebut load modul apa saja.

tasklist / m - untuk mengecek file exe

Pada gambar di atas terlihat aplikasi POS tersebut menggunakan modul MSVBVM60.DLL, yang artinya aplikasi POS ini dibuat menggunakan bahasa pemrograman Visual Basic versi 6.0. Kemudian berikutnya yang saya lakukan adalah membongkar file exe tersebut dengan VB Decompiler. Ada banyak aplikasi VB decompiler silakan anda mencari sendiri di internet dengan bantuan google tentu saja. Setelah muncul hasil decompiler, maka langkah saya berikutnya adalah mencari string username yang sebelumnya sudah saya temukan, dan tentu saja beberapa detik kemudian keajaiban itu muncul, string password nongkrong dengan manisnya dibawah string username!

VB Decompiler - P32Dasm

Dengan mendapatkan akses full ke database tentu saja ini membuat level anda menjadi setingkat dewa, artinya anda bisa membuat password superuser aplikasi untuk mendapatkan fitur penuh dari aplikasi tersebut.Teknik ini tidak akan saya bahas karena saya menghargai si pembuat software POS tersebut.

Semoga pengalaman saya di atas bisa menambah pengetahuan teman - teman. Dan semoga ilmu atau pengetahuan tersebut digunakan untuk hal yang baik. Beberapa item memang saya samarkan karena saya menghargai si pembuat software tersebut. Beberapa tips dari saya untuk kasus di atas adalah :

  1. Usahakan jangan membuat kode pemrograman yang menuliskan username dan password database pada file EXE, bisa ditaruh di file lain misal file .DLL, atau username dan password dalam kondisi dienkripsi. Menuliskan atau membuat kode yang berisi username dan password default database , akan gampang sekali dijebol oleh hacker kelas teri.
  2. Gunakan kode bahasa pemrograman dalam bentuk rumus  untuk mengenerate password sehingga tidak mudah dibaca kodenya meskipun di-decompiler.
  3. Bisa juga gunakan Anti Decompiler untuk mencegah teknik di atas.

Istilah hashing, crack password, MD5, RSA, Kriptografi dan sebagainya selalu mengingatkan saya pada dosen saya sewaktu kuliah S1 yang berasal dari Jerman yaitu Dr. Volker Müller. Sewaktu saya kuliah dia mengajar mata kuliah Keamanan Komputer. Meskipun nilai saya tidak terlalu bagus pada mata kuliah dia, tetapi pengajarannya selalu menarik bagi saya, meskipun dia orang Jerman tetapi bahasa Indonesianya sudah cukup  bagus  dan lancar. Kadang juga dia sering membuat joke, jika anda orang asing yang belajar bahasa Indonesia dan bisa membut joke dalam bahasa Indonesia, artinya level anda sudah mahir dalam bahasa indonesia. Juga dia menceritakan bagaimana dia seorang Linux Freak, cara menebak password sekumpulan data nomor, dan cerita dia menjebol keamanan salah satu  bank dan masih banyak lagi. Terima kasih Pak Volker Müller atas ilmunya.

Dr Volker Müller

Semoga bermanfaat!

Labels: , ,

Thursday, May 25, 2017

Multiple-step operation generated errors. Check each status value.


Kali ini saya akan sharing ringan untuk pengecekan error yang muncul pada Ms Visual Basic 6.
Error yang muncul kali ini adalah "Multiple-step operation generated errors. Check each status value." Setelah saya trace masalahnya adalah karena besarnya text yang akan dimasukan ke tabel lebih besar dari besar field yang ada pada database. Berikut potongan source code-nya.

oRS.Open "SELECT TOP 1 * FROM t_kuesioner1", oConn, adOpenDynamic, adLockPessimistic
oRS.AddNew
oRS.Fields("keterangan").Value = Text1(1).Text 

.......
oRS.Update
oRS.Close


Nilai Text1(1).Text lebih panjang dari field keterangan di tabel t_kuesioner1




Oleh karena itu solusinya adalah, field keterangan ditambah length secukupnya, atau dibatasi batas inputan pada text1(1).text sehingga tidak lebih panjang dari lebar field-nya.

Semoga bermanfaat.







Labels: , ,

Thursday, January 26, 2017

Dual Connection


Kali ini saya akan membagikan tips singkat, bagaimana membuat suatu aplikasi database menggunakan Visual Basic 6 yang terkoneksi dengan 2 database berbeda. Kasusnya adalah aplikasi ini bisa digunakan "offline" dan "online". "Offline" yang dimaksudkan di sini adalah aplikasi dibawa secara mobile menggunakan laptop. Kemudian posisi "Online" adalah aplikasi terkoneksi dengan database pusat ketika laptop tersebut ada pada jaringan kantor pusat. Pada saat "online" aplikasi bisa melakukan sinkronisasi data ( upload dan download ) sehingga data di kedua database sama. Database yang digunakan adalah Ms SQL Server 2000 untuk server pusat dan Ms Access untuk server lokal ( offline ). Database Ms Access digunakan karena instalasi yang sederhana, tidak serumit instalasi Ms SQL Server. Berikut langkah - langkah yang perlu dilakukan :

1. Pertama yang kita buat adalah connection string untuk kedua engine database tersebut.

Untuk SQL Server :
LogonStr = "PROVIDER=SQLOLEDB.1;DATA SOURCE= " & IPServer & ";initial catalog= " & DatabaseName & " ;User ID=user;Password=password;"

Untuk Ms Access :
LogonStr2 = "PROVIDER=Microsoft.ACE.OLEDB.12.0; Data Source=" & App.Path & "\databasename.accdb"

2. Engine SQL pada kedua database tersebut ada beberapa perbedaan, oleh karena itu ada beberapa penulisan query ( SQL ) yang harus disamakan. Karena kebetulan kedua database dibuat oleh Microsoft maka tidak terlampau sulit untuk membuat penyeragaman.Salah satunya adalah SQL untuk menghapus record :

Jika pada SQL Server cukup : DELETE table_name WHERE..
di Ms Access harus menggunakan FROM : DELETE FROM table_name WHERE.., maka anda harus menambahkan FROM pada semua SQL untuk menghapus record.

Juga pada SQL yang menggunakan INNER JOIN lebih dari table, pada SQL Server kita bisa langsung membuat query tambah separator seperti dibawah ini :

SELECT  *
FROM t_table_a aa
INNER JOIN t_table_b bb ON bb.code_b = aa.code_a
INNER JOIN t_tabel_c cc ON cc.code_c = aa.code_a

Pada Ms Access :

SELECT  *
FROM   (( t_table_a aa
INNER JOIN t_table_b bb ON bb.code_b = aa.code_a)
INNER JOIN t_tabel_c cc ON cc.code_c = aa.code_a)

3. Sinkronisasi.
Pada sinkronisasi, perlu diperhatikan aturan sikronisasi. misal aturannya untuk data master di server tidak boleh dihapus hanya boleh ditambah, maka pada saat sinkronisasi dari lokal ke server hanya bisa menambah tidak boleh menghapus, kemudian baru mengambil data master dari server yang baru. Dan masih banyak lagi, tergantung kebutuhan masing masing.

Kebetulan untuk Ms Access yang saya gunakan adalah Ms Access 2007, maka dibutuhkan driver untuk koneksi database bisa download pada link di bawah ini :

https://www.microsoft.com/en-us/download/details.aspx?id=23734
Office 2007


Tools :
Visual Basic 6.0
SQL Server 2000
Ms Access 2007


Labels: , , ,

Wednesday, January 13, 2016

Make it Simple!


Salah satu keuntungan menjadi orang yang mengerti IT adalah bisa membuat pekerjaan orang lain menjadi lebih mudah. Dengan membuat aplikasi komputer, kita bisa melakukan banyak hal yang bisa mempermudah pekerjaan orang lain. Salah satunya saya ambil dari saya sendiri. Belum lama ini saya dimintai tolong untuk membantu rekan saya yang berkerja di salah satu LSM. LSM ini sebelumnya sudah mempunyai sebuah aplikasi yang dibuat oleh salah satu vendor. Setelah program jadi, dan sudah berjalan maka vendor ini menjadi sulit dihubungi. Vendor ini meninggalkan sebuah program dan cara instalasi program. Akan tetapi cara instalasinya begitu rumit, sehingga ketika sebuah komputer akan diinstall program tersebut, maka user atau bahkan teman saya sangat kesulitan karena cara instalasinya yang cukup rumit bahkan bagi seorang programmer sekalipun. Akhirnya dia meminta bantuan saya untuk membuat installer atau bahasa "keren"nya itu dibuatkan single click installer.
Sebenarnya saya sendiri tidak berniat membuat installer dengan satu tombol saja, akan tetapi saya teringat apa yang dilakukan oleh Albert Einstein yaitu membuat rumus yang sangat sederhana tentang relativitas yaitu E=mc2 dari sesuatu yang seharusnya sangat rumit. Akhirnya dengan riset sederhana dan bantuan mbah Google tentu saja, aplikasi single installer akhirnya menjadi kenyataan.
Apllikasi peninggalan vendor tersebut adalah sebuah aplikasi web based dengan database PostgreSQL, dan Framework PHP Codeigniter. Aplikasi ini diinstall dikomputer lokal di hampir seluruh lokasi di Indonesia, jadi bisa dibayangkan jika komputernya bermasalah dan harus install ulang maka menjadi mimpi buruk bagi team IT karena tingkat kesulitan instalasinya.

Single Click Installer  yang saya buat mempunyai beberapa langkah yang saya rangkum menjadi satu, berikut potongan source code Visual Basic 6 yang saya buat :

Private Sub Command3_Click()
    

    'create registry for odbc driver
    CreateRegistry
   
    'copy file odbc
    CopyODBCFiles
   
    'sp folder and client folder to htdocs
    CopyWebFiles
   
    'copy php ini ( short tag setting )
    CopyPHPINI
   
    'copy pg_hba.conf
    CopyPostgreFiles
   
    'create db
    CreateDB
   
    'create batch file & restore db
    CreateBatchFile
   
    'load url
    LoadURL
   
End Sub


1. Pertama adalah saya meng-create registry Windows untuk odbc driver PostgreSQL.
2. Mencopykan file ODBC PostgreSQL ke driver lokal.
3. Mencopykan file aplikasi web ke komputer lokal
4. Setting short tag pada php.ini
5. Setting pg_hba.conf untuk restore database PostgreSQL.
6. Membuat database kosong.
7. membuat batch file untuk menjalankan restore database, setelah batchfile jadi langsung dijalankan.
8. Setelah semua tersetting, buka aplikasi melalui browser secara otomatis.

Sebelum Single Installer ini dijalankan, saya sudah menjalankan installer untuk web server dan PostgreSQL dari bitnami
Anda tidak perlu menjadi jenius seperti Albert Einstein untuk menyederhanakan sesuatu yang rumit, yang penting adalah keinginan atau niat untuk menyederhanakan sesuatu yang rumit tersebut. Semoga bisa menjadi inspirasi bagi rekan rekan. 

Labels: , ,

Sunday, February 08, 2015

Visual Basic with Ms Excel as Database

Belum lama ini, saya seorang rekan meminta bantuan dibuatkan sebuah program kecil, yaitu progam untuk membuat cetakan invoice dari file excel. Awalnya saya ingin membuatkan program kecil yang paten menggunakan Visual Basic dan MySQL sebagai database. Tetapi karena keterbatasan waktu saya memutuskan untuk memakai VBA, agar embedded langsung dengan file excel. Tiba - tiba punya ide untuk membuat program dari Visual Basic tetapi menggunakan file Excel ( .xls atau .xlsx ) sebagai database. Setelah browsing kesana kemari akhirnya menemukan caranya, berikut dasar - dasar pemrograman Visual Basic dengan Microsoft Excel.

Pertama yaitu membuat Connection String, yaitu menggunakan provider Jet OLEDB 4.0, pada Visual Basic - References ,saya menggunakan Microsoft ActiveX Data Object 2.6, berikut syntax connection string.


  
    Set Conn = New ADODB.Connection
    With Conn 
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Data Source=" & App.Path &; _
         "\file.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1;"""
        .CursorLocation = adUseClient
        .Open
    End With 
Option HDR = Yes, artinya pada kolom pertama pada worsheet yang dipilih akan menjadi nama field / header.Kemudian Option IMEX=1 yaitu menerima data dari kolom excel dengan berbagai tipe data. Perlu diingat bahwa column di Excel berbeda dengan field pada table di file database dimana 1 field hanya mempunyai 1 tipe data, sedangkan di file excel bisa banyak tipe.
Kemudian untuk penggunakan Query / SQL standart, hanya perlu diingat pengganti table pada Excel adalah worksheet, contoh syntax penggunaan SQL ada di bawah ini :


 
    strquery = "SELECT * FROM [Sheet1$B1:B1124] WHERE COMPONENTS LIKE '%PANEL%'"
    oRS.Open strquery, oConn, adOpenDynamic, adLockReadOnly
    If Not oRS.BOF Then
        Do While Not oRS.EOF
        
        If Trim(oRS.Fields(0).Value) <> "" Then
            List2.AddItem vbTab & oRS.Fields(0).Value
        End If
        
        oRS.MoveNext
        Loop
    End If
    oRS.Close

Pada syntax SQL di atas, table digantikan dengan range baris data yaitu dari baris B1 s/d B1124, kemudian field COMPONENTS adalah salah satu kolom pada file Excel yang akan dicari datanya. Jika anda mendapatkan Error "No value given for one or more required parameters", maka kemungkinan adalah kolom / field yang anda cari setelah syntax WHERE, itu tidak termasuk dalam baris data setelah syntax FROM, jadi disini anda perlu lebih teliti.
Kemudian untuk membuat query dengan banyak nilai kosong / null, bisa menggunakan sintak seperti dibawah ini:
 
    sSQL = " SELECT [CODE], " _
           " IIF([COMPONENTS] is null, ' ', [COMPONENTS]) AS [COMPONENTS], " _
           " FROM [Sheet1$A1:L1124] " _
           " WHERE CODE = '" & Code_Components & "'"
    oRs.Open sSQL, oConn, adOpenStatic
    If Not oRs.BOF Then
        'statement
    End If
    oRs.close
Awalnya saya ingin membuat file Excel tersebut untuk  menyimpan data Invoice, tapi hal itu membuat file Excel menjadi bengkak ukuran-nya. Akhirnya saya memutuskan program ini hanya sebagai mesin pencetak invoice saja, sesuai dengan permintaan teman saya, jadi tidak menyimpan hasil transaksi invoice. Semoga Bermanfaat bagi rekan - rekan.

tools :
Microsoft Visual Basic 6.0
Microsoft Excel 2007

Labels: , , , ,